React的class组件

119 阅读2分钟

一、创建方法

import React from 'react';
class B extends React.Component {
   constructor(props) {
     super(props);
 }
   render() {
     return (
        <div>hi</div>
     )
  }
}
export default B;

Props传入外部数据

class B extends React.Component {
   constructor(props) {
      super(props);
  }
  //初始化
   render(){
      return <div onClick={this.props.onClick}>
         {this.props.name}
         <div>
           {this.props.children}
         </div>
    </div>
    //读取数据
   }
}

Props的作用

一、接受外部数据

  • 只能读不能写
  • 外部数据由父组件传递

二、接受外部函数

  • 在恰当的时机,调用该函数
  • 该函数一般是父组件的函数

State & setState 内部数据

初始化State

class B extends React.Component {
   constructor(props) {
      super(props);
      this.state ={
        user: {name:'frank',age:18}
      }
      render(){/* ...*/}
  }

读写State

读用 this.state

this.state.xxx.yyy.zzz

写用 this.setState(???,fn)

  • this.setState(newState,fn)
  • this.setState((state,props)=> newState,fn)

注意:setState 不会立刻改变this.state ,会在当前代码运行完后,再去更新this.state,从而触发UI更新
setState会自动将新state与旧state 进行一级合并

生命周期

constructor()

用途

  1. 初始化props
  2. 初始化state,但此时不能调用setState

shouldComponentUpdate()

return false 阻止更新 \

shouldComponentUpdate(newProps, newState){
  if(newState.n ==== this.state.n){
    return false
  }else{
    return true
  }
}

用途:

  1. 返回true表示不阻止UI更新
  2. 返回false表示阻止UI更新 问: shouldComponentUpdate有么用
    答:它允许我们手动判断是否要进行组件更新,我们可以根据应用场景灵活地设置返回值,以避免不必要的更新

但也可以直接使用React.PureComponent

render()

创建虚拟DOM
用途:

  1. 展示视图
  2. 只能有一个根元素
  3. 如果有两个根元素,就要用<React.Fragment>包起来
  4. <React.Fragment>可以缩写成<></> 技巧:
  5. render里面可以写if...else
  6. render里面可以写? :表达式
  7. render里面不能直接写for循环,需要用数组
  8. render里面可以写array.map(循环)

componentDidMount()

组件已出现在页面
用途:

  1. 在元素插入页面后执行代码,这些代码依赖DOM
  2. 比如你想获取div的高度,就最好在这里写
  3. 此处可以发起加载数据的AJAX请求(官方推荐)
  4. 首次渲染会执行此钩子

componentDidUpdate()

组件已更新
用途:

  1. 在视图更新后执行代码
  2. 此处也可以发起AJAX请求,用于更新数据
  3. 首次渲染不会执行此钩子
  4. 在此处setState可能会引起无限循环,除非放在if里
  5. 若shouldComponentUpdate返回false,则不触发钩子

componentWillUnmount()

组件将死
用途:

  1. 组件将要被移出页面然后被销毁时执行代码
  2. unmount过的组件不会再次mount