zoukankan      html  css  js  c++  java
  • 实现useState和useEffect

    简易版 useState和useEffect

    let _state; // 把 state 存储在外面
    
    function useState(initialValue) {
      _state = _state || initialValue; // 如果没有 _state,说明是第一次执行,把 initialValue 复制给它
      function setState(newState) {
        _state = newState;
        render();
      }
      return [_state, setState];
    }
    
    let _deps; // _deps 记录 useEffect 上一次的 依赖
    
    function useEffect(callback, depArray) {
      const hasNoDeps = !depArray; // 如果 dependencies 不存在
      const hasChangedDeps = _deps
        ? !depArray.every((el, i) => el === _deps[i]) // 两次的 dependencies 是否完全相等
        : true;
      /* 如果 dependencies 不存在,或者 dependencies 有变化*/
      if (hasNoDeps || hasChangedDeps) {
        callback();
        _deps = depArray;
      }
    }
    
    

    完善版

    let memoizedState = []; // hooks 存放在这个数组
    let cursor = 0; // 当前 memoizedState 下标
    
    function useState(initialValue) {
      memoizedState[cursor] = memoizedState[cursor] || initialValue;
      const currentCursor = cursor;
      function setState(newState) {
        memoizedState[currentCursor] = newState;
        render();
      }
      return [memoizedState[cursor++], setState]; // 返回当前 state,并把 cursor 加 1
    }
    
    function useEffect(callback, depArray) {
      const hasNoDeps = !depArray;
      const deps = memoizedState[cursor];
      const hasChangedDeps = deps
        ? !depArray.every((el, i) => el === deps[i])
        : true;
      if (hasNoDeps || hasChangedDeps) {
        callback();
        memoizedState[cursor] = depArray;
      }
      cursor++;
    }
    
  • 相关阅读:
    为了我们自己的利益,请不要去支持番茄花园。
    游戏版本比较的算法[ZZ]
    DXUT框架剖析(9)
    强制删除任意文件以及文件夹
    安全幻想曲2008
    DXUT框架剖析(12)
    DXUT框架剖析(6)
    [Ph4nt0m] [zz]The Emergence Of A Theme
    俄国农民乘法
    写在msn签名上的I'M 计划
  • 原文地址:https://www.cnblogs.com/mapleChain/p/14325935.html
Copyright © 2011-2022 走看看