React 手稿 - Component state
阿新 • • 發佈:2018-11-10
Component state
例項:
import React, { PureComponent } from 'react'; export default class extends PureComponent { constructor(props) { super(props); this.state = { time: '' }; } componentDidMount() { setInterval(() => { const now = new Date(); let { time } = this.state; const year = now.getFullYear(); const month = now.getMonth() + 1; const day = now.getDate(); const hours = now.getHours(); const minutes = now.getMinutes(); const seconde = now.getSeconds(); time = `${`0000${year}`.slice(-4)}-${`00${month}`.slice(-2)}-${`00${day}`.slice(-2)} ${`00${hours}`.slice(-2)}:${`00${minutes}`.slice(-2)}:${`00${seconde}`.slice(-2)}` this.setState({ time }); }, 1000); } render() { return ( <div>{this.state.time}</div> ) } }
定義
寫在constructor
函式中,是一個Object
物件。一般情況下需要指定預設值,預防拋undefined
.
使用
在元件中通過訪問元件物件屬性的方式。直接獲取:this.state.time
.
我們通常會先獲取state
資料,再渲然到頁面,例如:
render() { const {time} = this.state; return ( <div>{time}</div> ); }
setState
先看一段程式碼:
import React, {PureComponent} from 'react'; export default class extends PureComponent { constructor(props) { super(props); this.state = {name: 'world'}; } render() { const {name} = this.state; return ( <div> <input defaultValue={name} name="name" /> <div>Holle, {name}!</div> </div> ); } }
-
資料單和向性
input
與div
中直接顯示name
的內容,但是,在input
中直接輸入內容,div
的顯示不會改變。把這種元件也稱為非受控性元件。
-
setState
通過React提供了
setState
方法,來實現state
的修改。我們只要將上述的非受控性元件修改為受控性元件即可,如下:
<input value={name} onChange={e => this.setState({name: e.target.value})} />
使用
setState
方法需要注意以下幾點:-
非同步
onChange () { this.setState({name: 'hasChanged'}) console.log(this.state.name === 'hasChanged'); //false }
-
合併
this.state = {name: 'xiaoshouyi', address: 'beijing'}; this.setState({address: 'xi an'}); //not //this.setState({...this.state, addree: 'xi an'}); //但是這種方式在物件修改的時候非常有用。 console.log(this.state) //{name: 'xiaoshouyi', address: 'xi an'}
類似與
Object.assgin()
。 -
回撥
this.setState({name: 'changed'}, () => { console.log(this.state.name); // changed });
-
推薦閱讀《React 手稿》