2월 1일 (월)

context api를 배우다

Posted by Yan on February 1, 2021

오늘 한 일

  • Navigation/SearchItem의 검색 키워드를 어떻게 App의 Context API로 올려보낼지 고민중이었는데, 중첩 context로 전달할 수 있다는 것을 알게 되었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import Profile from "./Profile";
import React, { useState } from "react";

export const UserContext = React.createContext({ username: "", helloCount: 0 });
//하위 컴포넌트의 콘텍스트 데이터
export const SetUserContext = React.createContext(() => {});
//데이터를 수정하는 함수를 전달하기 위한 콘텍스트

function App() {
  const [user, setUser] = useState({ username: "Ariana", helloCount: 0 });
  //사용자 데이터를 하나의 상탯값으로 관리. 상태값변경 함수 setUser는 SetUserContext로 전달
  return (
    <div>
      <SetUserContext.Provider value={setUser}>
        <UserContext.Provider value={user}>
          <Profile />
        </UserContext.Provider>
      </SetUserContext.Provider>
    </div>
  );
}

export default App;

Profile컴포넌트 안의 Greeting

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import React from "react";
import { UserContext, SetUserContext } from "./App";

function Greeting() {
  return (
    <SetUserContext.Consumer>
      {(setUser) => (
        <UserContext.Consumer>
          {({ username, helloCount }) => (
            <>
              <p>{`${username}님 안녕하세요`}</p>
              <p>{`인사 횟수: ${helloCount}`}</p>
              <button
                onClick={
                  () => setUser({ username, helloCount: helloCount + 1 })
                  //App컴포넌트로부터 전달된 setUser함수 이용. 버튼 클릭시 콘텍스트 데이터 수정
                }
              >
                인사하기
              </button>
            </>
          )}
        </UserContext.Consumer>
      )}
    </SetUserContext.Consumer>
  );
}

export default Greeting;

위의 코드는 helloCount속성만 변경할 때도 사용자 데이터를 만들어서 setUser함수에 입력해야한다는 단점이 있는데, 이를 useReducer로 개선할 수 있다고 한다. 이제 useReducer를 사용해봐야겠다.