React-函数式组件和类式组件三大核心属性

1.组件核心属性之state

1.1类式组件state

1.1.1类式组件初始化state

import React, { Component } from 'react'

export default class Text extends Component {
  constructor(props) {
  	//构造器中的this就是组件的实例对象
    super(props);
    this.state = {//初始化state必须是一个对象
      msg: '欢迎使用React'
    }
  }
  render() {
    return (
      <div>
        <h2>{this.state.msg}</h2>
      </div>
    )
  }
}

1.1.2类式组件中的setState的两种写法

1.1.2.1类式组件中的setState-对象写法
  • setState(stateChange,[callback])-------对象式的setState
    • stateChange为状态改变对象(该对象可以体现出状态的更改)
    • callback是可选的回调函数,他在状态更新完毕,界面也更新之后(render调用后)才被调用
import React, { Component } from 'react'

export default class Text extends Component {
  state = {
    msg: '欢迎使用react',
    count: 0
  }
  add = (event, str) => {
    let { count } = this.state;
    switch (str) {
      case '非回调函数':
        this.setState({
          count: count + 1
        });
        console.log(this.state.count);
        break;
      case '回调函数':
        this.setState({
          count: count + 1
        }, () => {
          console.log('回调函数中的count', this.state.count);//回调函数中的count就是最新的count
        });
        console.log(this.state.count);//由于setState是一个异步操作,所以这里面的还是没修改之前的count
        break;
    }
  }
  render() {
    return (
      <div>
        <h2>{this.state.msg}</h2>
        <p>{this.state.count}</p>
        <button onClick={(event) => {
          this.add(event, '非回调函数')
        }}>+非回调函数 对象写法</button>
        <button onClick={(event) => {
          this.add(event, '回调函数')
        }}>+回调函数 对象写法</button>
      </div>
    )
  }
}
1.1.2.2类式组件中的setState-函数写法
  • setState(updater,[callback])------函数式的setState
    • updater为返回stateChange对象的函数
    • updater可以接收到state和props
    • callback是可选的回调函数,他在状态更新完毕,界面也更新之后(render调用后)才被调用
import React, { Component } from 'react'

export default class Text extends Component {
  state = {
    msg: '欢迎使用react',
    count: 0
  }
  add = (event, str) => {
    switch (str) {
      case '非回调函数':
        this.setState((state, props) => {
          return {
            count: state.count + 1
          }
        });
        console.log(this.state.count);
        break;
      case '回调函数':
        this.setState((state, props) => {
          return {
            count: state.count + 1
          }
        }, () => {
          console.log('回调函数中的count', this.state.count);//回调函数中的count就是最新的count
        });
        console.log(this.state.count);//由于setState是一个异步操作,所以这里面的还是没修改之前的count
        break;
    }
  }
  render() {
    return (
      <div>
        <h2>{this.state.msg}</h2>
        <p>{this.state.count}</p>
        <button onClick={(event) => {
          this.add(event, '非回调函数')
        }}>+非回调函数 函数写法</button>
        <button onClick={(event) => {
          this.add(event, '回调函数')
        }}>+回调函数 函数写法</button>
      </div>
    )
  }

1.1.2类式组件中的事件

import React, { Component } from 'react'

export default class Text extends Component {
  constructor(props) {
    console.log('constructor');//构造器调用几次? ==>1次
    super(props);
    this.state = {
      msg: '欢迎使用React',
      bool: false
    };
    this.changeBool = this.changeBool.bind(this)//这句代码的意思为:找到Text原型上changeBool的方法,通过bind的方式将this指向Text的实例对象,并挂载到Text类的自身上
  }
  changeBool() {//调用几次? ==> 出发几次调用几次
    console.log('changeBool');
    // changeBool放在哪里? ------ Text的原型对象上,供Text的实例对象使用
    // 由于changeBool是作为onClick的回调函数,所以是不能通过实例调用的,是直接调用,如果不在构造器中纠正this的指向为Text的实例对象,那么这个this就应该指向window,但是类中的方法默认开启了局部的严格模式,所以changeBool中的this为undefined
    let { bool } = this.state;
    // 警告:状态state不可以直接更改,需要借助一个内置的API取更改 ==> setState
    bool=!bool;//这是错误的写法!!!
    this.setState({//这才是正确的写法,在这里面的更新是一种合并,而不是替换
      bool: !bool
    })
  }
  render() {//调用几次? ==> 1+n次 n就是状态更新的次数
    return (
      <div>
        <h2>{this.state.msg}</h2>
        {
          this.state.bool ? (<span>真</span>) : (<span>假</span>)
        }
        <button onClick={this.changeBool}>切换bool的真假</button>
      </div>
    )
  }
}

1.1.3类式组件的简写方式

import React, { Component } from 'react'

export default class Text extends Component {
  // 类中可以直接写赋值语句
  a = 996
  state = {//给类的自身添加state属性
    msg: '欢迎使用react',
    bool: true
  }
  changeBool = () => {//给类的自身添加方法 ==> 赋值语句+箭头函数 这里面的this就是类的实例对象
    let { bool } = this.state;
    this.setState({
      bool: !bool
    })
  }
  render() {
    console.log(this.a);//996
    return (
      <div>
        <h2>{this.state.msg}</h2>
        {
          this.state.bool ? (<span>真</span>) : (<span>假</span>)
        }
        <button onClick={this.changeBool}>切换bool的真假</button>
      </div>
    )
  }
}

函数式组件state

上一篇:react中怎么获取state 太原石家庄福州


下一篇:React State & 生命周期