一 介绍
- 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 = () => {
//将初始值和所有操作传给useReducer,已得到读写API
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 = () => {
//将初始值和所有操作传给useReducer,已得到读写API
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:'操作类型'}
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
- 找不到素材资源介绍文章里的示例图片?
- 对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
- 模板不会安装或需要功能定制以及二次开发?
- 请QQ联系我们
发表评论
还没有评论,快来抢沙发吧!