Redux (state) -> React의 state는 쓰지 않아도 됨.
장점: 안정성, state 통제 용이성
state = {
isLoggedIn :false,
user: {},
...
} -> store
useSelector
: React의 state
와 같다고 생각하면 된다.useDispatch
: React의 setState
와 같다고 생각하면 된다.ex) 로그인 액션
ex) 로그인 액션 dispatch
ex) 로그인액션 dispatch 시 -> isLoggedIn state를 true로
const reducer = (state = initialState, action) => {
switch (action.type) {
case LOG_IN: {
return {
...state,
isLoggedIn: true,
user: action.data,
};
}
case LOG_OUT: {
return {
...state,
isLoggedIn: false,
user: {},
};
}
default:
return {
...state,
}; // default도 spread 문법을 통해 작성
}
};
react-redux
의 useSelector
를 통해 state를 조회할 때, state 내의 여러가지 상태를 객체형태로 한 번에 조회하는 것 보다는 state 내의 각각의 상태를 나누어 주는 것이 좋다.
왜냐하면 객체형태로 한 번에 state를 조회하면 어떤 한 가지 상태만 변화하여도 그 state를 조회하는 컴포넌트가 모두 리렌더링이 되어 성능에 안좋은 영향을 미칠 수 있기 때문이다.
user = {
isLoggedIn: false,
user: {},
};
// 바로 아래처럼 코드를 작성하기 보다는
const { isLoggedIn, user } = useSelector(state => state.user);
// 다음 처럼 하면 최적화 가능
const isLoggedIn = useSelector(state => state.user.isLoggedIn);
const user = useSelector(state => state.user.user);
user state를 useSelector
를 통해 조회
import React, { useEffect } from 'react';
import PostForm from '../components/PostForm';
import PostCard from '../components/PostCard';
import { useSelector } from 'react-redux';
const dummyPost = {
imagePaths: [],
};
const Home = () => {
const { user, isLoggedIn } = useSelector(state => state.user);
const { mainPosts } = useSelector(state => state.post);
return (
<div>
{user ? <div>Login: {user.nickname}</div> : <div>Logout!!</div>}
{isLoggedIn && <PostForm dummyPost={dummyPost} />}
{mainPosts.map(c => {
return <PostCard key={`PostCard${c}`} post={c} />;
})}
</div>
);
};
export default Home;
위의 경우보다는 아래의 경우가 더 최적화가 잘 된 것이다.
import React, { useEffect } from 'react';
import PostForm from '../components/PostForm';
import PostCard from '../components/PostCard';
import { useSelector } from 'react-redux';
const dummyPost = {
imagePaths: [],
};
const Home = () => {
const user = useSelector(state => state.user.user);
const isLoggedIn = useSelector(state => state.user.isLoggedIn);
const { mainPosts } = useSelector(state => state.post);
return (
<div>
{user ? <div>Login: {user.nickname}</div> : <div>Logout!!</div>}
{isLoggedIn && <PostForm dummyPost={dummyPost} />}
{mainPosts.map(c => {
return <PostCard key={`PostCard${c}`} post={c} />;
})}
</div>
);
};
export default Home;