深入了解react中 this.setState方法

setState(arg1,arg2) 括号内的arg1可传入两种参数,一种是对象,一种是函数. arg2为更改state之后的回调方法,arg2可为空.

对象式的setState用法

//第一种 this.setState({ isAuthenticated: true}); this.setState({ isAuthenticated: true},()=>{});

this.setState(
             {isAuthenticated: true},
             () => console.log(this.state.isAuthenticated + ‘.‘));

函数式的setState用法

这个函数会接收到两个参数,第一个是当前的state值,第二个是当前的props,这个函数应该返回一个对象,这个对象代表想要对this.state的更改,换句话说,之前你想给this.setState传递什么对象参数,在这种函数里就返回什么对象,不过,计算这个对象的方法有些改变,不再依赖于this.state,而是依赖于输入参数state。
这个函数格式是固定的,必须第一个参数是state的前一个状态,第二个参数是属性对象props,这两个对象setState会自动传递到函数中去

有两种写法:

//第二种 , 有两种写法 区别在于括号
this.setState((preState, props) => {
                    return {isAuthenticated: props.isAuthen}
                });

this.setState((preState, props) => ({
                    isAuthenticated: !preState.isAuthenticated
                }));

仔细看可以发现,前者是return了一个对象,后者直接写了一个对象,但是后者的对象外层比前者的写法多了个括号,使用时需要注意。
如果你希望在setState之前做些什么 可以使用前者的写法:

this.setState((preState, props) => {
                    console.log(preState)
                    return {isAuthenticated: true}
                }, () => console.log(this.state.isAuthenticated));
//这个写法意思就是,在改变state中的数据之前,打印出当前的state,然后在更新state之后,
//利用回调打印出this.state.isAuthenticated

使用场景:

调用setState,组件的state并不会立即改变,setState只是把要修改的状态放入一个队列中,React会优化真正的执行时机,并且React会出于性能原因,可能会将多次setState的状态修改合并成一次状态修改。所以不要依赖当前的State,计算下个State。
例如:

function incrementMultiple() { 

  this.setState({count: this.state.count + 1});

  this.setState({count: this.state.count + 1}); 

  this.setState({count: this.state.count + 1}); }

直观上来看,当上面的incrementMultiple函数被调用时,组件状态的count值被增加了3次,每次增加1,那最后count被增加了3,但是,实际上的结果只给state增加了1。

原因并不复杂,就是因为调用this.setState时,并没有立即更改this.state,所以this.setState只是在反复设置同一个值而已,上面的code等同下面这样。

function incrementMultiple() { 

  const currentCount = this.state.count;  this.setState({count: currentCount + 1});  this.setState({count: currentCount + 1});  this.setState({count: currentCount + 1});}

currentCount就是一个快照结果,重复地给count设置同一个值,不要说重复3次,哪怕重复一万次,得到的结果也只是增加1而已。

那么如果想要结果是3怎么做呢?这时就需要第二种写法:

_bsetIncrementMultiple = () => { 

   this.setState(prevState => ({ count: prevState.count + 1 }));   this.setState(prevState => ({ count: prevState.count + 1 }));   this.setState(prevState => ({ count: prevState.count + 1 }));}

这样,每一次改变count的时候,都是prevState.count + 1,pervState是前一个状态,每次setState之后,前一个状态都会改变,那么这时候,结果就是想要的3了。如果需要立即setState 那么传入一个函数来执行setState是最好的选择

原文地址:https://www.cnblogs.com/jszhp/p/10482616.html

时间: 2024-11-08 21:21:51

深入了解react中 this.setState方法的相关文章

在react中引入highcharts方法

Highchart在react中引入的方法为: 1.安装相关依赖 npm install  highcharts Npm install highcharts-react-offical 2.在相关模块引入: Import Hightcharts from ‘highcharts’ Import HightchartsReact from ‘highcharts-react-offical’ 如果需要某些特殊模块,则需要引入: Import highcharts3d from ‘highchar

React 中的 AJAX 请求:获取数据的方法

React 中的 AJAX 请求:获取数据的方法 React 只是使用 props 和 state 两处的数据进行组件渲染. 因此,想要使用来自服务端的数据,必须将数据放入组件的 props 或 state 中. 首先引入 axios. 1.`import axios from 'axios';` constructor 方法非常标准,调用 super,然后初始化 state,设置一个空的 posts 数 传入新的 posts 数组,使用 this.setState 方法更新组件状态.这会导致重

React中setState同步更新策略

本文和大家分享的主要是React中setState同步更新相关内容,希望对大家学习React有所帮助. 为了提高性能React将setState设置为批次更新,即是异步操作函数,并不能以顺序控制流的方式设置某些事件,我们也不能依赖于 this.state 来计算未来状态.典型的譬如我们希望在从服务端抓取数据并且渲染到界面之后,再隐藏加载进度条或者外部加载提示: componentDidMount() { fetch('https://example.com') .then((res) => re

React中ref的使用方法

React中ref的使用方法 在react典型的数据流中,props传递是父子组件交互的唯一方式:通过传递一个新的props值来使子组件重新re-render,从而达到父子组件通信.当然,就像react官网所描述的一样,在react典型的数据量之外,某些情况下(例如和第三方的dom库整合,或者某个dom元素focus等)为了修改子组件我们可能需要另一种方式,这就是ref方式. 1.ref有两种使用方法: 1)回调函数 标签中:<input type="text" classNam

React中setState 什么时候是同步的,什么时候是异步的?

class Example extends React.Component { constructor() { super(); this.state = { val: 0 }; } componentDidMount() { this.setState({val: this.state.val + 1}); console.log(this.state.val); // 第 1 次 log this.setState({val: this.state.val + 1}); console.lo

react的this.setState中的坑

react的this.setState中的有两个. 1.this.setState异步的,不能用同步的思维讨论问题 2.在进行组件通讯的回调的时候,this指向子组件,没有指向父亲这,怎么办呢.在 class gradingView extends React.Component { constructor(...args) { super(...args); this.state = { suffixIcon: <Icon type="up" />, popDivShow

react中的children使用方法

使用过vue的小伙伴都知道vue中有个slot,也就是插槽,作用就是占位,那么再react中可以使用children来替代 父组件 render(){ return( <div> <Grid> 我将被传递到Grid组件中 </Grid> </div> ) } 子组件 export default class Grid extends React.Component { render() { return ( <div>{this.props.ch

Immutable学习及 React 中的实践

为什么用immutable.js呢.有了immutable.js可以大大提升react的性能. JavaScript 中的对象一般是可变的(Mutable),因为使用了引用赋值,新的对象简单的引用了原始对象,改变新的对象将影响到原始对象.如 foo={a: 1}; bar=foo; bar.a=2 你会发现此时 foo.a 也被改成了 2.虽然这样做可以节约内存,但当应用复杂后,这就造成了非常大的隐患,Mutable 带来的优点变得得不偿失.为了解决这个问题,一般的做法是使用 shallowCo

React中key的作用

对于React中key的作用,官方没有给出详细的解读,只提到在List中需要给key赋值来区分每一条记录,http://blog.csdn.net/code_for_free/article/details/50514259里讲解了key的使用场景, http://taobaofed.org/blog/2016/08/24/react-key/从三方面讲了List组件中key存在的原因和List之外使用key作为trick简化代码逻辑,本文以List中新增元素为例,从List子组件生命周期函数的