React的setState学习及应用
React的setState学习及应用
一:作用:
setState()
将对组件 state 的更改排入队列,并通知 React 需要使用更新后的 state 重新渲染此组件及其子组件。这是用于更新用户界面以响应事件处理器和处理服务器数据的主要方式。
二: 特性
1、为了更好的感知性能,React 会延迟调用它,然后通过一次传递更新多个组件。React 并不会保证 state 的变更会立即生效。批量推迟更新:setState()
是异步的,并且在同一周期内会对多个 setState
进行批处理,后调用的 setState()
将覆盖同一周期内先调用 setState
的值。
import React, {Component} from 'react'; export default class Test extends Component {
constructor(props) {
super(props);
this.state = {
a: 0,
b: 0,
}
} componentDidMount() {
} onClick = () => {
this.setState({
a: this.state.a + 1
})
this.setState({
a: this.state.a + 1
})
this.setState({
b: this.state.b + 1
})
} render() {
console.log('重新渲染', `a=${this.state.a}`, `b=${this.state.b}`);
return (
<div onClick={this.onClick}>按钮</div>
)
} }
打印结果为:
2: 在调用 setState()
后立即读取 this.state,请使用
componentDidUpdate
或者 setState
的回调函数(setState(updater, callback)
),这两种方式都可以保证在应用更新后触发。
使用updater函数 (updater 函数中接收的 state
和 props
都保证为最新):
onClick = () => {
this.setState((state, props) => {
return {
a: state.a + 1,
b: state.b + 1,
}
}) this.setState((state, props) => {
return {
a: state.a + 1,
b: state.b + 1,
}
})
}
打印结果为:
这里并没有打印两次,说明updater函数也是批量推迟更新。
使用回调函数: setState()
的第二个参数为可选的回调函数,它将在 setState
完成合并并重新渲染组件后执行。通常,我们建议使用 componentDidUpdate()
来代替此方式。
onClick = () => {
this.setState({
a: this.state.a + 1,
b: this.state.b + 1,
}, () => {
this.setState({
a: this.state.a + 1,
b: this.state.b + 1,
})
})
}
打印结果为:
使用componentDidUpdate()。此生命周期和render()一样,都不能在内部使用setstate方法,不然会导致死循环,只能读,不能改。
componentDidUpdate() {
console.log('重新渲染结束', `a=${this.state.a}`, `b=${this.state.b}`);
} onClick = () => {
this.setState({
a: this.state.a + 1,
b: this.state.b + 1,
})
}
打印结果为:
三:setstate是异步还是同步?
有时表现出异步,有时表现出同步
1、setState
只在合成事件和钩子函数中是“异步”的,在原生事件和setTimeout
中都是同步的。
2、setState
的“异步”并不是说内部由异步代码实现,其实本身执行的过程和代码都是同步的,只是合成事件和钩子函数的调用顺序在更新之前,导致在合成事件和钩子函数中没法立马拿到更新后的值,形成了所谓的“异步”,当然可以通过第二个参数 setState(partialState, callback)
中的callback
拿到更新后的结果。
3、setState
的批量更新优化也是建立在“异步”(合成事件、钩子函数)之上的,在原生事件和setTimeout 中不会批量更新。
settimeout
onClick = () => {
setTimeout(() => {
this.setState({
a: this.state.a + 1,
b: this.state.b + 1,
})
this.setState({
a: this.state.a + 1,
b: this.state.b + 1,
})
})
}
打印结果为:
原生事件:
componentDidMount() {
const btn = document.getElementById('btn');
btn.addEventListener('click', this.onDomClick, false)
} onDomClick = () => {
this.setState({
a: this.state.a + 1,
b: this.state.b + 1,
})
this.setState({
a: this.state.a + 1,
b: this.state.b + 1,
})
} render() {
console.log('重新渲染', `a=${this.state.a}`, `b=${this.state.b}`);
return (
<div id='btn'>按钮</div>
)
}
打印结果为:
React的setState学习及应用的更多相关文章
- React中setState学习总结
react中setState方法到底是异步还是同步,其实这个是分在什么条件下是异步或者同步. 1.先来回顾一下react组件中改变state的几种方式: import React, { Compone ...
- React的setState分析
前端框架层出不穷,不过万变不离其宗,就是从MVC过渡到MVVM.从数据映射到DOM,angular中用的是watcher对象,vue是观察者模式,react就是state了. React通过管理状态实 ...
- React中setState同步更新策略
setState 同步更新 我们在上文中提及,为了提高性能React将setState设置为批次更新,即是异步操作函数,并不能以顺序控制流的方式设置某些事件,我们也不能依赖于this.state来计算 ...
- 初学React,setState后获取到的thisstate没变,还是初始state?
问题:(javascript)初学React,setState后获取到的thisstate没变,还是初始state?描述: getInitialState(){ return {data:[]}; } ...
- 「React Native笔记」在React的 setState 中操作数组和对象的多种方法(合集)
运用在React 中 setState的对象.数组的操作时是不能用类似array.push()等方法,因为push没有返回值,setState后会出现state变成Number,为了方便他人和自己查看 ...
- React中setState 什么时候是同步的,什么时候是异步的?
class Example extends React.Component { constructor() { super(); this.state = { val: 0 }; } componen ...
- 最新 React 源码学习笔记
最新 React 源码学习笔记 v17.x.x 框架架构 核心算法 设计模式 编码风格 项目结构 为什么出现 解决了什么问题 有哪些应用场景 refs https://github.com/learn ...
- React.js深入学习详细解析
今天,继续深入学习react.js. 目录: 一.JSX介绍 二.React组件生命周期详解 三.属性.状态的含义和用法 四.React中事件的用法 五.组件的协同使用 六.React中的双向绑定 ...
- React官网学习笔记
欢迎指导与讨论 : ) 前言 本文主要是笔者在React英文官网学习时整理的笔记.由于笔者水平有限,如有错误恳请指出 O(∩_∩)O 一 .Tutoial 篇 1 . React的组件类名的首字母必须 ...
随机推荐
- (python)查看糗事百科文字 点赞 作者 等级 评论
import requestsimport reheaders = { 'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; ...
- ASI中POST请求和文件下载
//POST请求 1 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 1.URL NSURL *url = ...
- ELK的简单搭建
Environment (都需要Java环境,jdk){ elasticsearch kibana 安装nginx用以测试 logstash } 1.首先拉取软件包,给予Java语言开发首选配置Ja ...
- 八分音符(频率)卷积算子 Octave Convolution
为什么读此系列文章? 优化数学和计算理论帮助机器学习完成问题分类: 1)按照领域划分,比如计算机视觉,自然语言处理,统计分析预测形: 2)按照算法复杂划分,比如是否是NP-Hard问题,是否需要精确解 ...
- linux中RabbitMQ安装教程
linux中RabbitMQ安装教程 在做一个微服务项目时候用到消息队列,于是深入了解了消息队列知识,并在linux上安装了Rabbitmq,本博客介绍Rabbitmq的安装教程,想要深入了解消息队列 ...
- vue 各种打包坑
1,报错 Refused to load the image 'http://localhost:8080/favicon.ico' because it violates the following ...
- React、React Native面试题
1.React Native相对于原生的ios和Android有哪些优势. react native一套代码可以开发出跨平台app, 减少了人力.节省了时间.避免了 iOS 与 Android 版本发 ...
- swift实现单例的四种方式
单例模式 单例模式是设计模式中最简单的一种,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象. 当你只需要一个实例的时候需要使用单例 ...
- EditText 无法失焦与失焦后键盘不收缩解决方案
背景 有一个需求,比方说下图: 点击了上图的Image 区域才可以编辑. 那么我首先想到的就是: android:focusable="false" 不让它获取到焦点不就ok吗? ...
- JavaScript数组去重的7种方式
1.利用额外数组 function unique(array) { if (!Array.isArray(array)) return; let newArray = []; fo ...