react setState 伪代码实现

简介: 我们大家都知道 react 的 setState 是异步的(也可以理解成同步的),在react 组件声明周期内的多次 setState 会进行合并处理。

d918dba1104817c8b8563dd9c7656c2f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.jpg


我们大家都知道 react 的 setState 是异步的(也可以理解成同步的),在react 组件声明周期内的多次 setState 会进行合并处理。


看下面代码


componentDidMount(){         this.setState({            count:0        })        this.setState({            count: 1        })        this.setState({            count: 2        })        this.setState({            count: 3        });        console.log(this.state);    }


setState 内部将数据进行合并,主要使用了共享结构,下面是模拟的伪代码实现。


function React(){    this.state={};     this.nextState=null;//保存合并后的state    this.renderEndCallback=[];//保存回调方法
}
React.prototype.setState=function(obj,callback){    //obj是对象    if(obj && typeof obj === 'object'){//如果是对象则进行合并            this.nextState = {...this.state,...this.nextState,...obj};            if(typeof callback==='function'){                this.renderEndCallback.push(callback);            }    }
    //obj 是函数    if(obj  && typeof obj==='function'){        this.nextState = this.nextState ? this.nextState:({...this.state});        var tempState = obj(this.nextState);//此处省略 props 参数
        //进行state 的合并        this.nextState = {...this.state,...this.nextState,...tempState};    }
}
//获得最新 stateReact.prototype.getState=function(){    this.state={...this.nextState};    return this.state;}
// 用来获得最新的stateReact.prototype.render=function(){   var state=this.getState();   this.renderEndCallback.forEach((fn)=>(fn.call(this)));}


调用


var title = new React();
title.state={    count:0,    name:'前端张大胖'}
title.setState({    count:1});
console.log(1,title.state);
title.setState({    count:2},function(){    console.log(2,'callback',this.state);});
console.log(3,title.state);
title.setState((preState)=>{    return {        count:preState.count+3,        age:25,        address:'北京'    }});
console.log(4,title.state);
title.setState({    count:1});
title.setState((preState)=>{    console.log(5,preState);    return {        count:preState.count+3    }});
title.render();


执行结果


041709c54ccc5e02ce84ddbd4f2cddc3_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.jpg

以上模拟代码并非是 react 内部实现逻辑,只是模拟实现了相同的的输出结果,如有问题还请指正。

目录
相关文章
|
3月前
|
前端开发 JavaScript
学习react基础(3)_setState、state、jsx、使用ref的几种形式
本文探讨了React中this.setState和this.state的区别,以及React的核心概念,包括核心库的使用、JSX语法、类与函数组件的区别、事件处理和ref的使用。
89 3
学习react基础(3)_setState、state、jsx、使用ref的几种形式
|
6月前
|
前端开发
前端React篇之React setState 调用的原理、React setState 调用之后发生了什么?是同步还是异步?
前端React篇之React setState 调用的原理、React setState 调用之后发生了什么?是同步还是异步?
|
前端开发 JavaScript
React 中 setState 什么时候是同步的,什么时候是异步的
React 中 setState 什么时候是同步的,什么时候是异步的
137 0
|
前端开发 JavaScript
react的setState是异步还是同步
react的setState是异步还是同步
|
7月前
|
前端开发
说说React中setState和replaceState的区别?
在 React 中,setState()和 replaceState()是用于更新组件状态的两个方法。它们之间有一些区别
55 0
|
7月前
|
前端开发 算法
React中的setState执行机制?
React中的setState执行机制?
|
7月前
|
前端开发
React中setState方法详细讲解
React中setState方法详细讲解
|
7月前
|
前端开发 JavaScript 算法
react中的setState的执行机制
react中的setState的执行机制
47 0
|
7月前
|
前端开发
【React学习】—SetState的使用(九)
【React学习】—SetState的使用(九)
|
前端开发 JavaScript 数据管理
react数据管理之setState与Props
react数据管理之setState与Props
73 0