React-useState实现

Posted 冷咖啡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React-useState实现相关的知识,希望对你有一定的参考价值。

已实现功能

  • 实现useState的基本功能,取值和存值

待优化解决问题

  • 在某个时间段,将要更新的状态统一处理完,再更新DOM,目前是更新一次重新渲染一次
  • 暂时不能引入到React环境中,缺少React的渲染方法待实现。但可以window中调试,能看到状态的更新
/**
 * 第一步:
 * isMount: 判断是第一次加载还是更新组件
 * workInProgressHooks: 定义一个指针, 指向当前执行的useSate的
 */

 let isMount = true;
 let workInProgressHooks = null;
 
 /**
  *  第二步
  *  定义 fiber节点
  */
 const fibier = {
   stateNode: App,
   memoizedState: null, // 当前fiber节点需要维护的hook
 };
 
 /**
  * 第四步: 实现useState
  * @returns
  */
 
 function useState(initialState) {
   let hook;
    if(typeof initialState === "function" ) {
      initialState = initialState();
    }
 
   if (isMount) {  
     hook = {
       memoizedState: initialState, // 当前这个hook需要维护的数据
       next: null, // 为保证所有的useState能按序执行,所以需要实现 【链表结构】
       queue: {
         pending: null,
       },
     };
 
     if (!fibier.memoizedState) {
       fibier.memoizedState = hook;
     } else {
       workInProgressHooks.next = hook;
     }
     workInProgressHooks = hook;
   } else {
     hook = workInProgressHooks;
     workInProgressHooks = workInProgressHooks.next;
   }
 
   // todo
   let beaseSate = hook.memoizedState;
   if(hook.queue.pending) {
     let firstUpate = hook.queue.pending.next;
     do{
       const action = firstUpate.action;
       beaseSate = action(beaseSate);
       firstUpate = firstUpate.next;

     }while(firstUpate !== hook.queue.pending.next);
 
     hook.queue.pending = null;  
   }
 
   hook.memoizedState = beaseSate;
   return [beaseSate, dispatchAction.bind(null, hook.queue)]
 
 }
 
 /**
  * 第五步:实现状态更新
  * @returns
  */
 
 function dispatchAction(queue, action) {
   const update = {
     action,
     next: null,
   };
 
   // 第一次触发更新
   if (queue.pending === null) {
     update.next = update;
   } else {
     update.next = queue.pending.next;
     queue.pending.next = update;
   }
 
   queue.pending = update;
    schedule();
 }
 
 /**
  * 第三步
  * 实现React 调度方法
  * 调度方法运行后,即重新加载组建后,React会重新渲染
  */
 function schedule() {
   workInProgressHooks = fibier.memoizedState;
   const app = fibier.stateNode();
   isMount = false;
   return app;
 }
 
 
 function App() {
   const [num1, setNum1] = useState(0);
   const [num2, setNum2] = useState(1);
   const [num3, setNum3] = useState(2);

   console.log("----最近一次更新--------", );
   console.log("num1---", num1);
   console.log("num2-", num2);
   console.log("num3222", num3);

   return {
      onclick() {
        setNum1(num1 => num1 +1);
        setNum2(num2 => num2+1)
        setNum3(num3 => num3 +1)
      }
   }
 }
 window.app = schedule();
 
 
 export default App;
 
 

以上是关于React-useState实现的主要内容,如果未能解决你的问题,请参考以下文章

代码片段 - Golang 实现集合操作

代码片段 - Golang 实现简单的 Web 服务器

ASP.net MVC 代码片段问题中的 Jqgrid 实现

代码片段:Shell脚本实现重复执行和多进程

如何实现具有不同片段/布局的 ViewPager

是否可以动态编译和执行 C# 代码片段?