WEB/Redux
ReactJS에서 Redux 설정
tranzal
2022. 4. 25. 22:02
npm install react-redux로 redux를 추가해 준다.
일단 폴더의 대략적인 구조는 아래 이미지와 같다.
states 폴더에는 state들이 들어있는 폴더이다.
reducers에는 state를 사용할 reducer들이 들어있는 폴더이다.
state 파일에는
export const tokenState = {
token : ""
}
위와 같이 state를 정의한다.
reducers 폴더에 들어갈 reducer에는
import {tokenState} from "../states/tokenState";
enum actionEnum {
changeToken = "changeToken"
}
const tokenReducer = (state = tokenState, action : { type : any, token : string}) => {
switch (action.type){
case actionEnum.changeToken :
return {
...state,
token : action.token
}
default :
return state
}
}
export default tokenReducer
위 와같이 state의 값을 어떻게 바꿀지 등을 정의한다.
reducer파일에는 reducers에 정의한 내용을 store에 주입하는 내용이 작성되어있다.
import { combineReducers } from 'redux'
import tokenReducer from './reducers/token'
const rootReducer = combineReducers({
token : tokenReducer
});
export default rootReducer;
store파일에는
import { createStore } from 'redux'
import rootReducer from './reducer'
const store = createStore(rootReducer)
export default store
export type RootState = ReturnType<typeof rootReducer>;
reducer 파일에서 주입받은 reducer들을 이용하여 스토어를 생성해준다.
웹펙으로 프로젝트를 생성하였다면 index
vite로 프로젝트를 생성하였다면 main에 아래 내용을 작성해준다.
ReactDOM.createRoot(document.getElementById('root')!).render(
<Provider store={store}>
<App />
</Provider>
)
Provider의 store에 생성했던 store를 주입하고 App을 감싸주어 전역으로 reducer를 사용할 수 있도록 한다.
실제로 값을 사용하기 위해서는 아래 코드와 같이 useSelector를 이용하여 필요한 값을 호출해서 사용하고 값을 변경하고 싶다면 useDispath를 이용하여 값을 변경하면 된다.
const App = () => {
const dispatch = useDispatch()
const {token} = useSelector((state : RootState) => state.token)
const requestToken = async () =>{
const currentToken : string = await requestForToken() as string
dispatch({type:"changeToken", token : currentToken})
}
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>{token}</p>
<p>
<button type="button" onClick={() => requestToken()}>
토큰 호출
</button>
</p>
<p>
Edit <code>App.tsx</code> and save to test HMR updates.
</p>
<p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
{' | '}
<a
className="App-link"
href="https://vitejs.dev/guide/features.html"
target="_blank"
rel="noopener noreferrer"
>
Vite Docs
</a>
</p>
</header>
</div>
)
}
export default App