一 介绍
- useReducer 是 useState 的替代方案,是 useState 的复杂版。
- 在某些场景下,useReducer 会比 useState 更适用,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。并且,使用 useReducer 还能给那些会触发深更新的组件做性能优化,因为你可以向子组件传递 dispatch 而不是回调函数 。
二 示例一:数字加或乘任意数字
import React, {useReducer} from 'react';
import ReactDOM from 'react-dom';
const initial = {n: 1};
const reducer = (state, action) => {
if (action.type === 'add') {
return {n: state.n + action.number};
} else if (action.type === 'multi') {
return {n: state.n * action.number};
} else {
throw new Error('没有对应操作');
}
};
const App = () => {
const [state, dispatch] = useReducer(reducer, initial);
return (
<>
<div>
{/*读数据*/}
{state.n}
{/*写数据*/}
<button onClick={() => dispatch({type: 'add', number: 10})}>+10</button>
<button onClick={() => dispatch({type: 'multi', number: 5})}>x5</button>
</div>
</>
);
};
ReactDOM.render(
<App/>,
document.getElementById('root')
);
三 示例二:表单
import React, {useReducer} from 'react';
import ReactDOM from 'react-dom';
const initialFormDate = {
name: '芋圆',
color: '紫色',
count: '15'
};
const reducer = (state, action) => {
switch (action.type) {
case 'patch':
return {...state, ...action.newFormDate};
case 'reset':
return initialFormDate;
default:
throw new Error('错误');
}
};
const App = () => {
const [formData, dispatch] = useReducer(reducer, initialFormDate);
const onSubmit=()=>{
}
const onReset=()=>{
dispatch({type:'reset'})
}
return (
<form onSubmit={onSubmit} onReset={onReset}>
<div>
<div>
<label>名称
<input value={formData.name} onChange={e=>dispatch({type:'patch',newFormDate:{name:e.target.value}})} />
</label>
</div>
<div>
<label>颜色
<input value={formData.color} onChange={e=>dispatch({type:'patch',newFormDate:{color:e.target.value}})} />
</label>
</div>
<div>
<label>数目
<input value={formData.count} onChange={e=>dispatch({type:'patch',newFormDate:{count:e.target.value}})} />
</label>
</div>
<div>
<button type='submit'>提交</button>
<button type='reset'>重置</button>
</div>
{JSON.stringify(formData)}
</div>
</form>
);
};
ReactDOM.render(
<App/>,
document.getElementById('root')
);
四 总结
- 创建初始initialState
- 创建所有操作reducer(state,action)
- 传给useReducer,得到读写API
- 调用写API,参数要包含{type:'操作类型'}