8.3 useReducer - ReactBakSal/ssionii GitHub Wiki
μ μ: useStateλ³΄λ€ λ λ€μν μ»΄ν¬λνΈ μν©μ λ°λΌ λ€μν μνλ₯Ό λ€λ₯Έ κ°μΌλ‘ μ λ°μ΄νΈν΄ μ£Όκ³ μΆμ λ μ¬μ©νλ Hook.
μκΉμ
const [state, dispatch] = useReducer(reducer, {value: 0});
state: νμ¬ κ°λ¦¬ν€κ³ μλ μν, dispatch: μ‘μ μ λ°μμν€λ ν¨μ
μ₯μ
μ»΄ν¬λνΈ μ λ°μ΄νΈ λ‘μ§μ μ»΄ν¬λνΈ λ°κΉ₯μΌλ‘ λΊ μ μμ.
μ μ: νμ¬ μνμ μ λ°μ΄νΈλ₯Ό μν΄ νμν μ 보λ₯Ό λ΄μ μ‘μ κ°μ μ λ¬λ°μ μλ‘μ΄ μνλ₯Ό λ°ννλ ν¨μ. λ°λμ λΆλ³μ±(μ μ μ 보(?)λ₯Ό κ·Έλλ‘ μ μ§νκ³ μλ‘κ² λ§λ€μ΄μ€μΌ ν¨)μ μ§μΌμ£Όμ΄μΌ ν¨.
μκΉμ
function reducer(state, action) {
return { β¦ }; // λΆλ³μ±μ μ§ν€λ©΄μ μ
λ°μ΄νΈν μλ‘μ΄ μν λ°ν
}
import React, { useReducer } from 'react';
function reducer(state, action){
// action.typeμ λ°λΌ λ€λ₯Έ μμ
μν
switch(action.type){
case 'INCREMENT':
return {value: state.value + 1};
case 'DECREMENT':
return {value: state.value - 1};
default:
return state;
}
}
const Counter = () => {
// const [value, setValue] = useState(0);
const [state, dispatch] = useReducer(reducer, {value: 0});
return (
<div>
<p>
νμ¬ μΉ΄μ΄ν° κ°μ <b>{state.value}</b>μ
λλ€.
</p>
<button onClick={() => dispatch({type: 'INCREMENT'})}>+1</button>
<button onClick={() => dispatch({type: 'DECREMENT'})}>-1</button>
</div>
);
};
export default Counter;
μ‘μ κ°μ μ무거λ μκ΄ μμ. μλ μμ λ μ΄λ²€νΈ κ°μ²΄κ° μ§λκ³ μλ e.target κ° μ체λ₯Ό μ‘μ κ°μΌλ‘ μ¬μ©νμ
import React, {useReducer} from 'react';
function reducer(state, action){
return{
...state,
[action.name] :action.value
};
}
const Info = () =>{
const [state, dispatch] = useReducer(reducer,
{
name: '',
nickname: ''
});
const {name, nickname} = state;
const onChange = e => {
dispatch(e.target);
};
return(
<div>
<div>
<input name="name" value ={name} onChange ={onChange}/>
<input name="nickname" value ={nickname} onChange ={onChange}/>
</div>
<div>
<div>
<b>μ΄λ¦:</b> {name}
</div>
<div>
<b>λλ€μ:</b> {nickname}
</div>
</div>
</div>
)
}
export default Info;