react的hook之useReducer
import React, { useState, memo, useMemo, useCallback, useReducer, useContext } from 'react';
import ReactDOM from 'react-dom';
export function Three() {
let initialState = 0;
// 如果你希望初始状态是一个{number:0}
// 可以在第三个参数中传递一个这样的函数 ()=>({number:initialState})
// 这个函数是一个惰性初始化函数,可以用来进行复杂的计算,然后返回最终的 initialState
const init = (initialState) => {
return {
number: initialState
};
}
const reducer = (state, action) => {
debugger
switch (action.type) {
case 'increment':
return { number: state.number + 1 };
case 'decrement':
return { number: state.number - 1 };
default:
throw new Error();
}
};
const [state, dispatch] = useReducer(reducer, initialState, init);
return (
<>
Count: {state.number}
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
<button onClick={() => dispatch({ type: 'decrement' })}>-</button>
</>
)
}
下面和上面一样,只是参数改了下形式,对比看下
import React, { useState, memo, useMemo, useCallback, useReducer, useContext } from 'react';
import ReactDOM from 'react-dom';
export function Three() {
let initialState = { number: 0 };
// 如果你希望初始状态是一个{number:0}
// 可以在第三个参数中传递一个这样的函数 ()=>({number:initialState})
// 这个函数是一个惰性初始化函数,可以用来进行复杂的计算,然后返回最终的 initialState
const reducer = (state, action) => {
//debugger
switch (action.type) {
case 'increment':
return { number: state.number + 1 };
case 'decrement':
return { number: state.number - 1 };
default:
throw new Error();
}
};
const [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.number}
<button onClick={() => dispatch({ type: 'increment' })}>+</button>
<button onClick={() => dispatch({ type: 'decrement' })}>-</button>
</>
)
}
总结:
第一个参数是(state, action) => newState 的 reducer,第二个参数是state的值
reducer里面的action就是底下dispatch的参数,state就是initialState的值
有点类似于vue3.0的ref,reactive,一个是简单数据结构的state,一个是声明复杂数据结构的state
还可以参考https://www.jianshu.com/p/14e429e29798

浙公网安备 33010602011771号