React学习之State
本文基于React v16.4.1
初学react,有理解不对的地方,欢迎批评指正^_^
一、定义组件的两种方式
1、函数定义组件
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
2、类定义组件
class Welcome extends Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
这两种方式都可以定义一个组件,区别在于类定义的组件有State和生命周期。另外,还要注意的是组件名称要以大写字母开头。
二、为组件添加State
如下,是官网的一个例子:
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}
render() {
return (
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
);
}
}
可以看到,上面的代码在类中添加了constructor()方法,并在其中初始化了this.state 。
关于constructor() :constructor()方法是类必须有的,如果没写,会自动添加。
关于super(props) :super()方法将父类中的this对象继承给子类,添加参数props,就可以使用this.props 。
三、使用State
1、不能直接修改State
初始化this.state只能在constructor()里面,修改State要用setState()方法。
2、可能是异步的
调用setState
,组件的state并不会立即改变,setState
只是把要修改的状态放入一个队列中,React会优化真正的执行时机,并且React会出于性能原因,可能会将多次setState
的状态修改合并成一次状态修改,所以不能用当前的state来计算下一个state。例如下面的写法是错误的:
// Wrong
this.setState({
counter: this.state.counter + this.props.increment,
});
应改为:
// Correct
this.setState((prevState, props) => ({
counter: prevState.counter + props.increment
}));
3、state的更新是浅合并的
例如,下面的state中有title和comments两个变量,当调用this.setState({title: 'react'})修改title时,react会把新的title合并进去,不会改变comment。
constructor(props) {
super(props);
this.state = {
title: 'abc',
comments: []
};
}
【补】
今天遇到了一个问题,react会渲染两次state,一次是初始设置的state,一次是set后的state。
原因:因为react渲染机制造成组建挂载之前,也就是componentDidMount生命周期之前自动获取了原始的state数据,componentDidMount之后state变化已经无法再次获取了。
解决办法:设置一个state,例如hasFetch: false,在set时把hasFetch设为true,根据hasFetch的值判断是否是set后的值。
END-------------------------------------
React学习之State的更多相关文章
- React 学习(三) ---- state 和 事件处理函数
在上两节中,我们讲述了props, 组件使用props进行渲染,但是这是一次性的, props渲染完成之后就不做任何事情了,但是现实中却不是这样的,当我们点击购物车上的加减按钮时,数量会自动加1或减1 ...
- React学习笔记(五)State&声明周期
React学习笔记(五) 四.State&声明周期 可以为组件添加"状态(state)".状态与属性相似,但是状态是私有的,完全受控于当前组件. 局部状态就是只能用于类(定 ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- React学习系列
React学习系列 系列学习react 翻译地址 https://scotch.io/tutorials/learning-react-getting-started-and-concepts 我是初 ...
- react学习笔记1--基础知识
什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...
- react 学习与使用记录
相关技术:webpack+react+react-router+redux+immutable 郭永峰react学习指南 1.git bash--windows命令行工具 --教程 下载地址 2. i ...
- React入门---属性(state)-7
state------>虚拟dom------>dom 这个过程是自动的,不需要触发其他事件来调用它. state中文理解:页面状态的的一个值,可以存储很多东西. 学习state的使用: ...
- 【JAVASCRIPT】React学习-如何构建一个组件
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 组件化思想 组件就是 UI + UI 交互逻辑,组件有三个常规map , 分别为state 状态 . props 数据 ...
- 【JAVASCRIPT】React学习- 数据流(组件通信)
摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 一 组件通信如何实现 父子组件之间不存在继承关系 1.1 父=>子通信 父组件可以通过 this.refs.xx ...
随机推荐
- DMA简介
直接存储器访问 直接存储器访问(Direct Memory Access,DMA)是计算机科学中的一种内存访问技术.它可以让外设可以独立地直接读写系统存储器,而不需绕道中央处理器(CPU),DMA是一 ...
- [实用技巧] Mac下面如何通过终端快速打开当前文件夹
Mac mac里面其实很简单,直接输入 open .,注意是open + 英文句点. Windows windows里面是start .,注意是start + 英文句点.
- Android系统级技巧合集
Android系统级技巧合集(随时更新) #转载请注明来源# 1.高通骁龙系列查看CPU体质等级 CPU体质,即为CPU在工作频率下的电压.同一批次的CPU体质各有不同,体质越高,代表该颗CPU可在更 ...
- 字符串KMP || POJ 2185 Milking Grid
求一个最小矩阵,经过复制能够覆盖原矩阵(覆盖,不是填充,复制之后可以有多的) *解法:横着竖着kmp,求最大公倍数的做法是不对的,见http://blog.sina.com.cn/s/blog_69c ...
- ZOJ3228 Searching the String (AC自动机)
Searching the String Time Limit: 7 Seconds Memory Limit: 129872 ...
- RTMP协议研究
RTMP协议研究 1协议研究概述 协议设计和分析一直都是在工作遇到,正好在这里总结一下,说到协议,在这个网络的时代,没有人可以离开它了.他存在我们生活中的任何角落,只不过我们平时,并没有注意到它的存在 ...
- IO之Object流举例
import java.io.*; public class TestObjectIO { public static void main(String args[]) throws Exceptio ...
- 5. 在Datadir目录外创建单独表空间
5. 在Datadir目录外创建单独表空间 要在MySQL dadadir之外的位置创建单独表空间,请使用该子句: DATA DIRECTORY = '/path' 在目标目录中,MySQL会创建一个 ...
- echart使用自定义单个柱状颜色实现
项目实践中遇到一个根据需要,当X轴等于某个值是,柱状变成特殊颜色的需求,大致有两个方案实现: 1.在前台遍历数据对象,判断设置: 2.在后台拼装数据是,按照格式要求拼装好: 手拉手,用Vue开发动态刷 ...
- Django 1.8.11 REST风格路由
# -*- coding: utf-8 -*- """ Tencent is pleased to support the open source community b ...