0x000 概述
这一章讲state
,state
是MVVM
的核心,也算是React
的核心思想......都很核心啊。
0x001 问题
在上一章节的栗子中,我们取出一个栗子稍作修改:
class App extends React.Component { constructor() { super() } render() { return{this.props.date}
}}let date=Date()ReactDom.render(, document.getElementById('app'))
查看浏览器:
已经知道了如何渲染数据,但是怎样更新数据呢?比如我希望栗子中的date
根据时间变化,我们可以如下做:
setInterval(() => { date = Date() ReactDom.render(, document.getElementById('app') )}, 1000)
但是React
提供了一个更优雅的方式,那就是state
。
0x002 state
看栗子:
class App extends React.Component { constructor() { super() this.state = { date: Date() } setInterval(() => { this.setState({ date: Date() }) }, 1000) } render() { return{this.state.date}
}}ReactDom.render(, document.getElementById('app'))
我们声明了一个state
为{date:Date()}
,然后绑定到视图上,这样视图就显示了state.date
了,这是毋庸置疑的,我们一直都是这么做。但是接着我们又搞了一个定时器,每秒执行一直setState
函数,将date
修改为最新的时间。就完成了视图的更新。
0x003 setState
查看setState
:
React.Component.setState(updater[,callback])- updater: 更新的数据- callback: 可选,更新之后的回调
该函数是由React.Component
提供的,而我们在声明该组件的时候继承了Component
,所以也就有了这个方面。
我们可以这么理解这个函数,我们是这么调用的:
this.setState({ date: Date()})
我们假想它在执行的时候是这么执行的
this.state.date=Date()this.render()
还可以假想他的实现是这么实现的:
class Component{ ... setState(updator, callback){ this.state={...this.state, ...updator} this.callback?callback():null } ...}
当然不管是setState
的执行流程,还是完整声明,都不是这样的,但是现在我们都不必深入,只是为了简单而这么理解而已。