• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Next.js 게시판 nextjs csr 컴포넌트

nextjs csr 컴포넌트

7 글 보임 - 1 에서 7 까지 (총 7 중에서)
  • 글쓴이
  • #93692

    박지율
    참가자
    nextjs csr컴포넌트에서 로딩이 다 완료되었을때 실행되는 함수같은게 없나요.
    처음 페이지에 들어가면 내용이 다 깨져있어서 로딩페이지부터 보이게 하려고
    기본적으로 페이지에 들어갔을때 로딩창이 뜨게 하고
    window.onload실행되면 로딩페이지 display를 none으로 바꿔서 로딩창을 만들었었는데요.
    usestate사용하니까 갑자기 로딩창만 뜹니다... 왜그런거죠?
    아니면 다른 좋은방법이 없을까요
    
    
    "use client";
    import LoadingPage from "../loading";
    import "./style.css";
    import React, { useEffect, useState } from "react";
    export default async function Util({ result, answer }) {
     console.log(answer);
     const onlyone = (checkThis) => {
    const checkboxes = document.getElementsByClassName("q");
    for (let i = 0; i < checkboxes.length; i++) {
    if (checkboxes[i] !== checkThis) {
    checkboxes[i].checked = false;
     }
     }
     };
    useEffect(() => {
    var loading_page = document.getElementById("load");
    //로딩이 완료되었다면 로딩페이지 제거
    // 변수/상수 선언
    const outer = document.querySelector(".outer");
    const innerList = document.querySelector(".inner-list");
    const inners = document.querySelectorAll(".inner");
    var buttonRight = document.querySelector(".button-right");
    var count = 0;
    var IsitCorrect = new Object();
    //다음문제 버튼을 클릭하였을시 실행되는 함수
     buttonRight.addEventListener("click", () => {
    const parentComponent = document.getElementById(count);
    const countCheckbox = parentComponent.querySelectorAll('input[type="checkbox"]');
    let isChecked = false;
    // 모든 체크박스를 반복하며 체크 상태를 확인합니다.
    for (let i = 0; i < countCheckbox.length; i++) {
    if (countCheckbox[i].checked) {
    isChecked = true;
    break; // 하나라도 체크되어 있으면 루프를 종료합니다.
     }
     }
    //하나도 체크되어 있지 않다면
    if (!isChecked) {
    alert("체크박스를 체크하여 정답을 선택하세요!");
     }
    //그렇지 않으면
    else {
    //다음 문제로 넘기기
    currentIndex++;
    currentIndex = currentIndex >= inners.length ? inners.length - 1 : currentIndex;
     innerList.style.marginLeft = `-${outer.clientWidth * currentIndex}px`;
    //체크된 체크박스값 보기
    const checkboxes = document.querySelectorAll('input[type="checkbox"]:checked');
    const checkedValues = Array.from(checkboxes).map((checkbox) => checkbox.value);
    //19번째 문제에 도달했을때, 20번째 문제의 버튼은 '제출'로 보이게 하기
    if (count >= 18) {
     buttonRight.innerText = "제출";
     }
    //마지막 문제까지 제출하면, api post 요청 보내기
    if (count == 19) {
    const quizResult = document.getElementById("result");
     quizResult.style.display = "block";
     loading_page.style.display = "none";
     }
    //체크박스에 입력한 문제가 정답이라면 answer에 1을 넣고, 스코어 추가
    else if (checkedValues == result[answer[count]].a) {
    IsitCorrect["answer" + count] = 1;
     console.log("correct");
     console.log(IsitCorrect);
     }
    //오답시 answer에 0을 넣기
    else {
    IsitCorrect["answer" + count] = 0;
     }
    //카운트 추가
    count++;
     }
     });
    //문제 개수만큼 div박스 늘리기
    let currentIndex = 0;
    if (outer && innerList && inners) {
     inners.forEach((inner) => {
     inner.style.width = `${outer.clientWidth}px`;
     });
     innerList.style.width = `${outer.clientWidth * inners.length}px`;
     }
     }, []);
    return (
    <>
     <div id="result">
     <div className="white-bg">
     <h1>당신의 점수는점입니다.</h1>
     <button>닫기</button>
     </div>
     </div>
     <div className="outer">
     <div className="inner-list">
     {answer.map((a, i) => (
    <div key={a} id={i}>
     <div className="inner">
     <h1 className="question">
     {i + 1}번문제) {result[a].q}
     </h1>
     <div className="contentbox">
     <div className="content">{result[a].c1}</div>
     <input
    type="checkbox"
    value={"1"}
    className="q"
    name={i}
    onChange={(e) => onlyone(e.target)}
    ></input>
     </div>
     <div className="contentbox">
     <div className="content">{result[a].c2}</div>
     <input
    type="checkbox"
    value={"2"}
    className="q"
    name={i}
    onChange={(e) => onlyone(e.target)}
    ></input>
     </div>
     <div className="contentbox">
     <div className="content">{result[a].c3}</div>
     <input
    type="checkbox"
    value={"3"}
    className="q"
    name={i}
    onChange={(e) => onlyone(e.target)}
    ></input>
     </div>
     <div className="contentbox">
     <div className="content">{result[a].c4}</div>
     <input
    type="checkbox"
    value={"4"}
    className="q"
    name={i}
    onChange={(e) => onlyone(e.target)}
    ></input>
     </div>
     <div className="contentbox">
     <div className="content">{result[a].c5}</div>
     <input
    type="checkbox"
    value={"5"}
    className="q"
    name={i}
    onChange={(e) => onlyone(e.target)}
    ></input>
     </div>
     </div>
     </div>
     ))}
     </div>
     </div>
     <div className="button-list">
     <button className="button-right">다음문제</button>
     </div>
     </>
     );
    }
    
    
    		
    	
    #93721

    codingapple
    키 마스터
    https://stackoverflow.com/a/74116794
    document.readyState 로 로드완료 체크하고 로드완료시 로딩중UI 제거합시다 
    
    #93772

    박지율
    참가자
    감사합니다!!!
    #93783

    박지율
    참가자
    document.readyState로 바꿨는데 차이가 없어요 ㅠ
    #93784

    박지율
    참가자
    const onPageLoad = () => {
     loading.style.display = "none";
     };
     document.onreadystatechange = function () {
    if (document.readyState === "complete") {
    onPageLoad();
     } else {
     window.addEventListener("load", onPageLoad, false);
    return () => window.removeEventListener("load", onPageLoad);
     }
     };
    
    
    #93820

    codingapple
    키 마스터
    onPageLoad 함수는 실행되는지 console.log 써보거나  loading.style.display = "none"; 실행하면 UI 안보이는거 맞는지 확인해봅시다
    #93822

    박지율
    참가자
    다 확인해보고 되는거도 봤는데... useState 변수의 변수변경 함수만 쓰면 갑자기 로딩창이 뜹니다...
    그렇게 로딩창이 뜨면 계속 로딩만 떠서 그냥 usestate 포기하고 innertext 사용하고 해결했습니다.
    왜이러는건지 도통 모르겠네요 ㅜ
7 글 보임 - 1 에서 7 까지 (총 7 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠