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实现的导航固定效果
Apr 28 Javascript
node.js中的buffer.copy方法使用说明
Dec 14 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
Oct 29 Javascript
跨域请求的完美解决方法(JSONP, CORS)
Jun 12 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
Sep 01 Javascript
原生js实现商品放大镜效果
Jan 12 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
Feb 04 Javascript
Angularjs 动态添加指令并绑定事件的方法
Apr 13 Javascript
小程序和web画三角形实现解析
Sep 02 Javascript
js实现无缝轮播图
Mar 09 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
Oct 24 Javascript
vue实现滑动解锁功能
Mar 03 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
PHP 增加了对 .ZIP 文件的读取功能
2006/10/09 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
javascript复制对象使用说明
2011/06/28 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
jQuery给表格添加分页效果
2017/03/02 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
Bootstrap实现的标签页内容切换显示效果示例
2017/05/25 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
Python 初始化多维数组代码
2008/09/06 Python
python中反射用法实例
2015/03/27 Python
详解Python中的文件操作
2016/08/28 Python
python抽取指定url页面的title方法
2018/05/11 Python
使用python 3实现发送邮件功能
2018/06/15 Python
浅谈Python爬虫基本套路
2019/03/25 Python
python中报错&quot;json.decoder.JSONDecodeError: Expecting value:&quot;的解决
2019/04/29 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
动员大会主持词
2014/03/20 职场文书
小学生倡议书范文
2014/05/13 职场文书
员工生日活动方案
2014/08/24 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
限期整改通知书
2015/04/22 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
MySQL解决Navicat设置默认字符串时的报错问题
2022/06/16 MySQL