props없이 state를 공유할 수 있게하는 라이브러리
yarn add @reduxjs/toolkit react-redux
store.js파일을 만들어서 아래처럼 세팅한다.
import { configureStore } from '@reduxjs/toolkit'
export default configureStore({
reducer: { }
})
그리고 index.js에서 Provider컴포넌트와 위처럼 작성한 store.js를 import한다.
import { Provider } from "react-redux";
import store from './store.js'
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<Provider store={store}>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>
</React.StrictMode>
);
이렇게 작성하면 App을 비롯한 모든 컴포넌트들은 store.js에서 state를 마음껏가져가서 사용이 가능하다.
import { configureStore, createSlice } from '@reduxjs/toolkit'
// 1. createSlice()로 state를 만들고
const user = createSlice({
name : 'user',
initialState : [
{id : 0, name : 'jang', age : 21},
{id : 2, name : 'kim', age : 14}
]
})
// 2. configureStore()안에 등록
export default configureStore({
reducer: {
user : user.reducer
}
})
createSlice를 import하고
{ name: 'stateName', initialState: "state값" } 이런 방식으로 state를 하나 생성한다.
createSlice는 useState와 비슷하게 사용한다.
configureStore() 안에 state를 등록하면 된다.
{ 작명 : createSlice로 만든 stateName
.reducer } 이런 방식으로 등록한다.
컴포넌트 파일에서
state.user[i].name
와 같이 사용한다.
state 수정 함수를 store.js에 만들고 그 함수를 컴포넌트에서 원할 때 실행하는 방식으로 사용한다.
const user = createSlice({
name : 'user',
initialState : [
{id : 0, name : 'jang', age : 21},
{id : 2, name : 'kim', age : 14}
],
reducers : {
changeName(state){
return 'john ' + state
}
}
})
export let { changeName } = user.action
사용하는 컴포넌트
import { useDispatch, useSelector } from "react-redux"
import { changeName } from "./../store.js"
(생략)
<button onClick={()=>{
dispatch(changeName())
}}>버튼</button>
아래와 같이 state변경함수를 작성한다.
const user = createSlice({
name : 'user',
initialState : [
{name : 'jang', age : 21},
{name : 'kim', age : 14}
],
reducers : {
changeName(state){
return {
state.name = 'park'
}
}
})
위 처럼 간단한 방식으로 state변경 함수를 구성 할 수 있다.
이러한 방식때문에 state를 한가지만 만들어도 redux에서는 object나 array에 담는 경우가 있다.
reducers : {
changeName(state, action){
return {
state.name = action
}
}
위 코드같은 방식으로 파라미터를 작성하면
changeName('jang')이런식으로 파라미터 전달이 가능한 함수 구성이 가능하다.