博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【05】react 之 组件state
阅读量:6418 次
发布时间:2019-06-23

本文共 1877 字,大约阅读时间需要 6 分钟。

1.1.  状态理解

React的数据流:由父节点传递到子节点(由外到内传递),如果顶层组件某个prop改变了,React会向下传递,重新渲染所有使用过该属性的组件。除此之外React 组件内部还具有自己的状态,这些状态只能在组件内部修改。通过与用户的交互(点击),实现不同状态(显示、隐藏、数量增加...),然后渲染UI,让用户界面和数据保持一致。React中只需更新组件的state,然后根据新的 state 重新渲染用户界面。

this.props  属性:由父节点传入到组件内部,只读,不可修改。

this.state   状态:由组件自己创建,可以修改,一般由用户交互产生新的状态(数据)。

1.2.  状态案例

开发一个开关组件,组件有两种状态,开、关。修改状态方式,通过this.setState({}),请勿使用this.state.

                      

1.3.  state与props区别

state 和 props 主要的区别在于 props 是不可变的,而 state 可以根据与用户交互来改变。这就是为什么有些容器组件需要定义 state 来更新和修改数据。而组件只能通过 props 来传递数据。

1.4state注意事项

上面已经说明了setState的基本使用。但是 setState 不会立即改变 this.state ,而是挂起状态转换,调用 setState 方法后立即访问 this.state 可能得到的是旧的值。如下面的例子:

setState 方法不会阻塞state更新完毕

第二个 setState 可能还没等待第一次的state更新完毕就开始执行了,所以最后count可能只加了1。

this.setState({    count: this.state.count + 1});this.setState({    count: this.state.count + 1});

setState方法还有第二个参数,相当于回调函数:

this.setState({    count: this.state.count + 1}, () => {  this.setState({    count: this.state.count + 1  });});

不过看起来很怪, es6 中可以使用 Promise 更优雅的使用这个函数,封装一下 setState

function setStateAsync(nextState){    return new Promise(resolve => {    this.setState(nextState, resolve);  });}

上面的例子就可以这样写

async func() {    ...  await this.setStateAsync({count: this.state.count + 1});  await this.setStateAsync({count: this.state.count + 1});}

顺眼多了。

函数方式

nextState 也可以是一个 function ,称为状态计算函数,结构为 function(state, props) => newState 。这个函数会将每次更新 加入队列 中,执行时通过当前的 state 和 props 来获取新的 state 。那么上面的例子就可以这样写

this.setState((state, props) => {    return {count: state.count + 1};});this.setState((state, props) => {    return {count: state.count + 1};});

每次更新时都会提取出当前的state,进行运算得到新的state,就保证了数据的同步更新。

控制渲染

默认调用 setState 都会重新渲染视图,但是通过 shouldComponentUpdate() 函数返回 false来避免重新渲染。

如果可变对象无法在 shouldComponentUpdate() 函数中实现条件渲染,则需要控制 newState与 prevState 不同时才调用 setState 来避免不必要的重新渲染。

转载于:https://www.cnblogs.com/yeziTesting/p/7351482.html

你可能感兴趣的文章
9.Java通过axis调用WebService
查看>>
.net反混淆脱壳工具de4dot的使用
查看>>
使用Spring+MySql实现读写分离(一)关于windows下安装mysql5.6
查看>>
查询mssql的死锁语句
查看>>
Linux内核中实现生产者与消费者(避免无效唤醒)【转】
查看>>
mysql 密码重置
查看>>
『TensorFlow』TFR数据预处理探究以及框架搭建
查看>>
黑马程序猿——15,String,StringBuffer,基本数据类型包装对象
查看>>
公式编辑器打的公式能改变颜色吗?
查看>>
05-maven学习-构建web项目
查看>>
Error处理: “非法字符: \65279”的解决办法
查看>>
H264 RTP封包原理(转载)
查看>>
HTML5与XML的区别
查看>>
原生JS和jQuery版实现文件上传功能
查看>>
【POJ 1716】Integer Intervals(差分约束系统)
查看>>
Docker导入、导出、删除容器
查看>>
anaconda tensorflow tflearn 自动安装脚本 anaconda使用-b可以非交互式安装
查看>>
spring boot 发布成包所需插件
查看>>
黄聪:公众号怎么用微信做出点击此处查看答案
查看>>
mysql中去重复记录
查看>>