React学习笔记(五)State&声明周期
React学习笔记(五)
四、State&声明周期

可以为组件添加“状态(state)”。状态与属性相似,但是状态是私有的,完全受控于当前组件。
局部状态就是只能用于类(定义为类的组件)的一个功能。
1. 将函数转换为类
声明一个类,继承React.Component;创建一个render()方法;使用this.props替换props。
class Clock extends React.Component {
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is { this.props.date.toLocaleTimeSting() }.</h2>
</div>
)
}
}
2. 为一个类添加局部状态
使用状态,就不应该再用this.props,而是this.state。
为类添加一个构造函数来初始化state
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = { date: new Date() };
}
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is { this.state.date.toLocaleTimeSting() }.</h2>
</div>
)
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
类组件应始终使用
props调用基础构造函数。
3. 将生命周期方法添加到类中
这里提到两个生命周期钩子函数:
- 挂载
componentDidMount当组件输出到DOM后 - 卸载
componentWillUnmount
通过this.setState()方法来更新组件局部状态。
class Clock extends React.Component{
constructor() {
...
}
// 组件挂载 设置定时器
componentDidMount() {
this.timer = setInterval(
() => this.tick(),
1000
);
}
// 组件卸载 清除定时器
componentWillUnmount() {
clearInterval(this.timer);
}
tick() {
// 更新state
this.setState({
date: new Date()
});
}
render() {
return ...
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
4. 正确地使用state
- 不要直接更新状态;必须调用
setState()方法。 - 同时构造函数是唯一能够初始化state的地方。
- 状态更新可能是异步的。
// 使用props和state计算下一个状态
// @param {Object} prevState 先前的状态
// @param {Object} props 此次更新被应用时的props
this.setState((prevState, props) => ({
counter: prevState.counter + props.increment
}));
- 状态更新合并。也就是说,调用
setState()时,提供的对象是合并至当前状态中。且完全替换这个状态。
5. 数据自顶向下流动(单向数据流)
状态应当只有组件本身拥有并设置它;
但组件可以将其状态作为属性传递给其子组件。也就是说,从该状态导出的任何数据或UI只能影响数中下方的组件。
这就是单向数据流。
The end... Last updated by: Jehorn, April 15, 2019, 5:20 PM
React学习笔记(五)State&声明周期的更多相关文章
- React学习笔记-03 state
每一个组件都有状态,比如一个开关,开 和 关,都是一种state.那么react是怎么管理它的state的? React 把用户界面当做状态机,可以轻松的让用户界面和数据保持一致.用户只需要更新组件的 ...
- react学习笔记1之声明组件的两种方式
//定义组件有两种方式,函数和类 function Welcome(props) { return <h1>Hello, {props.name}</h1>; } class ...
- React学习笔记(一)- 入门笔记
React入门指南 作者:狐狸家的鱼 本文链接:React学习笔记 GitHub:sueRimn 1.组件内部状态state的修改 修改组件的每个状态,组件的render()方法都会再次运行.这样就可 ...
- react学习笔记1--基础知识
什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...
- React学习笔记(七)条件渲染
React学习笔记(七) 六.条件渲染 使用if或条件运算符来创建表示当前状态的元素. 可以使用变量来存储元素.比如: let button = null; if (isLoggedIn) { but ...
- React学习笔记(六)事件处理
React学习笔记(六) 五.事件处理 React事件绑定属性的命名采用驼峰写法,不同于传统DOM全部小写. 如果采用JSX的语法,事件函数需要用大括号{}包裹函数名,不同于传统DOM字符串小括号的方 ...
- 【React】react学习笔记02-面向组件编程
react学习笔记02-面向组件编程 面向组件编程,直白来说,就是定义组件,使用组件. 以下内容则简单介绍下组建的声明与使用,直接复制demo观测结果即可. 步骤: 1.定义组件 a.轻量组件-函 ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
随机推荐
- Go语言学习笔记四: 运算符
Go语言学习笔记四: 运算符 这章知识好无聊呀,本来想跨过去,但没准有初学者要学,还是写写吧. 运算符种类 与你预期的一样,Go的特点就是啥都有,爱用哪个用哪个,所以市面上的运算符基本都有. 算术运算 ...
- WordPress主题开发:为文章添加自定义栏目
开启自定义栏目:点击头顶的“显示选项”,勾选“自定义栏目” 然后编辑文章时,即可看见 实验: 定义名称为:play_url ,值为:http://www.xiami.com/widget/635357 ...
- WCF-绑定模型(二)
二.绑定元素 每一个类型的绑定最重要的就是绑定元素了,每个绑定的功能特性都由绑定元素决定.BasicHttpBinding由用于编码的TextMessageEncodingBindingElement ...
- 阿里云服务器(Ubuntu16.04 64位)远程连接
购买阿里云服务器 1.打开阿里云官方网站,账号登录,选择产品中的云服务器 ECS 2.根据自身需求,选择合适的阿里云服务器系统,(1)点击一键购买,(2)选择地域,(3)根据自身需求,选择系统,这里选 ...
- 引入第三方js文件,报错
错误:Mixed Content: The page at 'https://localhost:44336/MENU' was loaded over HTTPS, but requested an ...
- 4、构造方法、this、super
构造方法 构造方法引入 * A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是 ...
- 【SSH网上商城项目实战08】查询和删除商品类别功能的实现
转自:https://blog.csdn.net/eson_15/article/details/51338991 上一节我们完成了使用DataGrid显示所有商品信息,这节我们开始添加几个功能:添加 ...
- CodeForces 616A(水题)
while(t--) 最后结果t=-1 #include <iostream> #include <string> #include <cstring> #incl ...
- 基于SSH框架下登录验证码模块的实现
1.前端页面代码: 主要以jQuery的ajax异步请求实现. ... <script type="text/javascript" src="${pageCont ...
- Access MetaData
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...