react 组件之组件的状态,state

简介: 组件分为函数组件和类组件,在hooks 出来之前,只有类组件才有状态,现在不管函数组件和类组件,都是含有状态的。这里只讨论类组件的状态

组件分为函数组件和类组件,在hooks 出来之前,只有类组件才有状态,现在不管函数组件和类组件,都是含有状态的。这里只讨论类组件的状态


含义以及意义


** 含义**

组件的状态,其实就是组件中的一个属性,这个属性就是state。


import React, { Component } from 'react'
// 定义一个状态的接口
interface IState {
  // 定义一个n,为number 类型
  n: number
}
export default class TestState extends Component {
  // 这个语法是esnext中的,在react中是可以使用的,可以使用babel来进行转译
  state:IState = {
    n: 100
  }
  render() {
    // 获取状态值
    console.log(this.state.n);
    return (
      <div>
        状态值{this.state.n}
      </div>
    )
  }
}


结果


20210216214716161.png


组件为什么需要状态(state)


我们都知道,每个组件时一个独立的ui单元,包含行为(js),样式(css),结构(html)。每个组件里面可以传递参数,但是传递的参数是不能修改的(详情查看)。如果在组件内部修改修改参数,那么就需要使用到组件状态state


  • 组件状态(state):组件可以自行维护的数据
  • 组件状态(state)仅在类组件中有效
  • 状态(state),本质上是类组件的一个属性,是一个对象


状态初始化


两种初始化的方式:构造函数声明,使用esnext语法进行声明


构造函数声明


import React, { Component } from 'react'
// 定义一个状态的接口
interface IState {
  // 定义一个n,为number 类型
  n: number
}
export default class TestState extends Component<{}, IState> { // 这里的IState 对状态进行声明
  constructor(props:{}){
    super(props);
    // 此处进行赋值
    this.state = {
      n: 100
    }
  }
  render() {
    // 获取状态值
    console.log(this.state.n);
    return (
      <div>
        状态值{this.state.n}
      </div>
    )
  }
}


结果


20210216215852708.png


esnext 语法进行声明


在上述代码,含义中的举例就是通过esnext 的方式进行声明的.

查看


状态变化


1.不能直接改变状态:因为React无法监控到状态发生了变化


20210216224350157.png


2.必须使用this.setState({})改变状态


例如:


import React, { Component } from 'react'
// 定义一个状态的接口
interface IState {
  // 定义一个n,为number 类型
  n: number
}
export default class TestState extends Component<{}, IState> {
  constructor(props:{}){
    super(props);
    this.state = {
      n: 100
    }
// 这里使用计时器,来改变里面的值
    setInterval(() => {
      this.setState({
        n: this.state.n - 1
      })
    },1000)
  }
  render() {
    return (
      <div>
        状态值{this.state.n}
      </div>
    )
  }
}


结果


2021021808533742.gif


3.一旦调用了this.setState,会导致当前组件重新渲染,当前组件里面的其他组件也会重新着渲染。


  • 上面的计时器中,每次改变,页面上的渲染结果也是跟着改变的可以说明问题
  • 如果在render里面写了this.setState({}),会导致内存溢出也可以说明问题:


20210218085751935.png


state 注意事项


state与props的区别


  • props:该数据是由组件的使用者传递的数据,所有权不属于组件自身,因此组件无法改变该数组
  • state:该数组是由组件自身创建的,所有权属于组件自身,因此组件有权改变该数据


setState,它对状态的改变,可能是异步的


20210218091919154.png


代码修改如下:


2021021809202543.png


当我点击按钮的时候,页面的数据是会发生改变的,这个和我们的html 是一样的,页面的js事件来改变页面渲染的值。但是结果却是如下:(页面上的值改变了,但是当前方法里面的值却是没有改变的)


20210218092248936.png


结论: 如果改变状态的代码处于某个HTML元素的事件中,则其是异步的,否则是同步


获取state修改后的数据


通过setState的第二个参数


20210218093137749.png


通过setState的第二个参数获取修改后的值


change方法进行修改:


20210218093243656.png


结果


20210218093400597.png


思路拓展


如果我想要连续的修改state的某个值,那么代码将会是这样的:


20210218095456798.png


代码的执行的结果是没有问题的:


20210218095636803.png


解决办法


我们通过上面的setState的声明中可以看到,第一个参数是可以使用一个函数的,如果遇到某个事件中,需要同步调用多次,需要使用函数的方式得到最新状态


修改change方法:


20210218100336203.png


结果


20210218100240468.png


分析:为啥render只是执行一次?


个人理解:在同一个事件或者函数中,React会对异步的setState进行优化,将多次setState进行合并(将多次状态改变完成后,再统一对state进行改变,然后触发render)


state的最佳实践


1.把所有的setState当作是异步的

2.永远不要信任setState调用之后的状态

3.如果要使用改变之后的状态,需要使用回调函数(setState的第二个参数)

4.如果新的状态要根据之前的状态进行运算,使用函数的方式改变状态(setState的第一个函数)

相关文章
|
26天前
|
前端开发 JavaScript 测试技术
React 分页组件 Pagination
本文介绍了如何在 React 中从零构建分页组件,涵盖基础概念、常见问题及解决方案。通过示例代码详细讲解了分页按钮的创建、分页按钮过多、初始加载慢、状态管理混乱等常见问题的解决方法,以及如何避免边界条件、性能优化和用户反馈等方面的易错点。旨在帮助开发者更好地理解和掌握 React 分页组件的开发技巧,提升应用的性能和用户体验。
62 0
|
14天前
|
存储 前端开发 测试技术
React组件的最佳实践
React组件的最佳实践
|
12天前
|
前端开发 API 开发者
React 文件上传组件 File Upload
本文详细介绍了如何在 React 中实现文件上传组件,从基础的文件选择和上传到服务器,再到解决文件大小、类型限制、并发上传等问题,以及实现多文件上传、断点续传和文件预览等高级功能,帮助开发者高效构建可靠的应用。
39 12
|
7天前
|
存储 前端开发 JavaScript
React 表单输入组件 Input:常见问题、易错点及解决方案
本文介绍了在 React 中使用表单输入组件 `Input` 的基础概念,包括受控组件与非受控组件的区别及其优势。通过具体代码案例,详细探讨了创建受控组件、处理多个输入字段、输入验证和格式化的方法,并指出了常见易错点及避免方法,旨在提升表单的健壮性和用户体验。
18 4
|
14天前
|
前端开发 JavaScript API
React 文件下载组件 File Download
本文介绍了在React中实现文件下载组件的方法,包括使用`a`标签和JavaScript动态生成文件,解决了文件路径、文件类型、大文件下载及文件名乱码等问题,并展示了使用第三方库`file-saver`和生成CSV文件的高级用法。
30 6
|
11天前
|
前端开发 JavaScript API
React 文件下载组件:File Download
本文详细介绍了如何在React应用中实现文件下载组件,包括基本概念、实现步骤和代码示例。同时,探讨了常见问题如文件类型不匹配、文件名乱码等及其解决方法,旨在提升用户体验和代码可维护性。
30 2
|
15天前
|
存储 前端开发 JavaScript
React 文件上传组件 File Upload
本文介绍了如何在 React 中实现文件上传组件,包括基本的概念、实现步骤、常见问题及解决方案。通过 `&lt;input type=&quot;file&quot;&gt;` 元素选择文件,使用 `fetch` 发送请求,处理文件类型和大小限制,以及多文件上传和进度条显示等高级功能,帮助开发者构建高效、可靠的文件上传组件。
41 2
|
16天前
|
存储 前端开发
在React框架中,如何使用对象来管理组件的状态
在React中,组件状态通过`state`对象管理,利用`setState`方法更新状态。状态变化触发组件重新渲染,实现UI动态更新。对象结构清晰,便于复杂状态管理。
|
19天前
|
前端开发 JavaScript 定位技术
React 地图组件 Mapbox 入门指南
Mapbox 是一个强大的地图平台,提供丰富的地图数据和工具,支持多种开发语言和框架。本文介绍如何在 React 项目中使用 Mapbox,涵盖基础概念、安装配置、基本用法、常见问题及解决方法、高级用法等内容,并通过代码示例详细说明,帮助开发者提升地图应用的开发效率和用户体验。
57 2
|
20天前
|
前端开发 JavaScript API
探究 React Hooks:如何利用全新 API 优化组件逻辑复用与状态管理
本文深入探讨React Hooks的使用方法,通过全新API优化组件逻辑复用和状态管理,提升开发效率和代码可维护性。