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 相关文章推荐
javascript第一课
Feb 27 Javascript
基于jQuery的获取标签名的代码
Jul 16 Javascript
在jQuery中 关于json空对象筛选替换
Apr 15 Javascript
浅析用prototype定义自己的方法
Nov 14 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
Nov 17 Javascript
javascript操作css属性
Dec 30 Javascript
将数字转换成大写的人民币表达式的js函数
Sep 21 Javascript
微信小程序 textarea 详解及简单使用方法
Dec 05 Javascript
探究react-native 源码的图片缓存问题
Aug 24 Javascript
JavaScript判断变量名是否存在数组中的实例
Dec 28 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
Oct 29 Javascript
JavaScript数组类型Array相关的属性与方法详解
Sep 08 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
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
php whois查询API制作方法
2011/06/23 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
PHP反射API示例分享
2016/10/08 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
[51:53]完美世界DOTA2联赛决赛日 Inki vs LBZS 第二场 11.08
2020/11/10 DOTA
Python中用Ctrl+C终止多线程程序的问题解决
2013/03/30 Python
Python内置数据类型详解
2014/08/18 Python
python根据出生日期返回年龄的方法
2015/03/26 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
Python视频编辑库MoviePy的使用
2020/04/01 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
HOTEL INFO英国:搜索全球酒店
2019/08/08 全球购物
Dogeared官网:在美国手工制作的珠宝
2019/08/24 全球购物
大二自我鉴定范文
2013/10/05 职场文书
2015年安全生产责任书
2015/01/30 职场文书
文体活动总结
2015/02/04 职场文书
入党个人总结范文
2015/03/02 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
Python Matplotlib库实现画局部图
2021/11/17 Python