ReactJS组件生命周期详述

前面已经写了一篇关于reactJS组件生命周期的博文,此篇博文是一个补充,增加了一些例子,有助于更好的理解reactJS组件。

初始化阶段能够使用的钩子函数(按照触发顺序):

getDefaultProps(获取实例的默认属性)————只有第一次实例的时候调用,实例之间共享引用(属性)

getInitialState(获取实例的初始状态)————初始化每个实例特有的状态

必须返回一个Object或者是Null

componentWillMount(组件即将被渲染到页面)——render之前最后一次修改状态的机会

render(组件在render中生成虚拟的DOM节点,即JSX,最后由React生成真实的DOM节点)——只能访问this.props和this.state,不应再访问其它信息,只有一个顶层组件,但是可以有子组件,不允许修改状态和DOM输出。

如果render需要修改状态和DOM输出,那么render就不能在服务端使用。并且,如果在render中修改状态和DOM输出,会使得代码逻辑变得复杂。所以,要尽可能避免这样做。

componentDidMount(组件被渲染到页面之后)——成功render并渲染完成真实DOM之后触发,可以修改DOM

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="Keywords" content="关键词一,关键词二">
    <meta name="Description" content="网站描述内容">
    <meta name="Author" content="刘艳">
    <title></title>
</head>
<body>
    <div id = "example"></div>
    <div id = "example2"></div>
</body>
</html>
<script src="build/jquery-1.11.2.min.js"></script>
<script src="build/react.js"></script>
<script src="build/react-dom.js"></script>
<script src="build/browser.min.js"></script>
<script type="text/babel">
    var MyComponent = React.createClass({
        getDefaultProps: function(){
            console.log("获取实例的默认属性");
            return{name: "Yvette"};
        },
        getInitialState: function () {
            console.log("获取实例的初始状态");
            return{will:true};
        },
        componentWillMount: function () {
            console.log("组件即将被渲染到页面");
        },
        handleClick: function(event){
            this.setState({will: !this.state.will});
        },
        componentDidMount: function(){
            console.log("aaaa");
            if(this.state.will){
                $(this.refs.example).append("啦啦啦");
            }else{
                $(this.refs.example).append("郁闷");
            }
        },
        render: function(){
            console.log("render");
            return(
                <div>
                <p ref = "example" onClick = {this.handleClick}>{this.props.name}未来{this.state.will ? "会" : "不会"}更好!</p>
            </div>
            )
        }
    });
    ReactDOM.render(<MyComponent/>,document.querySelector("#example"));
    ReactDOM.render(<MyComponent/>,document.querySelector("#example2"));
</script>

从运行结果可以看出:

**1、获取默认属性(getDefaultProps)只会在第一次实例化组件时运行一次,后面不会再运行,

2、获取初始状态(getInitialState)和componentWillMount,render,componentDidMount在每次实例化组件时,都会进入.

3、点击切换时,只会触发render函数,因此我们写在componentDidMount函数中的状态判断不会再被执行。**

运行中阶段能够使用的钩子函数(按照触发顺序):

componentWillReceiveProps(组件快要接收到属性时触发)——父组件修改属性触发,可以修改新属性、修改状态。

在修改发生之前出发。在属性真正比传送到组件之前,对其进行处理。

shouldComponentUpdate(组件接收到新状态时,是否需要更新,返回false,React就不会更新,可以提高性能)

componentWillUpdate(组件即将更新到页面)——不能修改属性和状态,会导致死循环

render——只能访问this.props和this.state,不应再访问其它信息,只有一个顶层组件,但是可以有子组件,不允许修改状态和DOM输出。

componentDidUpdate(在组件更新到页面之后调用)——可以修改DOM

<body>
    <div id = "example"></div>
    <div id = "example2"></div>
</body>
</html>
<script src="build/jquery-1.11.2.min.js"></script>
<script src="build/react.js"></script>
<script src="build/react-dom.js"></script>
<script src="build/browser.min.js"></script>
<script type="text/babel">
var MyComponent = React.createClass({
getDefaultProps: function(){
console.log("获取实例的默认属性");
return{name: "Yvette"};
        },
getInitialState: function () {
console.log("获取实例的初始状态");
return{will:true};
        },
componentWillMount: function () {
console.log("组件即将被渲染到页面");
        },
handleClick: function(event){
this.setState({will: !this.state.will});
        },
componentDidMount: function(){
console.log("组件被渲染到页面之后");
$(this.refs.example).append("啦啦啦");
        },
render: function(){
console.log("render")
return(
<div>
                    <p ref = "example" onClick = {this.handleClick}>{this.props.name}未来{this.state.will ? "会" : "不会"}更好!</p>
                </div>
);
        },
componentWillReceiveProps: function(){
console.log("组件快要接收到属性");
        },
shouldComponentUpdate: function(){
console.log("是否需要更新");
return false;
        },
componentWillUpdate: function(){
console.log("组件即将被更新");
        },
componentDidUpdate: function(){
console.log("组件更新被渲染到页面");
        }
    });
ReactDOM.render(<MyComponent/>,document.querySelector("#example"));
ReactDOM.render(<MyComponent/>,document.querySelector("#example2"));
</script>

运行结果如下:

从运行结果可以看出:

1、在运行过程中,组件的状态发生改变时,首先进入shouldComponentUpdate函数,即组件是否需要更新,如果返回false,表示无需更新,直接返回。

<body>
    <div id = "example"></div>
    <div id = "example2"></div>
</body>
</html>
<script src="build/jquery-1.11.2.min.js"></script>
<script src="build/react.js"></script>
<script src="build/react-dom.js"></script>
<script src="build/browser.min.js"></script>
<script type="text/babel">
    var MyComponent = React.createClass({
        getDefaultProps: function(){
            console.log("获取实例的默认属性");
            return{name: "Yvette"};
        },
        getInitialState: function () {
            console.log("获取实例的初始状态");
            return{will:true};
        },
        componentWillMount: function () {
            console.log("组件即将被渲染到页面");
        },
        handleClick: function(event){
            this.setState({will: !this.state.will});
        },
        componentDidMount: function(){
            console.log("组件被渲染到页面之后");
            //$(this.refs.example).append("啦啦啦");
        },
        render: function(){
            console.log("render")
            return(
                <div>
                    <p ref = "example" onClick = {this.handleClick}>{this.props.name}未来{this.state.will ? "会" : "不会"}更好!</p>
                    <span ref = "more">啦啦啦</span>
                </div>
            );
        },
        componentWillReceiveProps: function(){
            console.log("组件快要接收到属性");
        },
        shouldComponentUpdate: function(){
            console.log("是否需要更新");
            return true;
        },
        componentWillUpdate: function(){
            console.log("组件即将被更新");
            $(this.refs.example).css({"background": "#ccc","line-height":"30px"});
            //this.setState({will: !this.state.will});//导致一个死循环
        },
        componentDidUpdate: function(){
            console.log("组件更新被渲染到页面");
            if(this.state.will){
                $(this.refs.more).html("啦啦啦");
            }
            else{
                $(this.refs.more).html("郁闷");
            }
        }
    });
    ReactDOM.render(<MyComponent/>,document.querySelector("#example"));
    ReactDOM.render(<MyComponent/>,document.querySelector("#example2"));
</script>

从运行结果可以看出钩子函数的触发顺序:

1、shouldComponentUpdate,必须返回true或false,如果返回false,直接返回,不会再触发后面的钩子函数。

2、componentWillUpdate和componentDidUpdate中都可以操作DOM元素,因为当前在运行过程中,组件已经被渲染到了页面。但是最后是在componentDidUpdate中进行修改。

销毁中阶段能够使用的钩子函数(按照触发顺序):

componentWillUnmount(在销毁操作执行之前触发)——在组件真正被销毁前调用,在删除组件之前进行清理操作,如计时器和事件监听器。

<body>
    <div id = "example"></div>
</body>
</html>
<script src="build/react.js"></script>
<script src="build/react-dom.js"></script>
<script src="build/browser.min.js"></script>
<script type="text/babel">
    var style = {
        color: "red",
        border: "1px solid #000"
    };
    var HelloWorld = React.createClass({
        render: function(){
            return <p>Hello, {this.props.name ? this.props.name : "World"}</p>;
        },
        componentWillUnmount: function(){
            console.log("I will unmount");
        }
    });
    var HelloUniverse = React.createClass({
        getInitialState: function(){
            return {name: "Yvette"};
        },
        handleChange: function (event) {
            if(event.target.value == "123"){
                React.unmountComponentAtNode(document.querySelector("#example"))
                return;
            }
            this.setState({name: event.target.value});
        },
        render: function(){
            return(
                <div>
                    <HelloWorld name = {this.state.name}></HelloWorld>
                    <br/>
                    <input type = "text" onChange = {this.handleChange} />
                </div>
            );
        }
    });
    ReactDOM.render(<div style = {style}><HelloUniverse></HelloUniverse></div>,document.querySelector("#example"));
</script>

当输入结果为123时,触发componentWillUnmount钩子函数。

时间: 2024-10-07 22:47:28

ReactJS组件生命周期详述的相关文章

8、手把手教React Native实战之ReactJS组件生命周期

1.创建阶段 getDefaultProps:处理props的默认值 在React.createClass调用 2.实例化阶段 React.render(<HelloMessage 启动之后 getInitialState.componentWillMount.render.componentDidMount state:组件的属性,主要是用来存储组件自身需要的数据,每次数据的更新都是通过修改state属性的值,ReactJS内部会监听state属性的变化,一旦发生变化的话,就会主动触发组件的r

React 之 组件生命周期

React 之 组件生命周期 理解1) 组件对象从创建到死亡它会经历特定的生命周期阶段2) React组件对象包含一系列的勾子函数(生命周期回调函数), 在生命周期特定时刻回调3) 我们在定义组件时, 可以重写特定的生命周期回调函数, 做特定的工作 生命周期详述1) 组件的三个生命周期状态: * Mount:插入真实 DOM * Update:被重新渲染 * Unmount:被移出真实 DOM2) React 为每个状态都提供了勾子(hook)函数 * componentWillMount()

angular2系列教程(五)Structural directives、再谈组件生命周期

今天,我们要讲的是structural directives和组件生命周期这两个知识点.structural directives顾名思义就是改变dom结构的指令.著名的内建结构指令有 ngIf, ngSwitch and ngFor. 例子 例子是我自己改写的,编写一个structural directives,然后通过这个指令实例化和注销组件,在此同时监视组件生命周期. 源代码 UnlessDirective 这个指令是官网示例中的指令. src/unless.directive.ts im

React组件生命周期

组件的生命周期 组件有两个值State状态和PorpType属性,当状态发生变化属性就会发生变化.状态确定属性确定. 状态发生变化时会触发不同的钩子函数,从而让开发者有机会做出响应.状态可以理解为事件. 组件生命周期内 初始化-运行- 销毁 初始化阶段可以使用的钩子函数:getDefaultPorps 获取实例的默认属性/getInitialState获取实例的初始化状态/componentWillMount组件即将被渲染/ render渲染/componentDidMount组件装载之后 运行

React Native组件生命周期

概述 所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解空间的生命周期,是开发中必须掌握的一个知识点.就像 Android 开发中组件 一样,React Native的组件也有生命周期(Lifecycle). React Native组件的生命周期大致上可以划分为实例化阶段.存在阶段和销毁阶段.我们只有在理解组件生命周期的基础上,才能开发出高性能的app. React Native中组件的生命周期大致可以用以下图表示: 如图: 第一阶段:是组件第一次绘制阶段,如图中的上面虚线框内,

Android组件生命周期(二)

引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生命周期将讨论活动.服务.广播接收者的生命周期——包括在生命周期中他们可能的状态.通知状态改变的方法.及这些状态的组件寄宿的进程被终结和实例被销毁的可能性. 上篇Android组件生命周期(一)讲解了论活动的生命周期及他们可能的状态.通知状态改变的方法.本篇将介绍服务和广播接收者的生命周期: 服务生命

Android组件生命周期(一)

引言 应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生命周期将讨论活动.服务.广播接收者的生命周期——包括在生命周期中他们可能的状态.通知状态改变的方法.及这些状态的组件寄宿的进程被终结和实例被销毁的可能性. 本文主要讨论活动的生命周期及他们可能的状态.通知状态改变的方法.分为以下三部分: 1.活动生命周期 2.保存活动状态 3.协调活动 1.活动生命

React组件生命周期小结

转载自:http://www.jianshu.com/p/4784216b8194 下面所写的,只适合前端的React.(React也支持后端渲染,而且和前端有点小区别,不过我没用过.) 相关函数 简单地说,React Component通过其定义的几个函数来控制组件在生命周期的各个阶段的动作. 在ES6中,一个React组件是用一个class来表示的(具体可以参考官方文档),如下: // 定义一个TodoList的React组件,通过继承React.Component来实现 class Tod

React—组件生命周期详解

React-组件生命周期详解 转自 明明的博客  http://blog.csdn.net/slandove/article/details/50748473 (非原创) 版权声明:转载请注明出处,欢迎加入QQ群(115402375)讨论!博客编写已经转移到http://blog.csdn.net/limm33 在组件的整个生命周期中,随着该组件的props或者state发生改变,它的DOM表现也将有相应的改变,一个组件就是一个状态机,对于特定的输入,它总会返回一致的输出. React为每个组件