首页IT科技react diff算法原理(React–》useReducer的讲解与使用)

react diff算法原理(React–》useReducer的讲解与使用)

时间2025-06-14 07:50:24分类IT科技浏览4239
导读:目录...

目录

useReducer的使用

刨析useReducer参数

useReducer的使用

useReducer的使用

在React函数式组件中            ,我们可以通过useState()来创建state                  ,这种state创建方式会给我们返回两个东西state和setState()            。state用来读取数据      ,而setState()用来设置修改数据         ,但这种方法也存在着一些不足                  ,因为所有的修改state方式都必须通过setState()来进行         ,如果遇到一些复杂度比较高的state时      ,这种方式就变得有些繁琐了                  。

为了解决复杂state带来的不便                  ,React为我们提供了一个新的使用state方式            ,当你的state过于复杂时   ,你就可以使用对state整合的工具 “Reducer            ”                   ,其作用就是将那些和同一个state相关的所有函数都整合到一起               ,方便在组件中进行调用      。

注意:Reducer只适合那些比较复杂的state,对于简单的state使用Reducer只能是徒增烦恼               ,以下都会用简单的例子来说明Reducer的使用         。

刨析useReducer参数

useReducer实际上算是useState的升级版                  ,虽然使用比useState复杂   ,但其能够应付更加繁琐的应用场景            ,其接收的参数有三个                  ,接下来将详细刨析useReducer这个Hooks的使用      ,Reducer和State相同也是一个钩子函数         ,其语法格式如下:

const [state, dispatch] = useReducer(reducer, initialArg, init?)

数组中第一个参数:用来获取state的值;数组中第二个参数:state修改的派发器                  ,通过派发器可以发送操作state的命令         ,具体的修改行为将会由另外一个函数执行                  。

reducer参数:用于指定如何更新状态         。它必须函数      ,应该将状态数据和操作方法作为参数                  ,并且应该返回下一个状态      。状态和动作可以是任何类型                  。即:(state,action) => newState

state:是当前最新的状态值

action:用于告诉reducer当前执行的操作            ,reducer会根据不同的操作执行不同的逻辑

newState:返回值   ,返回一个新的state

initialArg参数:用于计算初始状态的值                  ,即为state的初始值               ,作用和useState()中的值是一样的,它可以是任何类型的值            。如何从中计算初始状态取决于下一个init参数   。

init参数:可选参数               ,本质上是一个函数                  ,参数是初始的state   ,如果传入这个参数的话            ,那么初始state就是init(initState)的返回结果                  。通俗来讲就是:应该返回初始状态的初始值设定项函数               。如果未指定                  ,则初始状态设置为initialArg。否则      ,初始状态被设置为调用init(initialArg)的结果               。

useReducer的使用

在 官方文档案例 中         ,已经很明确的告诉我们如何使用useReducer                  ,如下:

官方文通过将reducer函数抽离出来去管理状态的变化         ,根据传入action的不同返回新的状态      ,我们在点击按钮时会调用dispatch函数                  ,并传入一个包含type属性的对象即action            ,这个对象表示将要进行的状态更新操作                  。

接下来举一个简单的计数器的案例   ,来比较一下使用Reducer和未使用的区别在哪里   。

传统操作State的方法为

import React,{ useState } from react const App = () => { const [num,setNum] = useState(0) const addHandler = () =>{ setNum(prenum => prenum + 1) } const subHandler = () =>{ setNum(prenum => prenum -1) } return ( <div style={{fontSize:30px,padding:50px}}> <button onClick={addHandler}>加1</button> {num} <button onClick={subHandler}>减1</button> </div> ) } export default App

使用Reducer操作state方法为

import React,{ useReducer } from react const App = () => { // reducer函数 state:当前最新状态值            、action:当前执行的操作 const reducer = (state,action) =>{ switch(action.type){ case ADD: return state + 1 case SUB: return state - 1 default: return state } } const [num,numDispatch] = useReducer(reducer,0) const addHandler = () =>{ numDispatch({type:ADD}) } const subHandler = () =>{ numDispatch({type:SUB}) } return ( <div style={{fontSize:30px,padding:50px}}> <button onClick={addHandler}>加1</button> {num} <button onClick={subHandler}>减1</button> </div> ) } export default App

当然如果是非常简单的state                  ,使用useState是明智的选择               ,但在某些场景下,例如 state 逻辑较复杂且包含多个子值               ,或者下一个 state 依赖于之前的 state 等            。useReducer会更加适用                  ,使用 useReducer 还能给那些会触发深更新的组件做性能优化   ,因为你可以向子组件传递 dispatch 而不是回调函数                   。如下:

import { useReducer } from react; function reducer(state, action) { switch (action.type) { case incremented_age: { return { name: state.name, age: state.age + 1 }; } case changed_name: { return { name: action.nextName, age: state.age }; } default: return null } } const initialState = { name: Taylor, age: 42 }; export default function App() { const [state, dispatch] = useReducer(reducer, initialState); function handleButtonClick() { dispatch({ type: incremented_age }); } function handleInputChange(e) { dispatch({ type: changed_name, nextName: e.target.value }); } return ( <> <input value={state.name} onChange={handleInputChange} /> <button onClick={handleButtonClick}> +1 </button> <p>Hello, {state.name}. You are {state.age} years old</p> </> ); }

无论是useState还是useReducer            ,都是为了帮助我们的管理组件的状态                   ,但如果你的项目比较复杂      ,后期要经常加以维护的话         ,选择useReducer或许是一个不错的选择      。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
私有云平台是什么(私有云平台如何搭建,私有云平台的优势与应用) 网站降权怎么办(网站降权多久能恢复)