React--State & 生命周期

常用生命周期

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

用途:

  • 返回 true 表示不阻止UI更新
  • 返回 false 表示阻止UI更新
  • 允许我们手动判断是否要进行组件更新,可以根据应用场景灵活地设置返回值,以避免不必要的更新。
  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(
      
{this.state.n}
) }

补充: 大多数情况可以使用 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(
      
{this.state.n}
) } } export default App;

render()

用途:

  • 展示视图 return (
    ...
    )
  • 只能有一个根元素
  • 如果有两个根元素,要用包起来
  • 可以缩写成 <>
//render 里面可以写 if...else
render(){
    let message
    if(this.state.n % 2 === 0 ){
      message = 
偶数
}else{ message =
奇数
} return(
{message}
) } // render 里面可以写?:表达式 render(){ return(
{this.state.n % 2 === 0 ?
偶数
:奇数} {this.state.n % 2 === 0 ?
偶数
:null} {this.state.n % 2 === 0 &&
偶数
}
) } // render里面不能直接写for循环,需要用数组 render(){ let result = [] for(let i=0;i {result}
) } // render里面可以写 array.map(循环) render(){ return(
{this.state.array.map(n=>{n})}
) }

componentDidMount() 组件已出现在页面

用途:

  • 在元素插入页面后执行代码,这些代码依赖DOM
  • 可以发起加载数据的 AJAX 请求
  • 首次渲染会执行此钩子
  • 可在此处获取div高度
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(
     <>
      
GetElementById: {this.state.width} px
Hello,World {this.state.width} px
) }

componentDidUpdate() //组件已更新

componentWillUnmount() //组件将死

你可能感兴趣的:(React--State & 生命周期)