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 相关文章推荐
jquery 插件 人性化的消息显示
Jan 21 Javascript
Javascript 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
前端开发的开始---基于面向对象的Ajax类
Sep 17 Javascript
基于JavaScript实现一定时间后去执行一个函数
Dec 14 Javascript
jquery div模态窗口的简单实例
May 28 Javascript
Bootstrap模态框禁用空白处点击关闭
Oct 20 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
Jul 18 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
Jul 27 Javascript
解决vue动态为数据添加新属性遇到的问题
Sep 18 Javascript
vue项目中全局引入1个.scss文件的问题解决
Aug 01 Javascript
Echarts地图添加引导线效果(labelLine)
Sep 30 Javascript
浅谈Vue 自动化部署打包上线
Jun 14 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无限分类的类
2007/01/02 PHP
比较discuz和ecshop的截取字符串函数php版
2012/09/03 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
Laravel日志用法详解
2016/10/09 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
jQuery聚合函数实例
2015/05/21 Javascript
javascript求日期差的方法
2016/03/02 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
Vue.js路由vue-router使用方法详解
2017/03/20 Javascript
使用nodejs爬取前程无忧前端技能排行
2017/05/06 NodeJs
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
Vue 数据响应式相关总结
2021/01/28 Vue.js
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
Python后台管理员管理前台会员信息的讲解
2019/01/28 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
Bench加拿大官方网站:英国城市服装品牌
2017/11/03 全球购物
加拿大在线眼镜零售商:SmartBuyGlasses加拿大
2019/05/25 全球购物
《夜晚的实验》教学反思
2014/02/19 职场文书
成龙洗发水广告词
2014/03/14 职场文书
省文明单位申报材料
2014/05/08 职场文书
2015年教研工作总结
2015/05/23 职场文书
公务员处分决定书
2015/06/25 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers