1. 程式人生 > >React 手稿 - Component state

React 手稿 - Component state

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>
    )
  }
}

Timer 線上例項

定義

寫在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>
    );
  }
}
  • 資料單和向性

    inputdiv中直接顯示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 手稿》

原文地址:https://segmentfault.com/a/1190000016946490