React--State & 生命周期

2020-08-01  本文已影响0人  fanison

常用生命周期

constructor()

用途: 初始化 propsstate,用来写bind this

class Parent entends React.Component{
  constructor(props){
    super(props)
    this.state = { name: 'fanison' }
    this.onClick = this.onClick.bind(this)
  }
  // 新语法
  onClick = ()=> {}
}

shouldComponentUpdate()

用途:

  onClick = () =>{
    // 先加一,再减一; 新对象与旧对象地址不同,会render两次
    this.setState(state => ({n: state.n +1}));
    this.setState(state =>({n: state.n - 1}));
  };
  // 使用  shouldComponentUpdate 对比 nextState和 this.state的每个属性,如果全都相等,就不更新;如果有一个不等,就更新
  shouldComponentUpdate(nextProps,nextState){
    if(nextState.n === this.state.n){
      return false
    }else{
      return true
    }
  }
render(){
    console.log('render了一次')
    return(
      <div>
        {this.state.n}
        <button onClick={this.onClick}>+1-1</button>
      </div>
    )
  }

补充: 大多数情况可以使用 React.PureComponent代替 shouldComponentUpdate()

PureComponent 会在 render 之前对比新 state 和旧 state 的每一个 key,以及新 props 和旧 props 的每一个 key。
如果所有 key 的值全都一样,就不会 render;如果有任何一个 key 的值不同,就会 render。

class App extends React.PureComponent{
  constructor(props) {
    super(props);
    this.state = {
      n : 1
    };
  }
  onClick = () =>{
    this.setState(state => ({n: state.n +1}));
    this.setState(state =>({n: state.n - 1}));
  };
  render(){
    console.log('render了一次')
    return(
      <div>
        {this.state.n}
        <button onClick={this.onClick}>+1-1</button>
      </div>
    )
  }
}
export default App;

render()

用途:

//render 里面可以写 if...else
render(){
    let message
    if(this.state.n % 2 === 0 ){
      message = <div>偶数</div>
    }else{
      message = <div>奇数</div>
    }
    return(
      <div>
        {message}
        <button onClick={this.onClick}>+1</button>
      </div>
    )
  }

// render 里面可以写?:表达式
render(){
    return(
      <div>
        {this.state.n % 2 === 0 ? <div>偶数</div>:<span>奇数</span>}
        {this.state.n % 2 === 0 ? <div>偶数</div>:null}
        {this.state.n % 2 === 0 && <div>偶数</div>}
        <button onClick={this.onClick}>+1</button>
      </div>
    )
  }

// render里面不能直接写for循环,需要用数组
render(){
    let result = []
    for(let i=0;i<this.state.array.length;i++){
      result.push(this.state.array[i])
    }
    return(
      <div>
        {result}
      </div>
    )
  }

// render里面可以写 array.map(循环)
render(){
    return(
      <div>
        {this.state.array.map(n=><span key={n}>{n}</span>)}
      </div>
    )
  }

componentDidMount() 组件已出现在页面

用途:

class App extends React.PureComponent{
  constructor(props) {
    super(props);
    this.state = {
      width:undefined
    };
    this.divRef = React.createRef();
  }

componentDidMount(): void {
  const div = document.getElementById('xxx')
  console.log(div)
  const width = div.getBoundingClientRect().width
  this.setState({width:width})
  // 使用 divRef.current
  const div2 = this.divRef.current
  console.log(div2)
  const {width} = div2.getBoundingClientRect()
  this.setState({width:width})
}

 render(){
   return(
     <>
      <div id="xxx"> GetElementById: {this.state.width} px </div>
      <div ref={this.divRef}>Hello,World {this.state.width} px </div>
     </>
   )
 }

componentDidUpdate() //组件已更新

componentWillUnmount() //组件将死

上一篇下一篇

猜你喜欢

热点阅读