本文基于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的更多相关文章

  1. React 学习(三) ---- state 和 事件处理函数

    在上两节中,我们讲述了props, 组件使用props进行渲染,但是这是一次性的, props渲染完成之后就不做任何事情了,但是现实中却不是这样的,当我们点击购物车上的加减按钮时,数量会自动加1或减1 ...

  2. React学习笔记(五)State&声明周期

    React学习笔记(五) 四.State&声明周期 可以为组件添加"状态(state)".状态与属性相似,但是状态是私有的,完全受控于当前组件. 局部状态就是只能用于类(定 ...

  3. react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)

    react学习小结   本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...

  4. React学习系列

    React学习系列 系列学习react 翻译地址 https://scotch.io/tutorials/learning-react-getting-started-and-concepts 我是初 ...

  5. react学习笔记1--基础知识

    什么是react A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES[React是一个用于构建用户界面的JavaScript库.] React之所以快, ...

  6. react 学习与使用记录

    相关技术:webpack+react+react-router+redux+immutable 郭永峰react学习指南 1.git bash--windows命令行工具 --教程 下载地址 2. i ...

  7. React入门---属性(state)-7

    state------>虚拟dom------>dom 这个过程是自动的,不需要触发其他事件来调用它. state中文理解:页面状态的的一个值,可以存储很多东西. 学习state的使用: ...

  8. 【JAVASCRIPT】React学习-如何构建一个组件

    摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 组件化思想 组件就是 UI + UI 交互逻辑,组件有三个常规map , 分别为state 状态 . props 数据 ...

  9. 【JAVASCRIPT】React学习- 数据流(组件通信)

    摘要 react 学习包括几个部分: 文本渲染 JSX 语法 组件化思想 数据流 一 组件通信如何实现 父子组件之间不存在继承关系 1.1 父=>子通信 父组件可以通过 this.refs.xx ...

随机推荐

  1. Oracle EXPDP and IMPDP

    一.特点 • 可通过 DBMS_DATAPUMP 调用 • 可提供以下工具: – expdp – impdp – 基于 Web 的界面 • 提供四种数据移动方法: – 数据文件复制 – 直接路径 – ...

  2. Python3基础教程(十九)—— 项目结构

    本节阐述了一个完整的 Python 项目结构,你可以使用什么样的目录布局以及怎样发布软件到网络上. 创建Python项目 我们的实验项目名为 factorial,放到 /home/shiyanlou/ ...

  3. while循环(break、continue)

    while循环 流程:判断条件是否为真,如果条件为真,执行代码块,然后再次判断条件是否为真,如果为真,执行代码块,直到条件判断为假,结束循环 格式 while  条件: 代码块(循环体) else:- ...

  4. python基础一 day6 文件操作

    读写只会进行两步, r+模式下写读 seek是按字节去找的 for line in f: for循环是一行一行的读取出来 strip默认去空格和换行符 空格.制表符.换行符.回车.换页垂直制表符和换行 ...

  5. CPP-基础:快速排序

    快速排序(Quicksort)是对冒泡排序的一种改进. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分 ...

  6. 二分+贪心 || CodeForces 551C GukiZ hates Boxes

    N堆石头排成一列,每堆有Ai个石子.有M个学生来将所有石头搬走.一开始所有学生都在原点, 每秒钟每个学生都可以在原地搬走一块石头,或者向前移动一格距离,求搬走所有石头的最短时间. *解法:二分答案x( ...

  7. python之道02

    猜数字,设定一个理想数字比如:66,让用户输入数字,如果比66大,则显示猜测的结果大了,然后继续让用户输入; 如果比66小,则显示猜测的结果小了,然后继续让用户输入;只有等于66,显示猜测结果正确,然 ...

  8. freemarker list集合去重,实现hashset

    在freemarker中没有提供去重的方法,虽然有提供定义hash的方法,如:<#assign myHash = { "name": "mouse", & ...

  9. Java应用异常状态监测

    阿里巴巴中间件技术专栏 老板最近分派了一个任务,说线上客户在部署应用的时候发生了系统级别的OOM,触发了OOM Killer杀掉了应用,让我们解决这个问题. 对于这个任务,我从如下几点开始调研.分析与 ...

  10. 【Python基础】迭代器、生成器

    迭代器和生成器 迭代器 一 .迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单 ...