react学习笔记之state以及setState的使用


Posted in Javascript onDecember 07, 2017

在react中通过 state 以及 setState() 来控制组件的状态。

state

state 是 react 中用来存储组件数据状态的,可以类比成 vue 中的 data。

1.state的作用

state是React中组件的一个对象.React把用户界面当做是状态机,想象它有不同的状态然后渲染这些状态,可以轻松让用户界面与数据保持一致.

React中,更新组件的state,会导致重新渲染用户界面(不要操作DOM).简单来说,就是用户界面会随着state变化而变化.

2.state工作原理

常用的通知React数据变化的方法是调用setState(data,callback).这个方法会合并data到this.state,并重新渲染组件.渲染完成后,调用可选的

callback回调.大部分情况不需要提供callback,因为React会负责吧界面更新到最新状态.

setState()

与 vue 中不同的是 state 不能直接被修改,需要通过 setState() 的方法去修改。

1、setState() 更新组件状态之后不会立即生效,react 为提高性能会按批次更新 state 然后 render, 即异步操作,所以 setSate() 之后立即去取state的值并不是更新之后的状态。

2、setState() 第一个参数接受两种类型的参数,Object以及Function

Object

this.setState({
 msg: '更新state msg'
})

当参数是Object的时候, 可以即为对应 state 中的 key, value 即是新的值。

Function

当参数是函数的时候, setState() 会将上一个 setState() 的结果作为参数传入这个函数

...
constructor () {
 this.state = { counter: 0 }
}
add() {
 this.setState({ counter: this.state.counter + 1 })
 this.setState({ counter: this.state.counter + 1 }) // 此时`this.state.counter`的值还是初始值0,,所以这个操作是无效的
 this.setState(prevState => { counter: prevState.counter + 1 }) // `prevState.counter` 为上次更新之后的值,即是1
}
...

setState() 第二个参数是一个回调函数,表示 state 更新完成

this.setState({
 msg: '更新state msg'
}, () => {
 console.log('state 更新完毕')
})

根据这个可以使用Promise以及async/await,封装成同步操作

setStateAsync(state) {
 return new Promise(resolve => {
  this.setState(state, resolve)
 })
}
// 使用
async add() {
 await setStateAsync({ counter: this.state.counter + 1 })
 console.log('state 更新完毕')
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS防止用户多次提交的简单代码
Aug 01 Javascript
javascript实现简单的html5视频播放器
May 06 Javascript
jquery+ajax实现直接提交表单实例分析
Jun 17 Javascript
JavaScript基于原型链的继承
Jun 22 Javascript
轻松理解JavaScript之AJAX
Mar 15 Javascript
浅谈 vue 中的 watcher
Dec 04 Javascript
利用Blob进行文件上传的完整步骤
Aug 02 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
Nov 13 Javascript
如何使用puppet替换文件中的string
Dec 06 Javascript
js中async函数结合promise的小案例浅析
Apr 14 Javascript
详解如何提升JSON.stringify()的性能
Jun 12 Javascript
JavaScript实现图片放大预览效果
Nov 02 Javascript
React Native 截屏组件的示例代码
Dec 06 #Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
Dec 06 #jQuery
mui back 返回刷新页面的实例
Dec 06 #Javascript
javascript实现Emrips反质数枚举的示例代码
Dec 06 #Javascript
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 #jQuery
JS实现登录页密码的显示和隐藏功能
Dec 06 #Javascript
微信小程序 scroll-view实现锚点滑动的示例
Dec 06 #Javascript
You might like
Discuz 模板引擎的封装类代码
2008/07/18 PHP
PHP三元运算符的结合性介绍
2012/01/10 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
老生常谈PHP面向对象之命令模式(必看篇)
2017/05/24 PHP
基于jQuery的简单的列表导航菜单
2011/03/02 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
vue实现百度搜索下拉提示功能实例
2017/06/14 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
urllib2自定义opener详解
2014/02/07 Python
基于Python的关键字监控及告警
2017/07/06 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
基于MSELoss()与CrossEntropyLoss()的区别详解
2020/01/02 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
django API 中接口的互相调用实例
2020/04/01 Python
关于Theano和Tensorflow多GPU使用问题
2020/06/19 Python
python和JavaScript哪个容易上手
2020/06/23 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
东方红海科技面试题软件测试方面
2012/02/08 面试题
一套Delphi的笔试题一
2016/02/14 面试题
2014年教师培训的自我评价
2014/01/03 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
服务行业口号
2014/06/11 职场文书
财务会计专业自荐书
2014/06/30 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
装修安全责任协议书
2016/03/22 职场文书
基于Python绘制子图及子图刻度的变换等的问题
2021/05/23 Python
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript