美文网首页
react的新生命周期函数

react的新生命周期函数

作者: 水晶草720 | 来源:发表于2022-04-07 16:17 被阅读0次

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

    相关文章

      网友评论

          本文标题:react的新生命周期函数

          本文链接:https://www.haomeiwen.com/subject/fshssrtx.html