js
设计模式
观察者模式
// 异步代码都是通过回调函数的方式实现的//1、卖楼//2、缓存列表。存放回调函数//3、当条件完成以后,执行回调函数class Event {constructor(){this.clientList=[];}listen(key,fn) {if(!this.clientList[key]) {this.clientList[key]=[];}this.clientList[key].push(fn);}trigger() {//shift 剪切数组的第一位,没有参数var key=Array.prototype.shift.call(arguments);var fns=this.clientList[key];for(var i=0;i<fns.length;i++) {fns[i].apply(this,arguments);}}}class SalesOffices extends Event {constructor(){super();}}var salesOffices=new SalesOffices();salesOffices.listen("square108",function(price,squareMeter){console.log('square108价格'+price,'square108面积'+squareMeter);})salesOffices.listen("square88",function(price,squareMeter){console.log('square88价格'+price,'square88面积'+squareMeter);})salesOffices.trigger("square108",1000,108);
react
react的setState到底是同步还是异步?
很多小伙伴下意识的以为setState是一个异步方法,但是其实setState并没有异步的说法,之所以会有一种异步方法的表现形式,归根结底还是因为react框架本身的性能机制所导致的。因为每次调用setState都会触发更新,异步操作是为了提高性能,将多个状态合并一起更新,减少re-render调用。
如果在组件中有以下这样一段代码执行:
for ( let i = 0; i < 100; i++ ) {this.setState( { num: this.state.num + 1 } );}
如果setState是一个同步执行机制,那么组建就会被渲染100次,这对性能也是一个相当大的消耗
❝ React会将多个setState的调用合并为一个来执行,也就是说,当执行setState的时候,state中的数据并不会马上更新❞
同步获取到更新的数据
回调函数
this.setState({number:3},()=>{console.log(this.state.number)})
setTimeout
setTimeout(()=>{this.setState({number:3})console.log(this.state.number)},0)
3.原生事件中修改状态
state = {number:1};componentDidMount() {document.body.addEventListener('click', this.changeVal, false);}changeVal = () => {this.setState({number: 3})console.log(this.state.number)}
总结:❝ setState本身并不是异步,只是因为react的性能优化机制体现为异步。在react的生命周期函数或者作用域下为异步,在原生的环境下为同步。
❞
react官网解释:State的更新可能是异步的 (解决方式,setState()接收一个函数而不是一个对象)
this.setState((state, props) => ({counter: state.counter + props.increment}));
2.State的更新会被合并
