React组件setState
注意:
1. 自定义组件首字母必须大写。这里是以函数表达式的方式定义子组件的。
2. 使用 ES6 的 class 关键字创建的 React 组件,组件中的方法遵循与常规 ES6 class 相同的语法规则。这意味着这些方法不会自动绑定 this 到这个组件实例。 你需要显式地调用 .bind(this)
一、setState(updater, [callback])
1. updater的实质是一个函数
setState((state, props) => ({quantity: state.quantity + 2}) ) // 返回的是状态改变对象,并与之前的state合并
但更多的时候,我们使用其简写形式,传入的是一个对象
setState({quantity: 2})
如果新的状态不依赖原始state, 使用简写(对象)方式;如果新的状态依赖原始State, 使用函数方式写。
2. setState() 并不总是立即更新组件。它会批量推迟更新。这使得在调用 setState() 后立即读取 this.state 成为了隐患。
为了能正确获取更新后的state数据,在componentDidUpdate 或者在setState 的回调函数callback中去获取state值,保证获取的state是更新后的值。
this.setState((state) => ({
quantity: state.quantity + 1
}), () => {
console.log('after state update', state.quantity);
}
)
3. setState()是同步的,还是异步的?
react相关的回调(声明周期、react事件监听回调):异步 其他异步回调(setTimeout, Promise.then事件回调 / await之后, DOM事件监听):同步
4. 多次调用异步的setState, 无论调用多少次setState,只执行一次render.
// 初始
this.state = {
count: 1
}
4.1 使用对象的方式(状态更新合并成一次)
update1 = () =》 {
this.setState({count : this.state.count +1});
this.setState({count : this.state.count +1});
}
// render中得到的state.count = 2
4.2 使用函数的形式(状态更新是多次进行的【updater 函数中接收的 state 和 props 都保证为最新】,render合并为一次)
update2 = () => {
this.setState((state) => ({
count: state.count + 1
})
this.setState((state) => ({
count: state.count + 1
})
}
// render中的结果为3(加法执行了两次)
4.3 混用对象形式和函数形式
update3 = () => {
// 先执行对象形式,后执行函数形式
this.setState({count : this.state.count +1});
this.setState((state) => ({
count : state.count +1
}));
}
// render中的state.count = 3
update4 = () => {
//先执行函数形式, 再执行对象形式
this.setState((state) => ({
count : state.count +1
}));
this.setState({count : this.state.count +1});
}
// render中的state.count = 2
拓展:面试题
class Test extends React.Component {
state = {
count: 0
};
// handleClick = () => {};
componentDidMount() {
// 异步
this.setState({
count: this.state.count + 1
});
this.setState({
count: this.state.count + 1 //
});
console.log(this.state.count); // 2==>0
// 异步
this.setState(state => ({ count: state.count + 1 })); //
this.setState(state => ({ count: state.count + 1 })); //
console.log(this.state.count); // 3==>0
setTimeout(() => {
this.setState({ count: this.state.count + 1 }); //
console.log("timeout", this.state.count); // 10==>6
this.setState({ count: this.state.count + 1 }); //
console.log("timeout", this.state.count); // 12==>7
});
Promise.resolve().then(value => {
this.setState({ count: this.state.count + 1 }); //
console.log("promise", this.state.count); // 6==>4
this.setState({ count: this.state.count + 1 }); //
console.log("promise", this.state.count); // 8==>5
});
}
render() {
const { count } = this.state;
console.log("render", count); // 1==>0 4==>3 5==>4 7==>5 9==>6 11=>7
return (
<div>
<p>{count}</p>
{/* <button onClick={() => this.handleClick}>更新</button> */}
</div>
);
}
}
注意:多个setState执行后,他们的组合结果一次性地传递给render进行重新渲染。
React组件setState的更多相关文章
- 在React组件unmounted之后setState的报错处理
最近在做项目的时候遇到一个问题,在 react 组件 unmounted 之后 setState 会报错.我们先来看个例子, 重现一下问题: class Welcome extends Compone ...
- React组件属性部类(propTypes)校验
React组件属性类型(propTypes)校验 Prop 验证 随着应用不断变大,保证组件被正确使用变得非常有用.为此我们引入propTypes.React.PropTypes 提供很多验证器 (v ...
- 野心勃勃的React组件生命周期
当你还在写着Angular指令,过滤器,注入,服务,提供者,视图模版的时候,是不是觉得很烦,好在这个时候,React已经神一样的出现在历史舞台. React组件 React实现了UI=Fn(St ...
- React组件生命周期过程说明
来自kiinlam github94 实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidM ...
- React组件系统、props与状态(state)
多个组件合成一个组件: var style = { fontSize: 20, color: '#ff0000' }; var WebSite = React.createClass({ rende ...
- React组件开发
目录: 属性:props 内联样式 状态记忆 : state 生命周期 访问DOM 表单输入 承接快速入门篇:http://www.cnblogs.com/jasonnode/p/4444504.ht ...
- React组件生命周期过程说明【转】
实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidMount 实例化完成后的更新 getI ...
- react组件什么周期记录,转的
react 的核心除了虚拟DOM,我想还有一个很重要的就是生命周期函数,理解生命周期函数,对写出合理的commponet很有帮助.下面总结一下我对生命周期函数的一些理解已经在项目过程中遇到的一些问题. ...
- React组件开发入门
React 组件开发入门 Introduction 本文组成: Ryan Clark文章Getting started with React的翻译. 博主的实践心得. React由Facebook的程 ...
随机推荐
- python爬虫(1)requests库
在pycharm中安装requests库的一种方法 首先找到设置 搜索然后安装,蓝色代表已经安装 requests库中的get请求 与HTTP协议相对应,requests库也有七种请求方式. 获取ur ...
- MySql -- 数据结构
现在的数据表不单单只是存储数据,还有的是设计功能和快速处理数据的结构功能: 首先,我们在设计数据库的时候,我们要先分清楚,那些是要单纯的存储数据的(固定),然后再设计出来数据的表(流动) 你懂我意思吧 ...
- 关于宝塔下的项目中的php不能访问的问题
遇到的问题是访问项目根目录的所有php文件都是报404错,而其他文件则可以,比如txt,最后查资料发现 在宝塔运行网站的时候会在项目的根目录自动生成一个.user.ini文件,这个文件主要是防止对指定 ...
- while循环脚本
[root@oldboy ~]# (while :;do date;sleep 5;done)& fg ctrl c退出 fg ( while :; do date; sleep 5; don ...
- 【蜕变之路】第20天 UUID和时间戳的生成 (2019年3月10日)
Hello,大家好!我是程序员阿飞!今天主要学习的内容是:字符串UUID的随机生成和时间戳的随机生成.好了,直接进入正题. 1.UUID的随机生成 /* * uuid的随机生成方式 ...
- Rust 1.31正式发布,首次引入Rust 2018新功能
Rust 1.31是第一个实现了Rust 2018独有新功能并且不保证与现有代码库兼容的版本.Rust 2018相关工作正在进行中,而Rust 1.31只是整个三年开发周期的开始,这个开发周期将对这门 ...
- Yii项目Security加密解密类提取
<?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * ...
- uboot on qemu
1, download uboot ftp://ftp.denx.de/pub/u-boot/ 2, compile uboot make vexpress_ca9x4_config export A ...
- 第七周CorelDRAW课总结
1.这节课学到了什么知识? "交互式透明工具""交互式阴影工具"以及"交互式调和工具"制作水晶表情包. 2.有什么心得体会? 无 3.存在的 ...
- echarts自定义tooltip显示
使用echarts展示图形的时候,鼠标滑倒图像上,想展示除了系列名,数据名,数据值以外的数据,这时需要使用tooltip的fommater方式进行配置,另外对数据格式也有一定的要求. 如图所示:如果想 ...