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的更多相关文章

  1. react state为数组时插入值

    react state为数组时,如何插入值.在react里,一切皆是状态state,如果想通过改变state修改渲染效果,只能yongsetState.但是setState又是key:value格式, ...

  2. React state的使用

    相对于angular.js的双向数据绑定,React 可以使用State来实现. React 里,只需更新组件的 state,然后根据新的 state 重新渲染用户界面(不要操作 DOM). this ...

  3. React state和props使用场景

    一个组件的显示状态可以由内部状态state.外部参数props所决定. props: 1.props 是从外部传进组件的参数,主要是父组件向子组件传递数据. 2.props 对于使用它的组件来说是只读 ...

  4. react state成员

    组件中包括state,props与render成员函数. react中,主要通过定义state,根据不同state渲染对应用户界面. 过程调用了成员函数setState(data,callback). ...

  5. React State(状态)

    function FormattedDate(props){ return ( <h1>现在是{props.date}</h1> ) } class Clock extends ...

  6. React state状态

    <!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...

  7. react篇章-React State(状态)-组件都是真正隔离的

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  8. react篇章-React State(状态)-数据自顶向下流动

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  9. react篇章-React State(状态)-将生命周期方法添加到类中

    将生命周期方法添加到类中 在具有许多组件的应用程序中,在销毁时释放组件所占用的资源非常重要. 每当 Clock 组件第一次加载到 DOM 中的时候,我们都想生成定时器,这在 React 中被称为挂载. ...

随机推荐

  1. NET中解决KafKa多线程发送多主题的问题

    一般在KafKa消费程序中消费可以设置多个主题,那在同一程序中需要向KafKa发送不同主题的消息,如异常需要发到异常主题,正常的发送到正常的主题,这时候就需要实例化多个主题,然后逐个发送. 在NET中 ...

  2. MySql学习笔记(四)

    MYSQL如何查看系统帮助: 1.查看官方API文档: http://dev.mysql.com/doc/ 2.通过Mysql中的help命令 比如:help create database MYSQ ...

  3. Alluxio 1.5集群搭建

    一.依赖文件安装 1.1 JDK 参见博文:http://www.cnblogs.com/liugh/p/6623530.html 二.文件准备 2.1 文件名称 alluxio-1.5.0-hado ...

  4. JavaScript中数组的方法总结

    js数组元素的添加和删除一直比较迷惑,今天终于找到详细说明的资料了,先给个我测试的代码^-^var arr = new Array();arr[0] = "aaa";arr[1] ...

  5. Web安全测试——威胁攻防

    SQL注入 部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL In ...

  6. Trailing Zeroes (III)

    You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in d ...

  7. nopcommerce的WidgetZones

    来自:http://www.kingreatwill.com Hi, Having just started developing nopCommerce (and having forked out ...

  8. java配置mongo最大连接数

    最近做压测,其中有个交易涉及到对mongo的操作. 单机压到1500UV的时候出现如下错误: 一看,原来是mongo配置的最大连接数不够: 我们来看看mongo的官方文档: connectionPer ...

  9. 计蒜客模拟赛D1T2 蒜头君的树:树上节点之间最短距离和

    题目链接:https://nanti.jisuanke.com/t/16446 题意: 给你一棵有n个节点的树以及每条边的长度,输出树上节点之间的最短距离和.然后进行m次操作,每次操作更改一条边的长度 ...

  10. 开源社交系统ThinkSNS v4.6.1更新日志及功能详解!

    ThinkSNS 开源社交系统 v4.6.1更新日志 [修复]聊天无法使用emoji问题 [修复]后台禁用用户后,app第三方登录可登录问题 [修复]部分接口问题 [修复]h5个人中心获取用户信息问题 ...