React 入门学习笔记整理(七)—— 生命周期
(1)react 生命周期
只有类组件有生命周期,函数组件没有生命周期
1、挂载阶段:这些方法会在组件实例被创建和插入DOM中时被调用:
1)constructor(props)
初始化组件的状态、绑定方法,可以在构造函数中完成。
注意:状态不会随着属性的更新而更新。为了保证属性和状态同步,通常需要状态提升。
2) static getDerivedStateFromProps(nextProps, prevState)
组件实例化和接收新属性时将会getDerivedStateFromProps。它应该返回一个对象来更新状态,或者返回null来表明新属性不需要更新任何状态。
注意:如果父组件导致组件的重新渲染,即使属性没有更新,这一方法也会被调用。如果只想处理变化,需要去比较新旧值
3)componentWillMount()
在组件挂载到DOM前调用,且只会被调用一次,在这边调用this.setState不会引起组件重新渲染,也可以把写在这边的内容提前到constructor()中,所以项目中很少用。
4)render()
5)componentDidMount()
组件挂载到DOM之后执行,且只会被调用一次。
在这个方法中调用setState()将会触发一次额外的渲染,但是它将在浏览器刷新屏幕之前发生。这保证了即使render()将会调用两次,但用户不会看到中间状态。谨慎使用这一模式,因为它常导致性能问题。然而,它对于像模态框和工具提示框这样的例子是必须的。这时,在渲染依赖DOM节点的尺寸或者位置的视图前,你需要先测量这些节点。
2、更新阶段:属性或状态的改变会触发一次更新
1)componentWillReceiveProps(nextProps)
在装载的组件接收到新属性前调用
若你需要更新状态响应属性改变(例如,重置它),可能你需对比this.props状语从句:nextProps并在该方法中使用this.setState()处理状态改变。
注意即使属性未有任何改变,可能也会调用该方法,因此若你想要处理改变,请确保比较当前和之后的值。这可能会发生在当父组件引起你的组件重新渲染。
2) static getDerivedStateFromProps()
3)shouldComponentUpdate(nextProps, nextState)
当接收到新属性或状态时,shouldComponentUpdate()在渲染前被调用。默认为true。方法该不会并在初始化渲染或当使用forceUpdate()时被调用。
当前,若shouldComponentUpdate()返回false,而后componentWillUpdate(),render()和componentDidUpdate()将不会被调用
4)componentWillUpdate(nextProps, nextState)
当接收到新属性或状态时,componentWillUpdate会在渲染前被调用。
注意:不能再这里调用this.State(),若你需要更新状态响应属性的调整,使用getDerivedStateFromProps()代替。
若shouldComponentUpdate()返回false,componentWillUpdate将不会被调用。
5)render()
6)getSnapshotBeforeUpdate()
在最新的渲染输出提交给DOM前将会立即调用。它让你的组件能在当前的值可能要改变前获得它们,这一生命周期返回的任何职将会作为参数被传递给componentDidUpdate()
7)componentDidUpdate()
该方法会在更新发生后立即被调用。初始化时不会渲染。
当组件被更新时,使用该方法是操作DOM的一次机会。这也是一个适合发送请求的地方,要是你对比了当前属性和之前属性(例如,如果属性没有改变那么请求也就没必要了)。
注意:若shouldComponentUpdate()返回false,componentDidUpdate()将不会被调用。
3、销毁阶段
1)componentWillUnmount()
componentWillUnmount()在组件被卸载和销毁之前立刻调用。可以在该方法里处理任何必要的清理工作,例如解绑定时器,取消网络请求,清理任何在componentDidMount环节创建的DOM元素。
2)componentDidCatch(error, info)
错误边界是React组件,并不是损坏的组件树。错误边界捕捉发生在子组件树中任意地方的JavaScript错误,打印错误日志,并且显示回退的用户界面。错误边界捕捉渲染期间、在生命周期方法中和在它们之下整棵树的构造函数中的错误。
如果定义了这一生命周期方法,一个类组件将成为一个错误边界。在错误边界中调用setState()让你捕捉当前树之下未处理的JavaScript错误,并显示回退的用户界面。只使用错误边界来恢复异常,而不要尝试将它们用于控制流。
(2)基于回调的组件交流
import React, { Component } from 'react';
function Send(props){
return (
<div>
<button onClick={props.changeMsg}>发送消息</button>
</div>
)
}
function Receive(props){
return (
<div>
<p style={{display:'inline-block'}}>接收消息:</p>
<p style={{
display:'inline-block',
marginLeft:20
}}>{props.msg}</p>
</div>
)
}
function Input(props){
return (
<input type="text" ref={props.getInput}/>
)
}
class App extends Component {
constructor(props){
super(props);
this.state = {
msg:'天气好',
sunInput:''
}
}
changeMsg=()=>{
this.setState({
//this.sunInput是获取Input节点
msg:this.sunInput.value
})
}
render() {
return (
<div className="App">
<Input getInput={el=>this.sunInput=el} />
<Receive msg={this.state.msg}></Receive>
<Send changeMsg={this.changeMsg}></Send>
</div>
);
}
}
export default App;
React 入门学习笔记整理(七)—— 生命周期的更多相关文章
- React 入门学习笔记整理目录
React 入门学习笔记整理(一)--搭建环境 React 入门学习笔记整理(二)-- JSX简介与语法 React 入门学习笔记整理(三)-- 组件 React 入门学习笔记整理(四)-- 事件 R ...
- React 入门学习笔记整理(一)——搭建环境
使用create-react-app脚手架搭建环境 1.安装node .软件下载地址:https://nodejs.org/en/,我下的推荐的版本. 安装之后测试是否安装成功.windows系统下, ...
- React 入门学习笔记整理(二)—— JSX简介与语法
先看下这段代码: import React from 'react'; //最终渲染需要调用ReactDOM库,将jsx渲染都页面中 import ReactDOM from 'react-dom'; ...
- React 入门学习笔记整理(三)—— 组件
1.定义组件 1)函数组件 function GreateH(props){ return <div> <h2>hello,{props.name}</h2> &l ...
- React 入门学习笔记整理(四)—— 事件
1.事件定义 React事件绑定属性的命名采用驼峰式写法,而不是小写. 如果采用 JSX 的语法你需要传入一个函数作为事件处理函数,而不是一个字符串(DOM元素的写法) 在类组件中定义函数,通过thi ...
- React 入门学习笔记整理(五)—— state
1.state 1)组件本省也是有状态的,定义在组件内部的state中,state的状态只能由组件自身改变,任何其他组件都不能改变. 当需要改变state时,通过调用setState方法来改变,set ...
- React 入门学习笔记整理(六)—— 组件通信
1.父子组件通信 1)父组件与子组件通信,使用Props 父组件将name传递给子组件 <GreateH name="kitty"/> 子组件通过props接收父组件的 ...
- React 入门学习笔记整理(八)—— todoList
APP.js import React, { Component,createRef,Fragment} from 'react'; import Todos from './components/t ...
- React 入门学习笔记整理(九)——路由
(1)安装路由 React-router React-router提供了一些router的核心api,包括Router, Route, Switch等,但是它没有提供dom操作进行跳转的api. Re ...
随机推荐
- liunx----配置搜狗输入法
话不多说直接看步骤 * 系统版本: ubuntu 18.04.1 // 查看命令为: # cat /etc/issue 1. 先查看当前系统是否存在 fcitx 框架: # dpkg -l | gre ...
- css高级选择器&盒模型
css高级选择器&盒模型 1.组合选择器 群组选择器 /* 每个选择器为可以为三种基础选择器的任意一个,用逗号隔开,控制多个*/ div,.div,#div{ color:red } 后代(子 ...
- ubuntu16.04 编译出错:fatal error: SDL/SDL.h: No such file or directory
在ubuntu 16.04编译神经网络代码时候,遇到了这样一种错误? fatal error: SDL/SDL.h: No such file or directory 原因是SDL库没有安装,根据你 ...
- CentOS7 linux 中提示 bash: ls: 未找到命令...
记录一次CentOS7里执行ls命令失败的问题 执行ls命令时报找不到命令,原因是环境变量PATH被修改, 解决办法: 执行 export PATH=/bin:/usr/bin:$PATH 然后 ...
- scrapy 框架入门
运行流程 官网:https://docs.scrapy.org/en/latest/intro/overview.html 流程图如下: 组件 1.引擎(EGINE):负责控制系统所有组件之间的数据流 ...
- Django model update的各种用法介绍
Django开发过程中对表(model)的增删改查是最常用的功能之一,本文介绍笔者在使用model update过程中遇到的那些事 model update常规用法 假如我们的表结构是这样的 clas ...
- 课程四(Convolutional Neural Networks),第一周(Foundations of Convolutional Neural Networks) —— 2.Programming assignments:Convolutional Model: step by step
Convolutional Neural Networks: Step by Step Welcome to Course 4's first assignment! In this assignme ...
- ETCD&Flannel安装
.ETCD 安装: nohup etcd --name etcd0 \ --advertise-client-urls http://172.31.24.246:2379,http://127.0.0 ...
- NIO ServerSocketChannel ScoketChannel
package com.yb.nio; import java.io.IOException; import java.net.InetSocketAddress; import java.net.S ...
- 根域名服务器(root DNS Servers)会被DDoS打垮么?
域名服务作为互联网的基础设施,它的重要性不言而喻.目前全球的十三个根域名服务器和成千上万的授权域名服务器承担着超过万亿次的DNS查询,默默为全世界的网民做域名解析服务. 这样重要的基础设施,必然是全世 ...