react的新生命周期函数

2022-04-07  本文已影响0人  水晶草720

1.getDerivedStateFromProps

这个生命周期函数是为了替代componentWillReceiveProps存在的,所以在你需要使用componentWillReceiveProps的时候,就可以考虑使用getDerivedStateFromProps来进行替代了。

两者的参数是不相同的,而getDerivedStateFromProps是一个静态函数,也就是这个函数不能通过this访问到class的属性,也并不推荐直接访问属性。而是应该通过参数提供的nextProps以及prevState来进行判断,根据新传入的props来映射到state。

需要注意的是,如果props传入的内容不需要影响到你的state,那么就需要返回一个null,这个返回值是必须的,所以尽量将其写到函数的末尾。


static getDerivedStateFromProps(nextProps, prevState) {
    const {type} = nextProps;
    // 当传入的type发生变化的时候,更新state
    if (type !== prevState.type) {
        return {
            type,
        };
    }
    // 否则,对于state不进行任何操作
    return null;
}

//老生命周期
//(1) componentWillMount, 在 ssr 中 这个方法将会多次被调用,所以会重复触发多遍,同时在这里如果绑定事件,将无法解绑,导致内存泄漏,变得不够安全高效逐步废弃。
//(2) componentWillReceiveProps 外部组件频繁更新传入多次不同的props,会导致不必要的异步请求
//(3) ccomponentWillupdate ,更新前记录 DOM状态,可能会做一些处理,与 componentDidUpdate 相隔事件如果过长,会导致状态不太信
//新生命周期的替代
// getDerivedStateFromProps 第一次初始化组件一级后续的更新过长中(包括资深状态更新以及父传子) 返回一个对象做为新的state,返回null则说明不需要在这里更新state

import React, { Component } from 'react'
export default class app extends Component {
    state = {
        myname: 'lele',
        myage:100
    }
    //componentWillMount 初始化,第一次修改状态
    static getDerivedStateFromProps(nextProps,nextState) {
        console.log("getDerivedStateFromProps")
        return {
            myname: nextState.myname.substring(0,1).toUpperCase()+nextState.myname.substring(1)
        }

    }
  render() {
    return (
        <div>{this.state.myname } {this.state.myage }</div>
    )
  }
}

import React, { Component } from 'react'
import Axios from 'axios'
import './../01-base/css/01-index.css'
class Child extends Component {
    state = {
        list: []
     }
    componentDidMount() {
       
        if (this.props.type == 1) {
            console.log("卖座正在热映的电影")
            Axios.get('./test.json').then((res) => {
                this.setState({
                    list: res.data[2].list
                })
            })
            
        } else {
            console.log("卖座即将上映的电影")
        }

    }
   
    render() {
        return (
            <div>
                Films-{this.props.type}
                <ul>
                    {this.state.list.map((item, index) => 
                        <li key={index}>
                            {item.name}
                        </li>
                   )}
                </ul>
          </div>
      )      
    }
//这个生命周期函数是为了替代componentWillReceiveProps存在的,所以在你需要使用componentWillReceiveProps的时候,就可以考虑使用getDerivedStateFromProps来进行替代了。
//两者的参数是不相同的,而getDerivedStateFromProps是一个静态函数,也就是这个函数不能通过this访问到class的属性,也并不推荐直接访问属性。而是应该通过参数提供的nextProps以及prevState来进行判断,根据新传入的props来映射到state。
   static getDerivedStateFromProps(nextProps, nextState) {
       console.log(nextProps.type+"qingqing")
       return {
        type:nextProps.type
       }
    }
    componentDidUpdate(prevProps, prevState) {
        console.log(this.state.type+"!11", prevState)
        if (this.state.type === prevState.type) {
            return
        }
        if (this.state.type=== 1) {
            console.log("卖座正在热映的电影")
            Axios.get('./test.json').then((res) => {
                this.setState({
                    list: res.data[2].list
                })
            })
        }

        if (this.state.type === 2) {
            console.log("卖座即将上映的电影")
            Axios.get('./test-1.json').then((res) => {
                this.setState({
                    list: res.data[2].list
                })
            })
        }
    }
}
export default class app extends Component {
    state = {
       type:1
   }
    render() {
      console.log('render2')
      
    return (
        <div>
            <ul className="tab" >
                <li className={this.state.type==1 ? 'active' :''} onClick={() => this.setState({type:1})}>正在热映</li>
                <li className={this.state.type==2 ? 'active' :''} onClick={() => this.setState({type:2})}>即将上映</li>
            </ul>

            <Child type={this.state.type} />
      </div>
    )
  }
}

2.getSnapshotBeforeUpdate

import React, { Component } from 'react'

export default class app extends Component {
    state = {
        mytext:"11111"
    }
    render() {
      console.log('render')
    return (
        <div>
            <button onClick={() => this.setState({mytext:"2222"})}>click</button>
            {this.state.mytext}
      </div>
    )
    }
    getSnapshotBeforeUpdate() {
        console.log("getSnapshotBeforeUpdate")
        return 111;
    }

    componentDidUpdate(prevProps, prevState,value) {
        console.log("componentDidUpdate",value)  //componentDidUpdate,1111
    }
   
}
import React, { Component } from 'react'
export default class app extends Component {
    state = {
        list:[1,2,3,4,5,6,7,8,9]
    }
    myref = React.createRef()
    render() {
      console.log('render')
    return (
        <div>
            <h1>邮箱的应用</h1>
          
            <button onClick={() => this.setState({list:[...[11,12,13,14,15,16,17,18,19,20,21,22],...this.state.list]})}>来邮件</button>
            <div id="box" style={{height:'200px',overflow:"auto",background:"#eee"}} ref={this.myref}>
                <ul>
                    {
                        this.state.list.map(item => <li key={item} > {item}</li>)
                    }
                </ul>
            </div>
      </div>
    )
    }
    getSnapshotBeforeUpdate() {
        console.log(this.myref.current.scrollHeight)
        return this.myref.current.scrollHeight;
    }
    componentDidUpdate(prevProps, prevState, value) {
        console.log("componentDidUpdate", value)
        this.myref.current.scrollTop+=this.myref.current.scrollHeight-value
        console.log(this.myref.current.scrollHeight)
    }
   
}
上一篇下一篇

猜你喜欢

热点阅读