react 之 state 对象

简介: 首先,在 react 中,通过类来构建 react 组件时,可以在类的构造函数 constructor 中可以使用 react 的属性 state,属性 state 是一个对象,在对象中可以定义组件需要的属性和属性值,比如下面的例子:

首先,在 react 中,通过类来构建 react 组件时,可以在类的构造函数 constructor 中可以使用 react 的属性 state,属性 state 是一个对象,在对象中可以定义组件需要的属性和属性值,比如下面的例子:


import React from "react";
import reactDom from "react-dom";
class App extends React.Component{
    constructor(){
        super();
        this.state = { num: 0 };
    }
}

接下来,我们就可以在 react 组件内部的 render 方法定义虚拟 DOM 元素时使用挂载在类组件上的 state 对象。 例如:



class App extends React.Component {
  render() {
    return (
      <React.Fragment>
        <p>{this.state.num}</p>
      </React.Fragment>
    );
  }
}

再者,我们通过 React-Dom 的 render 方法将创建好的类组件渲染到页面上,代码如下:


reactDom.render(<App></App>,window.root);

这样,页面上就可以看到,在 root 节点下面已经有一个子节点 p,并且 p 节点显示的内容为 0。


15891c3bb40a8a5d360bafb1f827aa019598f11b

react setState 修改组件状态

在 react 中提供了一个 setState 方法,这个方法主要用来修改组件的状态,调用这个方法后,react 将会调用 react-dom 中的 render 方法重新渲染页面。

那么,这个 setState 方法该在哪里使用?并且如何使用呢? 下面,我们就基于上面的例子进行扩展来说明 setState 该如何使用:

首先我们在需要进行渲染的虚拟 DOM 元素上增加 2 个按钮:


class App extends React.Component {
  render() {
    return (
      <React.Fragment>
        <p>{this.state.num}</p>
        <button onClick={this.add}>增加</button>
        <button onClick={this.remove}>删除</button>
      </React.Fragment>
    );
  }
}

接下来,我们给"增加"按钮添加一个 add 方法,当点击这个"增加"按钮时给 state 对象上的 num 属性的属性值增加 1。


 add = () => {
    // 这里我们采用定时器的方式,不停的调用setState给num属性赋值
    this.timer = setInterval(() => {
      // prevState是react自带的,表示的是没设置之前的状态
      this.setState(prevState => ({ num: prevState.num + 1 }));
    },1000);
  };

这时我们去页面上点击"增加"按钮,触发 add 方法,num 属性的值就不停的修改:

5ade6435a9338b5101148824fb4a6e566463373e

现在,我们还有一个"删除"按钮没有完成,这里删除按钮的思路是将整个组件移除掉,让我们一起来完成 remove 事件吧:


// 移除虚拟DOM节点,销毁组件
remove = () => {
    // 移除指定DOM节点上的组件
    reactDom.unmountComponentAtNode(window.root);
};

这时我们去页面上点击"增加"按钮,触发 add 方法,然后再点击"删除"按钮,触发 remove 方法,此时我们可以发现,root 的子节点全部都删除,但是不好意思,浏览器 console 中出现了一个错误,让我们一起来看看吧:

6be7cb9fb0f9c6e4038072f281565fc11efff8f3

很明显,这是react给出的一个提示,说明我们的代码中出现的错误,具体的含义是:

"无法在未安装的组件上调用SETStATE(或FracePoPoT)。这是一个NOP,但是它指示了应用程序中的内存泄漏。若要修复,请取消组件Wun卸除方法中的所有订阅和异步任务。"

意思是我们在调用remove方法的时候,已经将整个组件都从页面上移除了,页面上已经没有了这个组件,但是我们的add方法是通过一个定时器不停的修改这个组件的状态值,但是组件都已经不存在了,所以就会报这样的一个警告,所以要解除这个警告需要在组件卸载之前将定时任务给清空。

因此,在这里,我们需要用到react生命周期里提供的一个方法:componentWillUnmount。这个方法在组件从DOM中移除时立刻被调用。



componentWillUnmount(){
    clearTimeout(this.timer);
}

now,我们再来看看页面上移除组件后会不会触发警告:

d39b4ab8b92934646a71596104d715e55071e7f5

好了,关于react中的state对象先整理到这里,欢迎大家一起交流、沟通。



原文发布时间为:2018年06月28日
原文作者: tenor
本文来源: 掘金  如需转载请联系原作者




相关文章
|
前端开发 JavaScript
学习react基础(3)_setState、state、jsx、使用ref的几种形式
本文探讨了React中this.setState和this.state的区别,以及React的核心概念,包括核心库的使用、JSX语法、类与函数组件的区别、事件处理和ref的使用。
381 3
学习react基础(3)_setState、state、jsx、使用ref的几种形式
|
存储 前端开发 API
第六章 react组件实例中三大属性之State
第六章 react组件实例中三大属性之State
234 0
|
前端开发
学习react基础(2)_props、state和style的使用
本文介绍了React中组件间数据传递的方式,包括props和state的使用,以及如何在React组件中使用style样式。
354 0
|
存储 前端开发
在React框架中,如何使用对象来管理组件的状态
在React中,组件状态通过`state`对象管理,利用`setState`方法更新状态。状态变化触发组件重新渲染,实现UI动态更新。对象结构清晰,便于复杂状态管理。
|
前端开发
React组件实例更改state状态值(四)
【8月更文挑战第14天】React组件实例更改state状态值(四)
264 1
React组件实例更改state状态值(四)
|
前端开发 JavaScript
React组件实例state(三)
【8月更文挑战第14天】React组件实例state(三)
191 1
React组件实例state(三)
|
前端开发 JavaScript 调度
React 组件状态(State)
10月更文挑战第8天
375 1
|
前端开发
React使用hooks遇到的坑_state中的某几个属性数据变成了空字符
本文讨论了在React使用hooks时遇到的一个问题:state中的某些属性数据变成了空字符。作者通过在修改函数中重新解构赋值来获取最新的state值,解决了因数据更新不及时导致的问题。
278 1
|
JSON 前端开发 中间件
React读取properties配置文件转化为json对象并使用在url地址中
本文介绍了如何在React项目中读取properties配置文件,将其内容转化为JSON对象,并在请求URL地址时使用这些配置。文章详细说明了异步读取文件、处理字符串转换为JSON对象的过程,并提供了一个封装函数,用于在发起请求前动态生成配置化的URL地址。
576 1
|
存储 前端开发 JavaScript
前端框架与库 - React基础:组件、Props、State
【7月更文挑战第12天】React是JavaScript库,专注UI构建,基于组件化。组件是UI模块,可函数式或类定义。Props是组件间安全传递数据的只读参数,用defaultProps和propTypes保证正确性。State则是组件内部可变数据,用于驱动更新。使用setState()确保正确变更和渲染。了解并妥善处理这些概念是高效React开发的基础。
351 7