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的更新会被合并