使用
在某些场景下,useReducer 会比 useState 更适用,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。示例代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
<body>
<div id="app"></div>
<script type="text/babel">
function reducer(state, action) {
switch(action.type) {
case 'incre':
state++
return state;
case 'decre':
state--
return state;
default:
throw 'error'
}
}
function Comp() {
// 本质是调用mountReducer,返回 state 和 dispatchAction
debugger
const [ state, dispatch ] = React.useReducer(reducer, 0)
console.log(state);
return (
<div>
{/* 调用 dispatch 时其实就是调用 reducer,记录更新的状态,进入渲染阶段后就会更新状态 */}
<h1 onClick={() => dispatch({type: 'incre'})}>{state}</h1>
<h1 onClick={() => dispatch({type: 'decre'})}>{state}</h1>
</div>
)
}
const app = document.getElementById('app')
ReactDOM.render(<Comp />, app)
</script>
</body>
</html>
原理
- 调用 React.useReducer 本质就是调用 moutReducer,这个函数会返回初始 state 和 dispatchAction
- 当我们调用 dispatchAction 其实主要逻辑做了两件事情,一个是调用 reducer 去获取 eagerState(最新状态),一个是去记录这个最新状态,方便在更新阶段时更新
- 最后给段伪代码: