在react中,修改状态如果直接使用this.state,不会引起组件的重新渲染,需要通过 this.setState来对组件的属性进行修改。

1、this.setState的两种定义方式

定义初始状态

 state = { count: 0 }

如果此时有一个按钮,点击按钮让计数加1,我们可以有两种写法

(1)传递对象 this.setState({ count: this.state.count + 1})
(2)传递函数 this.setState((state, props) => ({ count: count + 1 }))

2、setState的两种方式有什么不同?

如果变更的state的值需要依赖于上一次的state的值,这种情况就需要用到函数的形式,比如以下这种情况

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

此时只会执行一次+1的操作,因为在React内部,会将多次setState合并操作,新的state由 Object.assgin({}, {count: 0},  { count: 1}) 合并所得,以上赋值会执行三次,但因为count的值没有更新,所以最终执行的结果只+1,如果setState的赋值是函数,那情况就不一样了

addCount(){
this.setState((state, props) => ({ count: count + 1 }))
this.setState((state, props) => ({ count: count + 1 }))
this.setState((state, props) => ({ count: count + 1 }))
}

这样的操作会得到+3的效果,因为React会进行判断,如果传入的是函数,那么将执行此函数,此时count的值就已经被修改了

3、setState是同步还是异步的?

☆☆☆☆☆ 是异步的

(1) 即我们通过this.setState修改了状态之后,在它的下一行输出state的值并不会得到新的值

(2) 为什么是异步?

有两个原因,一是提高效率,每次修改state的值都会造成render的重新渲染,将多次修改state的值合并统一更新可以提高性能;二是render的更新会晚一些,如果render中有子组件,子组件的props依赖于父组件的state,props和state就不能保持一致

(3) 如何获取异步时的state值?

① 在setState的回调函数中,

this.setState({ count: this.state.count + 1}, ()=>{ console.log(this.state.count) })

② 在componentDidUpdate中获取

componentDidUpdate(){
console.log(this.state.count)
}

☆☆☆☆☆ 是同步的

(1) 即我们通过this.setState修改状态之后,在它的下一行输出state是新的值

(2) 什么场景下是同步的?

① 原生js获取dom元素,并绑定事件

<button id="addBtn">点我+1</button>
componentDidMount(){
const addBtn = document.getElementById('addBtn')
changeBtn.addEventListener('click',()=>{
this.setState({ count: this.state.count + 1})
console.log(this.state.message)
})
}

② 计时器 setTimeout

<button onClick={ e => this.addOne() }>点我+1</button>
addOne(){
setTimeout(()=>{ this.setState({ count: this.state.count + 1 })
console.log(this.state.count ) },0)
}

React中setState的使用与同步异步的更多相关文章

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

    class Example extends React.Component { constructor() { super(); this.state = { val: 0 }; } componen ...

  2. React中setState学习总结

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

  3. React中setState同步更新策略

    setState 同步更新 我们在上文中提及,为了提高性能React将setState设置为批次更新,即是异步操作函数,并不能以顺序控制流的方式设置某些事件,我们也不能依赖于this.state来计算 ...

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

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

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

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

  6. react中setState用法

    setState()更新状态的2种写法 setState(updater, [callback]), updater为返回stateChange对象的函数: (state, props) => ...

  7. React中setState方法说明

    setState跟新数据是同步还是异步? setState跟新数据是异步的. 如何用代码表现出来是异步的. 点击按钮更新数据,然后去打印这个值看一下 setState跟新数据是异步的 class Fa ...

  8. React中setState注意事项

    setState是一个异步函数,异步获取数据 学习react在使用ref和setState操作DOM时会遇到的问题: ref获取ul结点元素 错误写法:得到的ul长度总是上一次输入后的长度 结果: 正 ...

  9. Ajax请求中的async:false/true(同步/异步)的作用

    async. 默认是true,即为异步方式,$.Ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发$.Ajax里的success方法,这时候执行的是两个线程.若要将其设置为fa ...

  10. 「React Native笔记」在React的 setState 中操作数组和对象的多种方法(合集)

    运用在React 中 setState的对象.数组的操作时是不能用类似array.push()等方法,因为push没有返回值,setState后会出现state变成Number,为了方便他人和自己查看 ...

随机推荐

  1. 用go设计开发一个自己的轻量级登录库/框架吧(项目维护篇)

    用go设计开发一个自己的轻量级登录库/框架吧(项目维护篇) 本篇将开始讲讲开发库/框架的最开始阶段,也就是搭建一个项目 源码:weloe/token-go: a light login library ...

  2. 2022-10-28:以下go语言代码输出什么?A:false false;B:true false;C:true true;D:false true。 package main import “f

    2022-10-28:以下go语言代码输出什么?A:false false:B:true false:C:true true:D:false true. package main import &qu ...

  3. Casdoor 开始

    Casdoor 是一个基于 OAuth 2.0 / OIDC 的中心化的单点登录(SSO)身份验证平台,简单来说,就是 Casdoor 可以帮你解决用户管理的难题,你无需开发用户登录.注册等与用户鉴权 ...

  4. Jenkins - Windows环境修改主目录路径

    Jenkins - Windows环境修改主目录路径 前言 如果Jenkins部署在Windows环境中,Jenkins主目录默认在 C:\Users\用户名\.jenkins下: 所有Jenkins ...

  5. odoo开发教程九:Odoo10 API

    一:纪录集API model中的数据是以集合的形式使用的,因此可以使用集合运算来操作. 集合运算符 record in set返回record是否在set中,record须为单条记录,record n ...

  6. CAPL 脚本对信号收发的判断

    在CAPL脚本中,您可以使用条件语句和CAN消息的收发函数来进行信号的判断和处理.以下是一些常见的CAPL脚本语句用于信号收发的判断: 1.判断消息是否收到 on message can_messag ...

  7. celery笔记三之task和task的调用

    本文首发于公众号:Hunter后端 原文链接:celery笔记三之task和task的调用 这一篇笔记介绍 task 和 task 的调用. 以下是本篇笔记目录: 基础的 task 定义方式 日志处理 ...

  8. PySide6(Qt for Python) QTableWidget表头边框线问题

    这个问题是在Windows10平台下特有问题. 网络上有很多Qt C++的解决方案.但是没有特定的PySide6的解决方案(以下是Qt C++的解决方案). https://blog.csdn.net ...

  9. 【技术积累】Java中的集合框架【一】

    什么是Java集合框架? Java集合框架是Java编程语言中提供的一组接口.实现和算法,用于存储和操作数据集合.集合框架可以让程序员更加高效地组织和操作数据,而无需手动实现底层数据结构. Java集 ...

  10. Spring Cloud灰度部署

    1.背景(灰度部署) 在我们系统发布生产环境时,有时为了确保新的服务逻辑没有问题,会让一小部分特定的用户来使用新的版本(比如客户端的内测版本),而其余的用户使用旧的版本,那么这个在Spring Clo ...