美文网首页
useReducer

useReducer

作者: 就问你怕不怕 | 来源:发表于2021-12-14 18:23 被阅读0次

    先来看官网解释:

    useState的替代方案。它接收一个形如 (state, action) => newState 的 reducer,并返回当前的 state 以及与其配套的 dispatch 方法。(如果你熟悉 Redux 的话,就已经知道它如何工作了。)
    在某些场景下,useReducer 会比 useState 更适用,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。并且,使用 useReducer 还能给那些会触发深更新的组件做性能优化,因为你可以向子组件传递 dispatch 而不是回调函数

    useReducer使用语法为:

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

    看一个使用 reducer 写计数器的示例:

    import { useRef,useReducer} from "react";
    import * as ReactDOM from "react-dom";
    
    const initialState = {count: 0};
    
    function reducer(state, action) {
      switch (action.type) {
        case 'increment':
          return {count: state.count + 1};
        case 'decrement':
          return {count: state.count - 1};
        default:
          throw new Error();
      }
    }
    
    function App() {
      const [state, dispatch] = useReducer(reducer, initialState);
      return (
        <>
          Count: {state.count}
          <button onClick={() => dispatch({type: 'decrement'})}>-</button>
          <button onClick={() => dispatch({type: 'increment'})}>+</button>
        </>
      );
    }
    
    const rootElement = document.getElementById("root");
    ReactDOM.render(<App />, rootElement);
    

    可以看到,跟使用redux的形式一样。

    来看看第三个参数init的使用:

    import { useRef,useReducer} from "react";
    import * as ReactDOM from "react-dom";
    
    function init(initialCount) {
      return {count: initialCount};
    }
    
    function reducer(state, action) {
      switch (action.type) {
        case 'increment':
          return {count: state.count + 1};
        case 'decrement':
          return {count: state.count - 1};
        case 'reset':
          // init()返回的同上面case一样都是最终的state,所以通常useReducer并不一定需要第三个参数init,否则还容易混淆视听。
          return init(action.payload);
        default:
          throw new Error();
      }
    }
    
    function App({initialCount}) {
      const [state, dispatch] = useReducer(reducer, initialCount, init);
      return (
        <>
          Count: {state.count}
          <button
            onClick={() => dispatch({type: 'reset', payload: initialCount})}>
            Reset
          </button>
          <button onClick={() => dispatch({type: 'decrement'})}>-</button>
          <button onClick={() => dispatch({type: 'increment'})}>+</button>
        </>
      );
    }
    
    const rootElement = document.getElementById("root");
    ReactDOM.render(<App initialCount={0} />, rootElement);
    

    总的来说,useReducer是在某些复杂state和state逻辑处理复杂的场景中用来替代useState的。

    相关文章

      网友评论

          本文标题:useReducer

          本文链接:https://www.haomeiwen.com/subject/ubkyfrtx.html