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 手稿》