react 生命周期实例分析


Posted in Javascript onMay 18, 2020

本文实例讲述了react 生命周期。分享给大家供大家参考,具体如下:

组件挂载:

componentWillMount(组件将要挂载到页面)->render(组件挂载中)->componentDidMount(组件挂载完成后)

组件更新:

1、shouldComponentUpdate(render之前执行,参数为ture时执行render,为false时不执行render)

componentWillUpdate(shouldComponentUpdate之后执行)

componentDidUpdate(render之后执行)

顺序:shouldComponentUpdate-》componentWillUpdate-》render-》componentDidUpdate

import React, { Component, Fragment } from 'react';
import List from './List.js';
 
class Test extends Component {
  constructor(props) {
    super(props);
    this.state={
      inputValue:'aaa',
      list:['睡觉','打游戏'],
    }
    // this.add=this.add.bind(this);
  }
 
  addList() {
    this.setState({
      list:[...this.state.list,this.state.inputValue],
      inputValue:''
    })
  }
 
  change(e) {
    this.setState({
      // inputValue:e.target.value
      inputValue:this.input.value
    })
  }
 
  delete(i) {
    // console.log(i);
    const list = this.state.list;
    list.splice(i,1);
    this.setState({
      list:list
    })
  }
 
  //组件将要挂载到页面时
  componentWillMount() {
    console.log('componentWillMount');
  }
 
  //组件完成挂载后
  componentDidMount() {
    console.log('componentDidMount');
  }
 
  //组件被修改之前,参数为ture时执行render,为false时不往后执行
  shouldComponentUpdate() {
    console.log('1-shouldComponentUpdate');
    return true;
  }
 
  //shouldComponentUpdate之后  
  componentWillUpdate() {
    console.log('2-componentWillUpdate');
  }
 
  //render执行之后
  componentDidUpdate() {
    console.log('4-componentDidUpdate');
  }
 
 
  //组件挂载中
  render() { 
    console.log('3-render');
    return (
      <Fragment>
      <div>
        <input ref={(input)=>{this.input=input}} value={this.state.inputValue} onChange={this.change.bind(this)}/>
        <button onClick={this.addList.bind(this)}>添加</button>
      </div>
      <ul>
        {
          this.state.list.map((v,i)=>{
            return(
                <List key={i} content={v} index={i} delete={this.delete.bind(this)} />
            );
          })
        }
      </ul>
      </Fragment>
    );
  }
}
 
export default Test;

2、componentWillReceiveProps(子组件中执行。组件第一次存在于虚拟dom中,函数不会被执行,如果已经存在于dom中,函数才会执行)

componentWillUnmount(子组件在被删除时执行)

import React, { Component } from 'react';
import PropTypes from 'prop-types';
 
class List extends Component {
  constructor(props) {
    super(props);
    this.delete = this.delete.bind(this);
  }
  
  //组件第一次存在于虚拟dom中,函数不会被执行
  //如果已经存在于dom中,函数才会执行
  componentWillReceiveProps() {
    console.log('componentWillReceiveProps');
  }
 
  //子组件被删除时执行
  componentWillUnmount() {
    console.log('componentWillUnmount');
  }
 
  render() { 
    return (
    <li
    onClick={this.delete}>{this.props.name}{this.props.content}</li>
    );
  }
 
  delete=() => {
    this.props.delete(this.props.index);
  }
}
 
List.propTypes={
  name:PropTypes.string.isRequired,
  content:PropTypes.string,
  index:PropTypes.number,
  delete:PropTypes.func
}
 
//设置默认值:
 
List.defaultProps={
  name:'喜欢'
}
 
export default List;

组件性能优化:

import React, { Component } from 'react';
import PropTypes from 'prop-types';
 
class List extends Component {
  constructor(props) {
    super(props);
    this.delete = this.delete.bind(this);
  }
  
  //组件第一次存在于虚拟dom中,函数不会被执行
  //如果已经存在于dom中,函数才会执行
  componentWillReceiveProps() {
    console.log('componentWillReceiveProps');
  }
 
  //子组件被删除时执行
  componentWillUnmount() {
    console.log('componentWillUnmount');
  }
 
  shouldComponentUpdate(nextProps,nextState) {
    if (nextProps.content !== this.props.content) {
      return true;
    } else {
      return false;
    }
  }
 
  render() { 
    return (
    <li
    onClick={this.delete}>{this.props.name}{this.props.content}</li>
    );
  }
 
  delete=() => {
    this.props.delete(this.props.index);
  }
}
 
List.propTypes={
  name:PropTypes.string.isRequired,
  content:PropTypes.string,
  index:PropTypes.number,
  delete:PropTypes.func
}
 
//设置默认值:
 
List.defaultProps={
  name:'喜欢'
}
 
export default List;

希望本文所述对大家react程序设计有所帮助。

Javascript 相关文章推荐
JS+XML 省份和城市之间的联动实现代码
Oct 14 Javascript
表单元素的submit()方法和onsubmit事件应用概述
Feb 01 Javascript
javascript原型模式用法实例详解
Jun 04 Javascript
javascript图片延迟加载实现方法及思路
Dec 31 Javascript
jQuery基于扩展简单实现倒计时功能的方法
May 14 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
Jul 22 jQuery
JS获取月的第几周和年的第几周实例代码
Dec 05 Javascript
Node.js操作系统OS模块用法分析
Jan 04 Javascript
微信小程序template模版的使用方法
Apr 13 Javascript
JavaScript制作3D旋转相册
Aug 02 Javascript
Js图片点击切换轮播实现代码
Jul 27 Javascript
javascript实现用户必须勾选协议实例讲解
Mar 24 Javascript
react使用CSS实现react动画功能示例
May 18 #Javascript
Node.js API详解之 net模块实例分析
May 18 #Javascript
Javascript实现简易天数计算器
May 18 #Javascript
微信小程序开发打开另一个小程序的实现方法
May 17 #Javascript
微信小程序开发之获取用户手机号码(php接口解密)
May 17 #Javascript
关于AngularJS中几种Providers的区别总结
May 17 #Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 #Javascript
You might like
php IP及IP段进行访问限制的代码
2008/12/17 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
javascript之大字符串的连接的StringBuffer 类
2007/05/08 Javascript
js表数据排序 sort table data
2009/02/18 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
Angular中$state.go页面跳转并传递参数的方法
2017/05/09 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
十条建议帮你提高Python编程效率
2016/02/16 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
2018/10/23 Python
使用python opencv对目录下图片进行去重的方法
2019/01/12 Python
django 实现编写控制登录和访问权限控制的中间件方法
2019/01/15 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
机电工程专业应届生求职信
2013/10/03 职场文书
假面舞会策划方案
2014/05/29 职场文书
公民授权委托书范本
2014/09/17 职场文书
给病人的慰问信
2015/03/23 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书