react教程,如何使用useState的升级版hook函数useReducer?
发布于 作者:苏南大叔 来源:程序如此灵动~本文主要学习react
中的useReducer
的函数,如何使用。在redux
系列文章中,大家已经知道了reducer
和state
的概念。这两个概念在纯正的react
项目中,也是存在的。react
中修改简单的state
数据的时候,使用useState
。修改复杂大量的数据的时候,可以选择useReducer
。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述react
中的useReducer
函数的使用方法。测试环境:create-react-app@5.0.1
,node@16.14.2
,react@18.2.0
,react-dom@18.2.0
。
因为函数里面有use
的字样,所以必然是个hook
,必然只能用于react
的函数式组件里面,而不是传统的类式组件里面。
useState
和useReducer
据react
官方定性,useState
和useReducer
都是函数式组件的状态管理方法,useReducer
是useState
的升级方案。但是,官方并没有把useState
定性为“过时”。所以,useState
和useReducer
是可以并存的。
两者可能的区别是:
useState
适合定义一些简单的状态(字符串、数值型、布尔型)useReducer
适合逻辑比较复杂的state
(数组或对象等其它复杂的类型等)。
回顾useState
回顾一下useState
的使用方法:
import { useState} from 'react';
function Sunan() {
const [count, setCount] = useState(100);
return (
<>
苏南大叔有 {count} 个心眼子
<button onClick={() => setCount(count => count + 1)}>+</button>
<button onClick={() => setCount(count + 1)}>+</button><br />
</>
);
}
这里使用了两种修改state
数据的方法,两者有什么区别呢?参考文章:
https://newsn.net/say/react-usestate-setInterval.html
useState
的更多用法,请参考:
https://newsn.net/say/react-usestate.html
useReducer
useReducer
作为useState
的升级版本,有适应复杂常见处理复杂state
的能力。
先定义一个reducer
,输入参数为state,action
,输出为根据action.type
修改过的新的state
。
import { useReducer } from 'react';
const reducer = (state, action) => {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
default:
throw new Error();
}
};
这里的根据action.type
处理state
的新值的时候,如果数据比较复杂,也可以写成下面的样子,适用范围更广。
return{...state,count:state.count + 1}
三个点运算符的使用方法,可以参考:
使用useReducer
来处理定义好的reducer
,输入项目为reducer
和state
的初始值,输出为state
变量和dispatch
函数。
值得注意的是:这个dispatch
是react
里面原有的。和react-redux
中的useDispatch
,虽然很相似,但并不是同一个东东。
function Sunan2() {
const [state, dispatch] = useReducer(reducer, { count: 199 });
return (
<>
苏南大叔有 {state.count} 个心眼子
<button onClick={() => dispatch({ type: 'increment' })}>+</button><br />
</>
);
}
useReducer
的输入项目,可以是:
- 两个输入,
reducer
和state
的初始值。 - 三个输入,
reducer
和state
的初始值,加上对state
初始值进行再处理得到新的初始值的函数。
下面示例使用useReducer
三个输入,返回state
变量和dispatch
函数的情况:
function Sunan3() {
const [state, dispatch] = useReducer(reducer, { count: 0 }, (state) => {
state.count = 200;
return state;
});
return (
<>
苏南大叔有 {state.count} 个心眼子
<button onClick={() => dispatch({ type: 'increment' })}>+</button><br />
</>
);
}
相关链接
结束语
更多react
经验文章,请点击苏南大叔的博客文章:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。