十行代码实现React Hooks

本文转自我的博客十行代码实现React Hooks

代码解千言

export const React = (function() {
  const hooks = [];

  let currentHook = 0;
  return {
    render(Component) {
      const App = Component();
      // run effects
      App.render();
      currentHook = 0;
      // reset for next render
      return App;
    },
    /**
     * similar to https://reactjs.org/docs/hooks-reference.html#conditionally-firing-an-effect
     * @param {*} callback
     * @param {*} depArray
     */
    useEffect(callback, depArray) {
      const hasNoDeps = !depArray;
      let deps = hooks[currentHook]; // type: array | undefined
      const hasChangedDeps = deps
        ? !depArray.every((el, i) => el === deps[i])
        : true;
      if (hasNoDeps || hasChangedDeps) {
        callback();
        deps = depArray;
      }
      currentHook++; // done with this hook
    },
    /**
     * similar to https://reactjs.org/docs/hooks-state.html
     * @param {*} init
     */
    useState(init) {
      hooks[currentHook] = hooks[currentHook] || init; // type: any
      const setStateHookIndex = currentHook; // for setState's closure!
      const setState = newState => (hooks[setStateHookIndex] = newState);
      return [hooks[currentHook++], setState];
    }
  };
})();

“魔法”就是数组。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天下午去逛了公园,草坪上的人很多,有的带了吊床把两端绑在树上,悠闲自得的躺在吊床上养神,最引人注目的是一位熟练的...
    阑十三阅读 255评论 0 11
  • 海上明月照千年,梦归古道长安乱。 浮生旧梦把琴弹,嘈切欲寻知音难。 一曲流觞绝尘凡,举杯邀月花田间。 扁舟一叶醉复...
    慕容锦瑟阅读 400评论 0 3
  • 创建一个 Promise.js 文件 其他文件中引入
    alipy_258阅读 437评论 0 2
  • 一)内容层面1、DNS解析优化(DNS缓存、减少DNS查找、keep-alive、适当的主机域名)2、避免重定向(...
    Augenstern___阅读 247评论 0 0