React
React - Userdispatch Context
Starters
2020. 9. 13. 20:01
React - Context API(전역 값 관리)
이전 코드들에서 UserList는 다리 역할만 하고 있음 User 컴포넌트로 onRemove와 onToggle을 전달하기 위해서 UserList컴포넌트에선 쓰지 않지만 내부에 적어줬음 - UserList.js - function UserList( { users, on..
startersdev.tistory.com
이전 글에서 적어놓은 문제해결
- onToggle() 과 onRemove() 를 전역 값으로 관리
-> Context를 통해 할 수 있지만, 함수내에 dispatch부분만 따로 넘겨줄 수 있다.
- App.js -
1. 최상단에 createContext 호출
import React, { useRef, useReducer, useMemo, useCallback, createContext } from 'react';
2. App() 컴포넌트 위에
export const UserDispatch = createContext(null);
function App() {
createContext() 에는 Provider 객체있음
3. 사용
return (
<UserDispatch.Provider value={dispatch}>
<CreateUser
username={username}
email={email}
onChange={onChange}
onCreate={onCreate}
/>
<UserList users={users}
onToggle={onToggle}
onRemove={onRemove}/>
<div>활성 사용자 수: {count}</div>
</UserDispatch.Provider>
);
- UserList.js -
User컴포넌트에서 바로 onToggle, onRemove 사용
1. UserList 컴포넌트에서 JSX, 파라미터에 있던 onToggle, onRemove 제거
User 컴포넌트의 파라미터에서도 제거
function UserList( { users }){
return (
<div>
{
users.map(
(user) => (
<User
user={user}
key={user.id}
/>
)
)
}
</div>
)
}
const User = React.memo(function User({ user }){
const {username, email, id, active} = user;
2. 상단에 useContext, UserDispatch 호출
import React, { useContext } from 'react';
import { UserDispatch } from './App.js';
3. User 컴포넌트에서 바로 dispatch 선언
const User = React.memo(function User({ user }){
const {username, email, id, active} = user;
const dispatch = useContext(UserDispatch); // 이 부분 추가
4. 나머지 부분 수정
const User = React.memo(function User({ user }){
const {username, email, id, active} = user;
const dispatch = useContext(UserDispatch);
useEffect(() => {
console.log(user);
return () => {
console.log('user 값이 바뀌기 전');
console.log(user);
}
}, [user]);
return (
<div>
<b style={{
color: active ? 'green': 'black',
cursor: 'pointer'
}}
onClick={() => dispatch({
type: 'TOGGLE_USER',
id
})}
>
{username}
</b>
<span>({email})</span>
<button onClick={() => dispatch({
type: 'REMOVE_USER',
id
})}>삭제</button>
</div>
);
});