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数字输入框(包括最大值最小值限制和四舍五入)
Nov 24 Javascript
ExtJS GridPanel 根据条件改变字体颜色
Mar 08 Javascript
Area 区域实现post提交数据的js写法
Apr 22 Javascript
jquery滚动特效集锦
Jun 03 Javascript
JavaScript中反正弦函数Math.asin()的使用简介
Jun 14 Javascript
分享javascript计算时间差的示例代码
Mar 19 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
Apr 11 Javascript
Angular2实现组件交互的方法分析
Dec 19 Javascript
vue-infinite-loading2.0 中文文档详解
Apr 08 Javascript
修改npm全局安装模式的路径方法
May 15 Javascript
详解小程序原生使用ES7 async/await语法
Aug 06 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
Dec 10 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
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
vue中使用v-for时为什么不能用index作为key
2020/04/04 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
python中遍历文件的3个方法
2014/09/02 Python
python实现的简单文本类游戏实例
2015/04/28 Python
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
Python numpy 提取矩阵的某一行或某一列的实例
2018/04/03 Python
Django的models模型的具体使用
2019/07/15 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
python爬虫工具例举说明
2020/11/30 Python
python 实现有道翻译功能
2021/02/26 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
工作中的自我评价如何写好
2013/10/28 职场文书
会计找工作求职信范文
2013/12/09 职场文书
英语专业学生的自我评价
2013/12/30 职场文书
工程管理英文求职信
2014/03/18 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
2014年化验员工作总结
2014/11/18 职场文书
教师个人师德总结
2015/02/06 职场文书
龙猫观后感
2015/06/09 职场文书
2016年学校综治宣传月活动总结
2016/03/16 职场文书
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL