React——state
在React——组件中介绍过组件有两种定义方式:函数形式以及类形式。但是要想在组件中使用state,就必须使用类形式定义组件。
组件中的state是组件私有的,完全由组件自己控制。
使用类形式定义一个Clock组件
class Clock extend React.Component{
constructor(props){
super(props);
this.state = {date:new Date()};
},
render(){
return (
<div>
<h1>Hello,world</h1>
<p>It is {{this.state.date.toLocaleTimeString()}}</p>
</div>
)
}
};
上面的代码中,在构造函数中初始化state
构造函数应该以props作为参数
将Clock组件显示到页面上
ReactDOM.render(<Clock />,document.getElementById('root'));
上面定义的组件会把当前的时间显示到页面上,但是只会显示某一个时刻(组件不会更新)
接下来介绍更新Clock组件
二.组件的生命周期
在Clock组件首次被渲染到页面上,我们想给Clock组件开启一个定时器。当组件从DOM中移除,清除这个定时器。
componentDidMount()钩子函数会在组件输出被渲染到DOM中时调用,如果想给Clock组件设置一个timer这是一个好时机
componentDidMount(){
this.timer = setInterval(() => {
this.tick();
},1000);
}
如果你要存储一些不被用于输出的变量,你可以手动的为类添加额外的字段,没有在render中使用的变量,不应该出现在state中.
可以在componentWillMount()钩子函数中卸载timer
componentWillMount(){
clearInterval(this.timer);
}
接下来实现tick方法,组件的state要使用this.setState()更新
Clock组件的完整代码如下
class Clock extend React.Component{
constructor(props){
super(props);
this.state = {
date:new Date()
};
},
render(){
return (
<div>
<h1>Hello world</h1>
<p>It is {this.state.date}</p>
</div>
)
},
componentDidMount(){
this.timer = setInterval(() => {
this.tick();
},1000);
},
componentWillMount(){
clearInterval(this.timer);
},
tick(){
this.setState({
date:new Date()
});
}
};
将Clock组件渲染到页面上
ReactDOM.render(<Clock />,docoment.getElementById('root'));
这样每隔一秒钟Clock就会被更新
解释上述代码的执行顺序
step1.当<Clock />被传递到ReactDOM.render()中时,Clock组件的构造函数会被调用,在构造函数中会初始化组件的State
step2.React调用组件的render()方法,React去研究哪些内容应该被显示到屏幕上,然后React更新DOM去捕获Clock组件的输出
step3.当Clock组件的输出被插入到DOM中后,react会调用componentDidMount()钩子函数,在这个函数中Clock组件让浏览器每秒钟调用tick()方法
step4.浏览器每隔一秒钟就调用tick()方法,在这个函数中会通过调用setState()去更新state,调用setState()后,React就知道state被改变了,
然后调用render再次去研究哪些内容应该被显示到屏幕上
step5.当Clock组件从DOM中移除,React调用componentWillMount()钩子函数移除定时器
不要直接去修改state,只有在构造函数中才能直接给this.state赋值,在其他地方通过给state直接赋值的方式修改state,并不会引起组件的重新渲染
只能通过this.setState()方法修改state
三.state
state的更新可能时异步的
为了提高性能,React会将多次对setState()的调用合并成一个state的更新。因为this.props和this.state是异步更新的,所以不要依靠它们的值
去计算下一个state。
// wrong
this.setState({
conter:this.state.conter + this.props.num
})
setState()除了可以接受一个对象作为参数,还能接受一个函数作为参数。当setState的参数是一个函数时(可以是一个箭头函数),这个函数的第一个
是之前的state,第二个参数为此时的props
this.setState((prevState,props) => {
return {conter:prevState.conter + props.num}
})
组件能够将他的state作为子组件的props传递给子组件。如
<FormattedDate date={this.state.date}/>
FormattedDate组件在他的props上接受date,并且FormattedDate并不知道date来自于Clock的state,props还是手动添加的类型。
四.数据流
React采用的是从上到下的数据流。任何state都是特定组件私有的,从state派生出的数据和UI只能影响当前组件下面的组件
五.组件之间是相互独立的
funtion App(props){
return (
<div>
<Clock/>
<Clock/>
</div>
)
}
ReactDOM.render(<App/>,document.getElementById('root'));
每一个Clock组件都会设置它自己的定时器并且会相互独立的更新
React——state的更多相关文章
- react state为数组时插入值
react state为数组时,如何插入值.在react里,一切皆是状态state,如果想通过改变state修改渲染效果,只能yongsetState.但是setState又是key:value格式, ...
- React state的使用
相对于angular.js的双向数据绑定,React 可以使用State来实现. React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM). this ...
- React state和props使用场景
一个组件的显示状态可以由内部状态state.外部参数props所决定. props: 1.props 是从外部传进组件的参数,主要是父组件向子组件传递数据. 2.props 对于使用它的组件来说是只读 ...
- react state成员
组件中包括state,props与render成员函数. react中,主要通过定义state,根据不同state渲染对应用户界面. 过程调用了成员函数setState(data,callback). ...
- React State(状态)
function FormattedDate(props){ return ( <h1>现在是{props.date}</h1> ) } class Clock extends ...
- React state状态
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- react篇章-React State(状态)-组件都是真正隔离的
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...
- react篇章-React State(状态)-数据自顶向下流动
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...
- react篇章-React State(状态)-将生命周期方法添加到类中
将生命周期方法添加到类中 在具有许多组件的应用程序中,在销毁时释放组件所占用的资源非常重要. 每当 Clock 组件第一次加载到 DOM 中的时候,我们都想生成定时器,这在 React 中被称为挂载. ...
随机推荐
- .NET Core资源汇总
前言 首先庆祝.NET Core 2.0今天发布. 最近一两年.NET的关注度直线下降, 大部分开发人员转去了其他平台, 国内的机会也越来越少了. 行情虽然如此, 仍在坚守.NET平台的开发人员还是要 ...
- python时间序列分析
题记:毕业一年多天天coding,好久没写paper了.在这动荡的日子里,也希望写点东西让自己静一静.恰好前段时间用python做了一点时间序列方面的东西,有一丁点心得体会想和大家 ...
- CodeForces 797C Minimal string:贪心+模拟
题目链接:http://codeforces.com/problemset/problem/797/C 题意: 给你一个非空字符串s,空字符串t和u.有两种操作:(1)把s的首字符取出并添加到t的末尾 ...
- 王佩丰第一讲 认识excel笔记
改变工作表表浅颜色 批量插入工作表 选择多张工作表然后插入 找到表格边界区域快捷键(找到表格的最后一行):快速到达最上下左右端 点击边框上下左右双击 从指定的位置开始冻结窗格 输入今天的日期 快捷键c ...
- Xcode部分快捷键
编译调试: command+B 编译 command+R 编译并运行 command+shift+O 单步调试 command+shift+I 执行进入函数 command+shift+T 执行跳出函 ...
- vue-cli安装
近期梳理了一下win和linux下安装vue项目,总结一下,希望对于看的人有帮助,废话不多说. Linux下安装 因为我用的是deepin,所以再此就不演示了.首先电脑上已经安装好了node和npm了 ...
- OpenStack(企业私有云)万里长征第六步——OpenStack网络及虚拟机存储位置
一.前言 昨天又装了一遍OpenStack.码农这项工作就如同人生,永远有你想不到的意外在等着你,时而是惊喜时而是悲伤.在装的过程中倒是很顺利,只是在安装完成之后碰到了两个之前没有碰到的问题,这里记录 ...
- javascript二维数组排序
js使用sort()函数对二维数组快速排序的写法 作者:admin 时间:2015-7-3 9:31:4 浏览:1847 js数组的排序方法有很多,冒泡法,插入法等等,不过对于数组的排序来 ...
- java参数传递
关于方法的参数传递,java中方法的参数传递均为值传递,根据传递的类型以及方法中对参数的处理可以分为2类: 1.传递参数为基本数据类型,因为是值传递,所以方法运行结束后对传递参数的值无影响. 2.传递 ...
- C#多线程爬虫抓取免费代理IP
这里用到一个HTML解析辅助类:HtmlAgilityPack,如果没有网上找一个增加到库里,这个插件有很多版本,如果你开发环境是使用VS2005就2.0的类库,VS2010就使用4.0,以此类推.. ...