修改组件的状态可以使用的一些方法:

1、比较常用的

this.setState({

  message:"你好"

})

2、state更新是异步的时候

因为this.props和this.state可能是异步更新的,不能依赖他们的值去计算state,

this.setState({

  count:this.state.count+this.props.count

})

我们不能通过上面的代码得到想要的值,应该使用另一种setState()的形式,接受一个函数。这个函数的一个参数是前一个状态(prevState),第二个参数是应用更新时的props,

第一种写法:

this.setState((prevState,props)=>({count:prevState.count+props.count}))

第二种写法:

this.setState((prevState,props)=>{return {count:prevState.count+props.count}})

3、执行setState()后能拿到最新的state 值吗?

setState()函数接受两个参数,一个是一个对象,就是设置的状态,还有一个是一个回调函数,是在设置状态成功之后执行的,所以我们可以通过回掉拿到最新的state值。

this.setState(
        { data: newData },
        () => {
            //这里打印的是最新的state值
            console.log(that.state.data);
        }
    );
如果你希望在setState之前做些什么 可以使用前者的写法:
this.setState((preState, props) => {
                    console.log(preState)  //在改变state中的数据之前,打印出当前的state
                    return {auto: true}
                }, () => console.log(this.state.auto));//在更新state之后,利用回调打印出this.state.auto
 
调用setState,组件的state并不会立即改变,setState只是把要修改的状态放入一个队列中,React会优化真正的执行时机,并且React会出于性能原因,可能会将多次setState的状态修改合并成一次状态修改。所以不要依赖当前的State,计算下个State。
例如:
function add() {
  this.setState({count: this.state.count + 1});
  this.setState({count: this.state.count + 1});
  this.setState({count: this.state.count + 1});
}
直观上来看,当上面的add函数被调用时,组件状态的count值被增加了3次,每次增加1,那后count被增加了3,但是,实际上的结果state只增加了1。
 
原因是因为调用this.setState时,并没有立即更改this.state,所以this.setState只是在反复设置同一个值而已,上面的code等同下面这样的。
function add() {
  const currentCount = this.state.count;
  this.setState({count: currentCount + 1});
  this.setState({count: currentCount + 1});
  this.setState({count: currentCount + 1});
}
currentCount就是一个快照结果,重复地给count设置同一个值,不管重复几次,得到的结果也只是增加1而已。
想要使最后的结果是3,实现代码如下:
add = () => {
        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

react中的this.setState()的更多相关文章

  1. React 中的this.setState

    在react中如何修改state中的数据     第一种写法:this.setState()         参数1:对象 需要修改的数据         参数2:回调 this.setState是一 ...

  2. 对于react中的this.setState的理解

    一.this.setState第二个参数的作用:修改数据更新后最新的DOM结构 二.this.setState为什么是异步的? 1.setState只在合成事件和钩子函数中是“异步”的,在原生事件和s ...

  3. react中state与setstate的使用

    我们可以利用state来定义一些变量的初始值 //放在construcor里 this.state = { list: [1, 2, 3] } 要更改state里的值,注意要遵循react里immut ...

  4. React中setState学习总结

    react中setState方法到底是异步还是同步,其实这个是分在什么条件下是异步或者同步. 1.先来回顾一下react组件中改变state的几种方式: import React, { Compone ...

  5. react中的setState的使用和深入理解

    前端框架从MVC过渡到MVVM.从DOM操作到数据驱动,一直在不断的进步着,提升着, angular中用的是watcher对象,vue是观察者模式,react就是state了,他们各有各的特点,没有好 ...

  6. React中的setState到底发生了什么?

    https://yq.aliyun.com/ziliao/301671 https://segmentfault.com/a/1190000014498196 https://blog.csdn.ne ...

  7. React中setState如何修改深层对象?

    在React中经常会使用到setState,因为在react生态中,state就是一切.在开发过程中,时长会在state中遇到一些比较复杂的数据结构,类似下面这样的: 这时需要我们修改list中obj ...

  8. React中setState的怪异行为 ——setState没有即时生效

    setState可以说是React中使用频率最高的一个函数了,我们都知道,React是通过管理状态来实现对组件的管理的,当this.setState()被调用的时候,React会重新调用render方 ...

  9. 3.React中的setstate的几个现象

    转载segfault 上面的一篇文章,https://segmentfault.com/a/1190000014498196 1.在同一个方法中多次setState是会被合并的,并且对相同属性的设置只 ...

随机推荐

  1. android学习笔记--AlarmManager

    AlarmManager称呼为全局定时器,有的称呼为闹钟.其实它的作用和Timer有点相似. 都有两种相似的用法: (1)在指定时长后执行某项操作(2)周期性的执行某项操作 AlarmManager ...

  2. Ubuntu16.04 部署配置GO语言开发环境 & 注意事项

    1. 安装GO 安装go语言包: $ curl -O https://storage.googleapis.com/golang/go1.10.1.linux-amd64.tar.gz   下载完成后 ...

  3. java~lambda表达式让查询更优雅

    在java之前的版本里,如果希望从集合时查找符合条件的数据,如果先遍历他,这种写法是我们不能接受的,所以现在java有了lambda就很好的解决了这个问题,让代码更优雅一些! /** * lambda ...

  4. 避免Linux上错删文件

    前言 在linux上我们常见的问题就是一个操作不小心误删除文件,而且在linux想要恢复文件没这么简单.只有当每次删除之后才后悔莫及,参考windows中最常见的做法就是给系统装一个回收站,让每次删除 ...

  5. Entity Framework 查漏补缺 (一)

    明确EF建立的数据库和对象之间的关系 EF也是一种ORM技术框架, 将对象模型和关系型数据库的数据结构对应起来,开发人员不在利用sql去操作数据相关结构和数据.以下是EF建立的数据库和对象之间关系 关 ...

  6. Spring Cloud Alibaba到底坑不坑?

    之前我发过一篇<说说我为什么看好Spring Cloud Alibaba>,然后这两天有网友给我转了这篇文章<坑爹项目spring-cloud-alibaba,我们也来一个>, ...

  7. 简简单单的Vue1(MVVM与Vue的双向绑定原理)

    既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 Vue 在此之前的文章我们讲述了前端开发的工具,语言的知识,接下来我们从头开始学习一个 ...

  8. 阿里、百度等多家公司Java面试记录与总结

    算算自己大概面试了近十家公司,也拿到了几个Offer,现在面试告一段落,简单总结下面试经验. 我现在主要的方向是Java服务端开发,把遇到的问题和大家分享一下,也谈谈关于技术人员如何有方向的提高自己, ...

  9. Oracle数据库的安装 【超详细的文图详解】

    Oracle简介Oracle Database,又名Oracle RDBMS,或简称Oracle.是甲骨文公司的一款关系数据库管理系统.它是在数据库领域一直处于领先地位的产品.可以说Oracle数据库 ...

  10. java基础-String不可变的好处

    一.java内部String类的实现: java 8: public final class String implements java.io.Serializable, Comparable< ...