1. store์ state ๋ณ๊ฒฝํ๋ ๋ฒ
step 1) store.js ์์ state ์์ ํด์ฃผ๋ ํจ์ ์์ฑ
- slice ์์ reducers : { } ์ด๊ณ ๊ฑฐ๊ธฐ ์์ ํจ์ ๋ง๋ค๋ฉด ๋๋ค. (ํจ์ ์๋ช ์ ์์ ๋กญ๊ฒ)
- ํ๋ผ๋ฏธํฐ ํ๋ ์๋ช ํ๋ฉด ๊ทธ๊ฑด ๊ธฐ์กด state๊ฐ ๋๋ค.
- return ์ฐ์ธก์ ์๋ก์ด state ์ ๋ ฅํ๋ฉด ๊ทธ๊ฑธ๋ก ๊ธฐ์กด state๋ฅผ ๋ณ๊ฒฝํด์ค๋ค.
let user = createSlice({
name : 'user',
initialState : 'kim',
reducers : {
//state ์์ ํด์ฃผ๋ ํจ์
changeName(state){
return 'john ' + state
},
์์ ํจ์2(state){
return ...
},
}
})
step 2) ์์ฑํ ์์ ํจ์(changeName) export
slice์ด๋ฆ.actions ๋ผ๊ณ ์ ์ผ๋ฉด state ๋ณ๊ฒฝํจ์๊ฐ ์ ๋ถ ๊ทธ ์๋ฆฌ์ ์ถ๋ ฅ๋๋ค.
๊ทธ๊ฑธ ๋ณ์์ ์ ์ฅํ๋ค๊ฐ export ํ๋ฉด ๋๋ค.
(store.js)
export let { changeName, ์์ ํจ์2 } = user.actions
step 3) import ํด์ ์ฌ์ฉ
์๋ฅผ ๋ค์ด์ Cart.js ์์ ๋ฒํผ๊ฐ์๊ฑฐ ํ๋ ๋ง๋ค๊ณ ๊ทธ ๋ฒํผ ๋๋ฅด๋ฉด state๋ฅผ 'kim' -> 'john kim' ์ด๋ ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ถ์ผ๋ฉด
- store.js์์ ์ํ๋ state๋ณ๊ฒฝํจ์๋ฅผ import ํ๋ค.
- useDispatch ๋ผ๋ ๊ฒ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ ธ์จ๋ค.
- ๊ทธ๋ฆฌ๊ณ dispatch( state๋ณ๊ฒฝํจ์() ) ์ด๋ ๊ฒ ๊ฐ์ธ์ ์คํํ๋ฉด state ๋ณ๊ฒฝํจ์๊ฐ ์คํ๋๋ค.
import { useDispatch, useSelector } from 'react-redux';
import { changeName } from './../store.js'
function CartPage() {
let state = useSelector((state) => state)
let dispatch = useDispatch()
return (
<div>
<button onClick={() => {
dispatch(changeName())
}}>+</button>
</div>
)
}
export default CartPage;
2. redux state๊ฐ array/object์ธ ๊ฒฝ์ฐ ๋ณ๊ฒฝํ๋ ค๋ฉด
{name : 'kim', age : 20} ์ธ state๋ฅผ 'kim' -> 'park' ์ด๋ ๊ฒ ๋ณ๊ฒฝํ๊ณ ์ถ์ผ๋ฉด?
๋ฐฉ๋ฒโ return ์ค๋ฅธ์ชฝ์ ์ ์๊ฑธ๋ก ๊ธฐ์กด state๋ฅผ ๋ณ๊ฒฝ
let user = createSlice({
name : 'user',
initialState : {name : 'kim', age : 20},
reducers : {
changeName(state){
return {name : 'park', age : 20}
}
}
})
๋ฐฉ๋ฒโก state๋ฅผ ์ง์ ์์
let user = createSlice({
name : 'user',
initialState : {name : 'kim', age : 20},
reducers : {
changeName(state){
state.name = 'park'
}
}
})
state๋ฅผ ์ง์ ์์ ํ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํด๋ ์ ๋ณ๊ฒฝ๋๋ ์ด์ ๋
Immer.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ state ์ฌ๋ณธ์ ํ๋ ๋ ์์ฑํด์ค ๋๋ถ์ธ๋ฐ Redux ์ค์นํ๋ฉด ํฌํจ๋์ด ์จ๋ค.
โ array/object ์๋ฃ์ ๊ฒฝ์ฐ state๋ฅผ ์ง์ ์์ ํด๋ ์ ๋ณ๊ฒฝ๋๋, ์ง์ ์์ ํ๋ ๊ฒ์ด ์ข๋ค.
3. state ๋ณ๊ฒฝํจ์์ ๋ณ์ ์ฌ์ฉํ๋ ๋ฒ
let user = createSlice({
name : 'user',
initialState : {name : 'kim', age : 20},
reducers : {
increase(state, a){
state.age += a.payload
}
}
})
(์ฐธ๊ณ )
- a ๋ง๊ณ action ์ด๋ฐ ์์ผ๋ก ์๋ช ๋ง์ด ํ๋ค.
- action.type ํ๋ฉด state๋ณ๊ฒฝํจ์ ์ด๋ฆ์ด ๋์ค๊ณ
- action.payload ํ๋ฉด ํ๋ผ๋ฏธํฐ๊ฐ ๋์จ๋ค.
'๐ปWEB FrontEnd > ํ๋ ์์ํฌ React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
react-query : ์ค์๊ฐ ๋ฐ์ดํฐ๊ฐ ์ค์ํ ๋? (0) | 2022.07.13 |
---|---|
localStorage (0) | 2022.07.13 |
Redux (1) : props ์์ด state ๊ณต์ ๊ฐ๋ฅ (0) | 2022.07.13 |
Ajax๋ก ์๋ฒ์ ํต์ (0) | 2022.07.08 |
์ปดํฌ๋ํธ์ Lifecycle (0) | 2022.07.08 |