【05】react 之 组件state
1.1. 状态理解
React的数据流:由父节点传递到子节点(由外到内传递),如果顶层组件某个prop改变了,React会向下传递,重新渲染所有使用过该属性的组件。除此之外React 组件内部还具有自己的状态,这些状态只能在组件内部修改。通过与用户的交互(点击),实现不同状态(显示、隐藏、数量增加...),然后渲染UI,让用户界面和数据保持一致。React中只需更新组件的state,然后根据新的 state 重新渲染用户界面。
this.props 属性:由父节点传入到组件内部,只读,不可修改。
this.state 状态:由组件自己创建,可以修改,一般由用户交互产生新的状态(数据)。
1.2. 状态案例
开发一个开关组件,组件有两种状态,开、关。修改状态方式,通过this.setState({}),请勿使用this.state.
<!DOCTYPE html>
<html>
<head>
<script src="../build/react-0.14.0.js"></script>
<script src="../build/react-dom.js"></script>
<script src="../build/browser.min.js"></script>
</head>
<body>
<div id="example">
</div>
<script type="text/babel">
class MySwitch extends React.Component{
constructor(props){
super(props);
this.state = {
isEdit:false //false :关闭 true:打开
};
this.handleClick = this.handleClick.bind(this);
}
render(){
return (<button onClick={this.handleClick}>{this.state.isEdit?'关闭':'打开'}</button>)
} handleClick(e){
this.setState({
isEdit:!this.state.isEdit
});
}
}
ReactDOM.render(<MySwitch/>,document.getElementById('example'))
</script>
</body>
</html>
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
来避免不必要的重新渲染。
【05】react 之 组件state的更多相关文章
- React子组件怎么改变父组件的state
React子组件怎么改变父组件的state 1.父组件 class Father extends React.Component { construtor(props){ super(props); ...
- React 三大属性state,props,refs以及组件嵌套的应用
React 三大属性state,props,refs以及组件嵌套的应用 该项目实现了一个简单的表单输入添加列表的内容 代码如下 <!DOCTYPE html> <html> & ...
- 移动web端的react.js组件化方案
背景: 随着互联网世界的兴起,web前端开发的方式越来越多,出现了很多种场景开发的前端架构体系,也对前端的要求日益增高,早已经不是靠一个JQuery.js来做前端页面的时代了,而今移动端变化最大,近 ...
- React Native组件之Switch和Picker和Slide
React Native组件Switch类似于iOS中的UISwitch:组件Slide类似于iOS中UIslider,组件Picker类似于iOS的UIPickerView.他们的使用方法和相关属性 ...
- 初识React,Virutal DOM, State以及生命周期
这是React分类下的第一篇文章,是在了解了一些基本面后,看Tyler文章,边看边理解边写的. React可以看做是MVC中的V,关注的是视图层.React的组件就像Angular的Directive ...
- reactjs入门到实战(七)---- React的组件的生命周期
React的组件的生命周期有三个状态分别是:挂载(生产组件示例化.准备挂载到页面.挂载到页面).更新(更新值.更新DOM).和卸载(卸载后). >>>其他 getInitia ...
- react 编写组件 五
看以下示例了解如何定义一个组件 // 定义一个组件LikeButton var LikeButton = React.createClass({ // 给state定义初始值 getInitialSt ...
- React入门---属性(state)-7
state------>虚拟dom------>dom 这个过程是自动的,不需要触发其他事件来调用它. state中文理解:页面状态的的一个值,可以存储很多东西. 学习state的使用: ...
- React Native组件、生命周期及属性传值props详解
创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { r ...
随机推荐
- oc字典放入到数组里,根据字典里的属性排序(重点)
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...
- Angular2 Service获取json数据
在Angular2框架下一般交互解析json是要用到Service的,其实除了Service还是很多的,今天先写个最简单的前后端数据交互 嗯~~ 首先我先在app包下直接创建Service 好了 这里 ...
- 抽屉head部分,hover应用,鼠标放上变色
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- docker部署Ceph分布式存储集群
1.环境准备 3台virtualbox虚拟机,用来安装ceph集群,已用docker-machine安装上了docker,每台虚拟机虚拟创建一个5G的硬盘,用于存储osd数据,例如:/dev/sdb ...
- Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本
Shell脚本使用汇总整理——mysql数据库5.7.8以前备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/92234 ...
- 零基础快速掌握Python系统管理视频课程【猎豹网校】
点击了解更多Python课程>>> 零基础快速掌握Python系统管理视频课程[猎豹网校] 课程目录 01.第01章 Python简介.mp4 02.第02章 IPython基础.m ...
- tp5 修改自带success或error跳转模板页面
tp5 修改自带success或error跳转模板页面 我们在使用tp5或者tp3.2的时候,用的成功或者失败跳转提示页面一般是用框架的.在后续开发过程中,根据实际项目需要,也是可以更改的,在此分享一 ...
- Tufurama CodeForces - 961E
Tufurama CodeForces - 961E 题意:有一部电视剧有n季,每一季有ai集.问有多少对i,j存在第i季第j集也同时存在第j季第i集. 思路:核心问题还是统计对于第i季,你要统计第i ...
- North American Invitational Programming Contest (NAIPC) 2017
(待补) A. Pieces of Parentheses 将括号处理完成后排序,方式参加下面的博客.然后做一遍背包即可. 2018 Multi-University Training Contest ...
- Linux命令之----tree
命令简介 tree命令的中文意思为“树”,功能是以树形结构列出指定目录下的所有内容,包括所有文件.子目录及子目录里的目录和文件. 命令格式 tree [option] [directory]tree ...