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++;
    }
    
  • 相关阅读:
    MongoDB Query 常用方法
    plsql中文乱码问题(显示问号)
    xtype的使用
    LinQ:list基础操作
    VMware Fusion自动切换分辨率
    C#截取字符串的方法小结
    HTML 编码
    AMQP(Advanced Message Queuing Protocol)
    rabibtMQ安装及集群配置linux
    今天是个开始
  • 原文地址:https://www.cnblogs.com/mapleChain/p/14325935.html
Copyright © 2011-2022 走看看