State Lifting

wony·2022년 4월 2일
0

state 끌어올리기

자식컴포넌트와 자식컴포넌트간에 state를 주고받으려면 어떻게 해야할까?

react의 데이터 방향은 단방향이기 때문에 형제간 props로 state를 넘기는 것은 불가능하다


해결방법은...!

state를 부모컴포넌트 에게 선언하고
그 state를 자식컴포넌트에서 props해와서 사용한다

(말로는 참 쉽지만 직접해보면 여러 파일이 얽혀있어 쉽지 않았다는...;;)

자식이 부모의 state를 변경하고 싶다면...?
setState를 자식컴포넌트로 props해와서 자식컴포넌트에서 함수를 통해서 값을 바꿔준다면 부모의 state 값을 변경할 수 있다


나의 오류 사례

pagination을 적용해서 페이지 번호를 누르면 원하는 페이지로 이동해 그 페이지의 데이터를 불러와 boardList에 띄워주는 기능을 구현하려 했었다

하지만 아무리 페이지 번호를 눌러도 이동하지 않는 오류 발생,,,(멘붕)

// 게시물목록과 등록버튼있는 페이지

import ListBoardPage from "../../src/components/units/board/list/BoardWrite.container";
import Pagination from "../../src/components/commons/pagination/pagination.container";
import {
  FETCH_BOARDS,
  FETCH_BOARDS_COUNT,
} from "../../src/components/units/board/list/BoardWrite.queries";
import { useQuery } from "@apollo/client";
import {
  IQuery,
  IQueryFetchBoardsArgs,
  IQueryFetchBoardsCountArgs,
} from "../../src/commons/types/generated/type";

export default function ListPage() {
  const { data, refetch } = useQuery<
    Pick<IQuery, "fetchBoards">,
    IQueryFetchBoardsArgs
  >(FETCH_BOARDS);
  const { data: dataBoardsCount } = useQuery<
    Pick<IQuery, "fetchBoardsCount">,
    IQueryFetchBoardsCountArgs
  >(FETCH_BOARDS_COUNT);

  const lastPage = Math.ceil(Number(dataBoardsCount?.fetchBoardsCount) / 10);

  return (
    <>
      <ListBoardPage data={data} />
      <Pagination refetch={refetch} lastPage={lastPage} />
    </>
  );
}

리스트를 띄워주는 페이지
여기서 data를 ListBoardPage로 보내줬다

import { useRouter } from "next/router";
import BoardListUI from "./BoardWrite.presenter";
import { MouseEvent } from "react";
import { IBoardListUIProps } from "./BoardWrite.types";
import { useQuery } from "@apollo/client";
import { FETCH_BOARDS } from "./BoardWrite.queries";

// 쿼리 문에 페치보드카운트 추가해주어야한다

export default function ListBoardPage(props: IBoardListUIProps) {
  const router = useRouter();
  const { data: scrollData, fetchMore } = useQuery(FETCH_BOARDS);

  const onClickMoveToBoardNew = () => {
    router.push("/boards/new");
  };

  const onClickMoveToBoardDetail = (event: MouseEvent<HTMLDivElement>) => {
    if (event.target instanceof Element)
      router.push(`/boards/${event.target.id}`);
    // 이벤트태그의 자식이면 id를 선언해줘
  };

  const onLoadMore = () => {
    if (!scrollData) return;

    fetchMore({
      variables: { page: Math.ceil(scrollData.fetchBoards.length / 10) + 1 },
      updateQuery: (prev, { fetchMoreResult }) => {
        if (!fetchMoreResult.fetchBoards)
          return { fetchBoards: [...prev.fetchBoards] };
        return {
          fetchBoards: [...prev.fetchBoards, ...fetchMoreResult.fetchBoards],
        };
      },
    });
  };

  return (
    <BoardListUI
      data={props.data}
      onClickMoveToBoardNew={onClickMoveToBoardNew}
      onClickMoveToBoardDetail={onClickMoveToBoardDetail}
      onLoadMore={onLoadMore}
    />
  );
}

해결!
data={data}를
data={props.data}로 바꿔주었더니 바로 작동...
이것때문에 6시간동안 고민한 나자신,,
props의 중요성을 느낀하루였다

profile
무럭무럭 성장중🌿

0개의 댓글