react基础(3)—— setState

1. setState 方法立即执行, 但是state 更新 以及dom 渲染是异步
2. setState 干了什么?react 数据更新原理?
根据传的对象(新数据),创建新的虚拟dom节点(本质是js 对象),
根据新的虚拟dom 对比老的虚拟dom 对象,找出差异的地方, 以最小
的代价更新到真实的dom 节点上。
3. setState 第一个参数是对象,还支持其他参数?

setState({

},function(){
//状态和dom 节点都更新完之后才执行
})

this.$nextTick(function(){
//前面的数据,更新到dom 节点中会执行 -- vue中的操作
})
4. 连续调用多次setState会对性能产生影响?

不会的,连续调用的setState 进行合并处理,最终还是走一遍

虚拟dom 创建 以及 对比流程

 

5,setState是同步还是异步?

是不能保证同步的,有的时候onClick是同步的

为什么是异步的?

如果是同步的话,碰到开发者高频调用setState方法,比如在一个回调函数中调用多个函数,每个函数调用一次setState,React会频繁渲染,性能和体验都很差,所采用了异步更新的方式,将数次变动集中起来更新。

避免这个异步更新问题两种办法:

①this.setState({xxxx},function(){查看改变后的值})

②this.setState(prevState=>...prevState,[propYouWantToChange]:valueYouWantToChange)

#################demo######################

 1 import React,{Component} from "react";
 2 
 3 class App extends Component{
 4     
 5     constructor(props){
 6         super(props);//继承 父类属性
 7         //等价于vue 中的data 定义
 8         this.state = {
 9             name:"kerwin",
10             age:100,
11             count:1
12         }    
13     }
14 
15     render(){
16         return <div>
17 
18             {this.state.name}--{this.state.age}
19             <button onClick={this.handleClick.bind(this)}>click</button>
20             <p>
21                 
22                 {this.state.count}
23                 <button onClick={this.handleAdd.bind(this)}>add</button>
24             </p>
25         </div>
26     }
27 
28     handleClick(){
29         // this.state.name="xiaoming" //不要直接修改状态,否则引发不可预期的错误
30         
31         this.setState({
32             name:"xiaoming",
33             age:18
34         },()=>{
35             console.log("setstate第二个参数",this.state.name);
36         })//并不保证是同步
37         console.log(this.state.name)
38 
39     }
40 
41     handleAdd(){  
42         this.setState({
43             count:this.state.count+1
44         })
45 
46         this.setState({
47             count:this.state.count+1
48         })
49 
50         this.setState({
51             count:this.state.count+1
52         })
53         this.setState({
54             count:this.state.count+1
55         })
56     }
57 }
58 
59 export default App

 

 1     handleAdd2(){
 2         this.setState((prevState)=>{
 3             return {
 4                 count:prevState.count+1
 5             }
 6         })
 7         this.setState((prevState)=>{
 8             return {
 9                 count:prevState.count+1
10             }
11         })
12         this.setState((prevState)=>{
13             return {
14                 count:prevState.count+1
15             }
16         })
17     }
18 
19 
20 这个方法每次点击就可以出发三次,就不会合并了

 

posted on 2018-10-23 10:28  杨学友  阅读(168)  评论(0编辑  收藏  举报

导航