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 相关文章推荐
IE6不能修改NAME问题的解决方法
Sep 03 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
Jun 19 Javascript
用javascript替换URL中的参数值示例代码
Jan 27 Javascript
javascript匿名函数应用示例介绍
Mar 07 Javascript
AngularJS基础学习笔记之表达式
May 10 Javascript
JavaScript中的继承之类继承
May 01 Javascript
JavaScript获取键盘按键的键码(参照表)
Jan 10 Javascript
Angular2中select用法之设置默认值与事件详解
May 07 Javascript
React 子组件向父组件传值的方法
Jul 24 Javascript
vue axios 在页面切换时中断请求方法 ajax
Mar 05 Javascript
vue的安装及element组件的安装方法
Mar 09 Javascript
vue编写简单的购物车功能
Jan 08 Vue.js
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
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
PHP实现QQ登录实例代码
2016/01/14 PHP
php中namespace use用法实例分析
2016/01/22 PHP
解决微信授权回调页面域名只能设置一个的问题
2016/12/11 PHP
Laravel下生成验证码的类
2017/11/15 PHP
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
javascript实现了照片拖拽点击置顶的照片墙代码
2015/04/03 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
使用Vant完成通知栏Notify的提示操作
2020/11/11 Javascript
[00:09]DOTA2新版本PA至宝特效动作展示
2014/11/19 DOTA
python非递归全排列实现方法
2017/04/10 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
分析python请求数据
2018/08/19 Python
Django中提示消息messages的设置方式
2019/11/15 Python
python 实现list或string按指定分段
2019/12/25 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
用pushplus+python监控亚马逊到货动态推送微信
2021/01/29 Python
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
什么是抽象
2015/12/13 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
喜之郎果冻广告词
2014/03/20 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis