注意:

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的更多相关文章

  1. 在React组件unmounted之后setState的报错处理

    最近在做项目的时候遇到一个问题,在 react 组件 unmounted 之后 setState 会报错.我们先来看个例子, 重现一下问题: class Welcome extends Compone ...

  2. React组件属性部类(propTypes)校验

    React组件属性类型(propTypes)校验 Prop 验证 随着应用不断变大,保证组件被正确使用变得非常有用.为此我们引入propTypes.React.PropTypes 提供很多验证器 (v ...

  3. 野心勃勃的React组件生命周期

    当你还在写着Angular指令,过滤器,注入,服务,提供者,视图模版的时候,是不是觉得很烦,好在这个时候,React已经神一样的出现在历史舞台. React组件    React实现了UI=Fn(St ...

  4. React组件生命周期过程说明

    来自kiinlam github94 实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidM ...

  5. React组件系统、props与状态(state)

     多个组件合成一个组件: var style = { fontSize: 20, color: '#ff0000' }; var WebSite = React.createClass({ rende ...

  6. React组件开发

    目录: 属性:props 内联样式 状态记忆 : state 生命周期 访问DOM 表单输入 承接快速入门篇:http://www.cnblogs.com/jasonnode/p/4444504.ht ...

  7. React组件生命周期过程说明【转】

    实例化 首次实例化 getDefaultProps getInitialState componentWillMount render componentDidMount 实例化完成后的更新 getI ...

  8. react组件什么周期记录,转的

    react 的核心除了虚拟DOM,我想还有一个很重要的就是生命周期函数,理解生命周期函数,对写出合理的commponet很有帮助.下面总结一下我对生命周期函数的一些理解已经在项目过程中遇到的一些问题. ...

  9. React组件开发入门

    React 组件开发入门 Introduction 本文组成: Ryan Clark文章Getting started with React的翻译. 博主的实践心得. React由Facebook的程 ...

随机推荐

  1. react引入图片不显示问题

    在react 中引入图片的方式和正常不同,,很容易引入不显示 引入本地图片 1.(采用组件式引入方法) import Logo from "图片路径" <img src={L ...

  2. Fabric的6大特性

    文章目录 什么是Hyperledger Fabric 1. 成员准入 2. 性能,可伸缩性和信任级别 3 需要了解的数据 4 通过不可变的分布式账本进行复杂查询 5 支持插件组件的模块化架构 6 保护 ...

  3. 第八章服务器raid及配置实战

      版本 特点 磁盘个数 可用空间 故障磁盘数 应用环境 RAID0 读写速度快,数据容易丢失 两个 全部 一块 测试,临时性 RAID1 读写速度慢,数据可靠 至少两个,可以2的倍数 总容量的一半 ...

  4. 09-5.部署 EFK 插件

    09-5.部署 EFK 插件 EFK 对应的目录:kubernetes/cluster/addons/fluentd-elasticsearch $ cd /opt/k8s/kubernetes/cl ...

  5. mac OS npm 安装/卸载失败 权限问题解决方案

    在终端输入 sudo chown -R $USER /usr/local 输入开机密码

  6. Windows 10配置VS Code C++环境(超详细,面向小白以及大佬们)

    看完这个,还有下一篇:门在这 我看了网上的大佬们配的我是在是看不懂啊?我是一个小白啊?这太难了,这阻挡不了我,想使用这很骚的IDE,于是在不断的摸索下,终于配置成功,小白们也不用慌,这次非常简单.一定 ...

  7. 图论--2-SAT--详解

    问题描述: 现有一个由N个布尔值组成的序列A,给出一些限制关系,比如A[x]AND A[y]=0.A[x] OR A[y] OR A[z]=1等,要确定A[0..N-1]的值,使得其满足所有限制关系. ...

  8. Element upload组件上传图片与回显图片

    场景:新增商品时需要添加商品主图,新增成功之后可编辑 上传图片: <el-form-item label="专区logo:" style="height:160px ...

  9. 迁移WPF项目到.NET CORE

    综述 .NET CORE 3.0开始,桌面端支持WPF了.很多.NET FRAMEWORK的项目已经跑了一阵子了,不是很有必要支持.NET CORE,不过最近用一个程序,为了贯彻一些C# 8的特性,需 ...

  10. 化妆品行业的一个MES系统案例(三)

    项目的主要需求如下: (1) 管理产品的配方(物料BOM) (2) 管理产品的生产工艺(最终要将工艺参数下发到设备PLC自动执行) (3) 根据生产工单集合产品配方生成称量任务(其实领料之后的成料过程 ...