App.js
<Provider store={store}>
<GlobalStyle />
<Router />
</Provider>
위처럼 감싸줌
store.js
import { configureStore, createSlice } from '@reduxjs/toolkit';
let inputKeyword = createSlice({
name: 'inputKeyword',
initialState: { keyword: '' },
reducers: {
changeKeyword(state, action) {
state.keyword = action.payload;
},
},
});
export let { changeKeyword } = inputKeyword.actions;
let searchModalStatus = createSlice({
name: 'searchModalStatus',
initialState: false,
reducers: {
openSearchModal() {
return true;
},
closeSearchModal() {
return false;
},
},
});
export let { openSearchModal, closeSearchModal } = searchModalStatus.actions;
// searchIconStatus 0:돋보기 / 1:X / 2:공백
let searchIconStatus = createSlice({
name: 'searchIconStatus',
initialState: 0,
reducers: {
switchSearchIcon(state, action) {
return action.payload;
},
},
});
export let { switchSearchIcon } = searchIconStatus.actions;
export default configureStore({
reducer: {
inputKeyword: inputKeyword.reducer,
searchModalStatus: searchModalStatus.reducer,
searchIconStatus: searchIconStatus.reducer,
},
});
위처럼 이름과 초기 상태와 상태를 수정할 수 있는 리듀서, 이름 등을 설정해줌
header.js
import { useDispatch, useSelector } from 'react-redux';
import {
closeSearchModal,
openSearchModal,
switchSearchIcon,
changeKeyword,
} from '../../../store';
위처럼 리듀서와 useDispatch, useSelectore를 임포트 해줌
let dispatch = useDispatch();
let searchModalStatus = useSelector(state => state.searchModalStatus);
let searchIconStatus = useSelector(state => state.searchIconStatus);
useDispatch는 리듀서 같은 수정할 수 있는 함수를 사용할 수 있는거임
useSelector는 초기 세팅임.
<Logo
onClick={() => {
navigate('/');
dispatch(closeSearchModal());
dispatch(switchSearchIcon(0));
}}
/>
위와 같이 dispatch로 임포트한 리듀서들을 사용함.
그럼 전역 변수들이 바뀜
[
<FiSearch
className="SearchIcon"
onClick={() => {
dispatch(openSearchModal());
dispatch(switchSearchIcon(1));
dispatch(changeKeyword());
}}
key="0"
/>,
<IoClose
className="SearchIcon"
onClick={() => {
dispatch(closeSearchModal());
dispatch(switchSearchIcon(0));
dispatch(changeKeyword());
}}
key="1"
/>,
<div key="3" />,
][searchIconStatus]
위와 같이 dispatch로 리듀서들을 사용함.
전역 변수 수정하는거임.
{searchModalStatus && <ModalLayout />}
위와 같이 전역 변수들을 useSelector들로 사용이 가능함.
[
<FiSearch
className="SearchIcon"
onClick={() => {
dispatch(openSearchModal());
dispatch(switchSearchIcon(1));
dispatch(changeKeyword());
}}
key="0"
/>,
<IoClose
className="SearchIcon"
onClick={() => {
dispatch(closeSearchModal());
dispatch(switchSearchIcon(0));
dispatch(changeKeyword());
}}
key="1"
/>,
<div key="3" />,
][searchIconStatus]
위와 같이 배열로 쓸 수도 있음. searchIconStatus 전역 변수에 따라서 다른 렌더링
Mobx보다 훨씬 더 어렵고 쓸 데 없는 듯함