react生命周期总结

2017-06-05  本文已影响389人  星月西

1.组件挂载和卸载时

2.数据更新过程

组件自身state更新了,会依次执行shouldComponentUpdate, componentWillUpdate, render, componentDidUpdate

3.使用createClass创建自定义组件

createClass是创建自定义组件的入口方法,管理生命周期中的getDefaultProps,依次执行

4.MOUTING阶段

MOUTING阶段管理生命周期中的getInitialState, componentWilMount, render, componentDidMount

5.RECEIVE_PROPS阶段

RECEIVE_PROPS阶段负责管理生命周期中的componentWillReceiveProps, shouldComponentUpdate, componentWillUpdate, render, componentDidUpdate

性能优化:因为组件的渲染是进行递归渲染子组件,此时可能子组件的props和state并没有发生变化,并不需要更新组件,所以应该在shouldComponentUpdate中引入PureRenderMixin,来判断是否需要更新组件,不需要则无需进行虚拟DOM的比较
注意:禁止在shouldComponentUpdate和componentWillUpdate中调用setState,这会造成循环调用,因为setState会引起重渲染;与之相对的,在componentWillReciveProps中调用setState是不会触发重渲染,而是会在调用render方法时,才会进行state合并

6.UNMOUNTING阶段

UNMOUNTING阶段负责管理生命周期中的componentWillUnmount

7.无状态组件

生命周期和组件state让React越来越灵活,但是很多时候需要的只是一个仅负责渲染的组件
无状态组件只是一个render方法,无法实现组件生命周期方法,如果需要对其进行强化,可以考虑使用高阶组件,对无状态组件进行封装
例如,如果要根据窗口的大小对组件的大小进行实时更新,可以创建一个高阶组件,来将窗口信息通过props传递给子组件:

const withViewport=(ComposedComponent)=>{
    return class Viewport extends Component{
        constructor(props){
            super(props);

            this.state={
                viewport: {
                    width: 1366,
                    height: 768
                }
            };
        }

        componentDidMount(){
            this.handleResize();
            window.addEventListener('resize',this.handleResize);
        }

        componentWillUnmount(){
            window.removeEventListener('resize',this.handleResize);
        }

        handleResize=()=>{
            const {viewport}=this.state;
            if(viewport.width!==window.width || viewport.height!==window.height){
                this.setState({
                    viewport: {
                        width: window.innerWidth,
                        height: window.innerHeight
                    }
                });
            }
        }

        render(){
            return <ComposedComponent viewport={this.state.viewport} {...this.props}/>
        }
    }
};

8.生命周期总结

首次渲染时:
1.getDefaultProps
2.getInitialState
3.componentWillMount
4.render //递归渲染子组件
5.componentDidMount

卸载组件时:
1.componentWillUnmount

再次渲染组件时:
1.componentReceiveProps
2.shouldComponentUpdate
3.componentWillUpdate
4.render
5.componentDidUpdate

组件内部state改变时:
1.shouldComponentUpdate
2.componentWilUpdate
3.render
4.componentDidUpdate

上一篇下一篇

猜你喜欢

热点阅读