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来定位
Feb 20 Javascript
用javascript实现的仿Flash广告图片轮换效果
Apr 24 Javascript
jquery checkbox,radio是否选中的判断代码
Mar 20 Javascript
与jquery serializeArray()一起使用的函数,主要来方便提交表单
Jan 31 Javascript
JavaScript中setInterval的用法总结
Nov 20 Javascript
sea.js常用的api简易文档
Nov 15 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
Aug 03 Javascript
vue组件横向树实现代码
Aug 02 Javascript
详解Axios统一错误处理与后置
Sep 26 Javascript
vue文件运行的方法教学
Feb 12 Javascript
基于vue实现web端超大数据量表格的卡顿解决
Apr 02 Javascript
react PropTypes校验传递的值操作示例
Apr 28 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实现无限极分类图文教程
2014/11/25 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
一个可以显示阴历的JS代码
2007/03/05 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
微信小程序 request接口的封装实例代码
2017/04/26 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
2017/11/27 Javascript
Swift中的协议(protocol)学习教程
2016/07/08 Python
Python+matplotlib+numpy绘制精美的条形统计图
2018/01/02 Python
Django基础知识与基本应用入门教程
2018/07/20 Python
python实现C4.5决策树算法
2018/08/29 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
2018/10/09 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
Python笔记之工厂模式
2019/11/20 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
详解Anaconda安装tensorflow报错问题解决方法
2020/11/01 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
零件设计自荐信范文
2013/11/27 职场文书
企业统计员岗位职责
2013/12/13 职场文书
校长就职演讲稿
2014/01/06 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
Python+Tkinter打造签名设计工具
2022/04/01 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python
Golang ort 中的sortInts 方法
2022/04/24 Golang
详解如何使用Nginx解决跨域问题
2022/05/06 Servers