React入门 - 生命周期day03

1.旧版本的生命周期 

附链接:React.Component – React

1. 初始化阶段: 由ReactDOM.render()触发---初次渲染

                1.constructor()

                2.componentWillMount()

                3.render()

                *4.componentDidMount()

                    一般做一些初始化的事,例如:开启定时器、发送网络请求、订阅消息

2. 更新阶段: 由组件内部this.setSate()或父组件重新render触发

                1.shouldComponentUpdate()

                2.componentWillUpdate()

                **3.render() 必须使用

                4.componentDidUpdate()

3. 卸载组件: 由ReactDOM.unmountComponentAtNode()触发

                *1.componentWillUnmount()

                    一般做一些收尾的事,例如:关闭定时器、取消订阅消息

    <script type="text/babel">
        class Count extends React.Component {
            constructor(props) {
                super(props)
                this.state = { count: 0 }
                console.log('Count---constructor');
            }
            // 加1按钮
            add = () => {
                const { count } = this.state
                this.setState({ count: count + 1 })
            }
            // 卸载组件
            death = () => {
                ReactDOM.unmountComponentAtNode(document.getElementById('test'))
            }
            // 不改变状态,强制更新
            force = () => {
                this.forceUpdate()
            }
            // 组件将要挂载
            componentWillMount() {
                console.log('Count---componentWillMount');
            }
            // 组件挂载完毕
            componentDidMount() {
                console.log('Count---componentDidMount');
            }
            // 组件将要卸载
            componentWillUnmount() {
                console.log('Count---componentWillUnmount');
            }

            // 控制组件更新的“阀门”
            shouldComponentUpdate() {
                console.log('Count---shouldComponentUpdate');
                return true
            }

            // 组件将要更新
            componentWillUpdate() {
                console.log('Count---componentWillUpdate');
            }

            // 组件更新完毕
            componentDidUpdate() {
                console.log('Count---componentDidUpdate');
            }

            // 初始化渲染、状态更新之后
            render() {
                console.log('Count---render');
                const { count } = this.state
                return (
                    <div>
                        <h2>当前求和为:{count}</h2>
                        <button onClick={this.add}>点我+1</button>
                        <button onClick={this.death}>卸载组件</button>
                        <button onClick={this.force}>强制更新</button>
                    </div>
                )
            }
        }

        // 父组件A
        class A extends React.Component {
            state = { carName: '奔驰' }
            changeCar = () => {
                this.setState({ carName: '奥拓' })
            }
            render() {
                return (
                    <div>
                        <div>我是A组件</div>
                        <button onClick={this.changeCar}>换车</button>
                        <B carName={this.state.carName} />
                    </div>
                )
            }
        }

        // 子组件B
        class B extends React.Component {
            // 组件将要接收参数
            componentWillReceiveProps(props) {
                console.log('B---componentWillReceiveProps', props);
            }

            // 控制组件更新的“阀门”
            shouldComponentUpdate() {
                console.log('B---shouldComponentUpdate');
                return true
            }

            // 组件将要更新
            componentWillUpdate() {
                console.log('B---componentWillUpdate');
            }

            // 组件更新完毕
            componentDidUpdate() {
                console.log('B---componentDidUpdate');
            }

            render() {
                console.log('B---render');
                return (
                    <div>B组件展示的车是:{this.props.carName}</div>
                )
            }
        }

        ReactDOM.render(<A />, document.getElementById('test'))
    </script>

2.新版本的生命周期

官方说明:

  • 17.0:删除 componentWillMountcomponentWillReceiveProps 和 componentWillUpdate。(在此版本之后,只有新的 “UNSAFE_” 生命周期名称可以使用。)

附链接:异步渲染之更新 – React Blog

1.废弃3个Will(加前缀UNSAFE_)

           componentWillMount

           componentWillUpdate

           componentWillReceiveProps

2.新增2个get

           getDerivedStateFromProps()

           getSnapshotBeforeUpdate()

1. 初始化阶段: 由ReactDOM.render()触发---初次渲染

                        1.constructor()

                        2.getDerivedStateFromProps 

                        3.render()

                        4.componentDidMount()

2. 更新阶段: 由组件内部this.setSate()或父组件重新render触发

                        1.getDerivedStateFromProps

                        2.shouldComponentUpdate()

                        3.render()

                        4.getSnapshotBeforeUpdate

                        5.componentDidUpdate()

3. 卸载组件: 由ReactDOM.unmountComponentAtNode()触发

                        1.componentWillUnmount()

 

    <script type="text/babel">
        class Count extends React.Component {
            constructor(props) {
                super(props)
                this.state = { count: 0 }
                console.log('Count---constructor');
            }
            // 加1按钮
            add = () => {
                const { count } = this.state
                this.setState({ count: count + 1 })
            }
            // 卸载组件
            death = () => {
                ReactDOM.unmountComponentAtNode(document.getElementById('test'))
            }
            // 不改变状态,强制更新
            force = () => {
                this.forceUpdate()
            }
            // 组件将要挂载
            UNSAFE_componentWillMount() {
                console.log('Count---componentWillMount');
            }
            // 组件挂载完毕
            componentDidMount() {
                console.log('Count---componentDidMount');
            }
            // 组件将要卸载
            componentWillUnmount() {
                console.log('Count---componentWillUnmount');
            }

            // 控制组件更新的“阀门”
            shouldComponentUpdate() {
                console.log('Count---shouldComponentUpdate');
                return true
            }

            // 组件将要更新
            UNSAFE_componentWillUpdate() {
                console.log('Count---componentWillUpdate');
            }

            // 组件更新完毕
            componentDidUpdate() {
                console.log('Count---componentDidUpdate');
            }

            // 初始化渲染、状态更新之后
            render() {
                console.log('Count---render');
                const { count } = this.state
                return (
                    <div>
                        <h2>当前求和为:{count}</h2>
                        <button onClick={this.add}>点我+1</button>
                        <button onClick={this.death}>卸载组件</button>
                        <button onClick={this.force}>强制更新</button>
                    </div>
                )
            }
        }

        // 父组件A
        class A extends React.Component {
            state = { carName: '奔驰' }
            changeCar = () => {
                this.setState({ carName: '奥拓' })
            }
            render() {
                return (
                    <div>
                        <div>我是A组件</div>
                        <button onClick={this.changeCar}>换车</button>
                        <B carName={this.state.carName} />
                    </div>
                )
            }
        }

        // 子组件B
        class B extends React.Component {
            // 组件将要接收参数
            UNSAFE_componentWillReceiveProps(props) {
                console.log('B---componentWillReceiveProps', props);
            }

            render() {
                console.log('B---render');
                return (
                    <div>B组件展示的车是:{this.props.carName}</div>
                )
            }
        }

        ReactDOM.render(<Count />, document.getElementById('test'))
    </script>

 例子1:getSnapshotBeforeUpdate的使用场景

    <script type="text/babel">
        class NewsList extends React.Component {
            state = { newsArr: [] }

            componentDidMount() {
                setInterval(() => {
                    const { newsArr } = this.state
                    const news = '新闻' + (newsArr.length + 1)
                    this.setState({ newsArr: [news, ...newsArr] })
                }, 1000);
            }

            getSnapshotBeforeUpdate() {
                return this.refs.list.scrollHeight
            }

            componentDidUpdate(preProps, preState, height) {
                // 距离滚动条的高度+30
                this.refs.list.scrollTop += this.refs.list.scrollHeight - height
            }

            render() {
                return (
                    <div className="list" ref="list">
                        {
                            this.state.newsArr.map((n, index) => {
                                return <div key={index} className="news">{n}</div>
                            })
                        }
                    </div>
                )
            }
        }
        ReactDOM.render(<NewsList />, document.getElementById('test'))
    </script>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值