组件的状态

news2025/2/3 4:53:20

组件的状态

react hook出来之前,函数式组件是没有自己状态的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ioDwfH1u-1689566540446)(images/image-20220901094407996.png)]

​ jsx 就和原生js编写差不多,所有就当作在定义类,在类方法中使用变量,就要通过this来调用。

​ 主义要写在state中,数据驱动视图,我们想要修改视图无需操作dom,通过setState方法来修改state中的变量。这个可以理解为单向的和vue一样。所谓dom操作想要修改自己显示,还是通过修改数据来实现,所以所有数据驱动的框架,都不用我们自己来渲染dom,框架内部虚拟dom性能更高,我们只用关注数据层即可。

不要直接修改state中的值,必须通过setState方法进行修改

import React from "react"

class HelloC extends React.Component {
  //初始状态
  state = {
    count: 10
  }

  setCount = () => {
    this.setState({
      count:this.state.count + 1
    })
  }
  render () {
    return (
      <div>这是我的第一个类组件! <span onClick={this.setCount}>读取我的属性count: {this.state.count}</span></div>
    )
  }
}

​ 这里的setCount方法 使用的箭头函数,如果不使用箭头函数我们就需要绑定this,

class Foo extends React.Component {
  handleClick () {
    this.setState({ xxx: aaa })
  }

  render() {
    return (
      <button onClick={this.handleClick.bind(this)}>
        Click me
      </button>
    )
  }
}

为何需要手动绑定this,记住我们传入的是一个方法,this.handleClick,而并非执行,只有在执行代码时才会为我们绑定this,所以执行时的this早已不是Foo,bind绑定在执行前将foo当作this传入。

此时this指向Helloc,如果直接调用方法handleClick,里边this肯定是Helloc 但是只是传入方法未调用

其他方式:

在这里插入图片描述

在这里插入图片描述

https://juejin.cn/post/6844904200996913160

主流的写法已经变成了class fields,无需考虑太多this问题

页面直接打印 对象

在这里插入图片描述

  • 原因
    写React的render()时,想直接查看整个state对象的内容,就写了{this.state},然后报错。
    原因是不能直接往{}里放Object
  • 解决
    把放入{}中的变量,格式变为非Object即可。两种方法:
    JSON.stringify(xxx)可以将任意变量字符串化,包括对象格式(但要防止对象的循环引用)。
    多写点代码,原本直接传入一个对象,修改为:一个成员一个成员地传入,如{this.state.name} {this.state.age}

这点和vue不大一样,vue是可以直接打印对象查看的。

React的状态不可变

不要直接修改状态值,而是基于当前状态创建新的状态值。

这叫什么来着,就是比如我们封装一些方法,方法有传入的参数,一个好的方法,应该不会修改传入的参数原始值,如果传入一个引用,修改参数原本对象也会修改.所有我们一般将传入引入数据类型拷贝一份。

import React from "react"

class HelloC extends React.Component {
  //初始状态
  state = {
    count: 10,
    list: [1, 2, 3],
    person: {
      name: 'jack',
      age: 18
    }
  }
  handleClick () {
    console.log(this) //undefined
    this.setState({ count: this.state.count + 1 })
  }
  setCount = () => {
    this.setState({
      count: this.state.count + 1
    })
  }
  //基于当前状态创建新值
  newStatus = () => {
    this.setState({
      count: this.state.count + 1,
      list: [...this.state.list, 4],
      person: {
        ...this.state.person,
        // 覆盖原来的属性 就可以达到修改对象中属性的目的
        name: 'rose'
      }
    })
  }
  render () {
    return (
      <div>
        <div>这是我的第一个类组件! <span onClick={(e) => this.handleClick(e)}>读取我的属性count: {this.state.count}</span></div>
        <div>这是我的第一个类组件! <span onClick={this.setCount}>读取我的属性count: {this.state.count}</span></div>
        <div>这是我的第一个类组件! <span onClick={this.newStatus}>读取我的属性count: {this.state.list}{JSON.stringify(this.state.person)}</span></div>
      </div>
    )
  }
}

构造函数是唯一可以给 this.state 赋值的地方。

React 的状态不可变本质上是引用不可变,因为对于 JavaScript 来说,对象是一种引用类型。在你 setState 后,React 会对新旧两个状态进行浅比较,因为 state 是引用类型,所以 React 会比较新旧 state 的引用,只有比较结果为 false,才会进行重新渲染。

所以说,你每次 setState 替换新的对象,其实质是替换对象的引用,让 React 感知到 state 的变化,React 才会进行重新渲染。

官方文档:https://reactjs.org/docs/optimizing-performance.html#avoid-reconciliation

说实话感觉和vue不能检测到data里对象属性改变一样,vue里通过set方法来告知vue进行重新渲染。

而react直接将整个对象重新赋值这样,检测到对象改变,整个肯定会重新渲染,感觉性能没有提升继续往后看吧

当你调用 setState() 的时候,React 会把你提供的对象合并到当前的 state。

这里合并仅仅是浅合并,也就是只合并第一层

React源码中,使用了Object.assign()方法,对preState和更新后的State做了一个合并。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762273.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vite 3.0 核心盘点与分析

自2021 年2月&#xff0c;Vite 2.0版本发布以来&#xff0c;Vite项目在的用户量方面发生了非常迅速的增长&#xff0c;很快达到了每周 100 万的npm下载量&#xff0c;成为npm下载量最高的几个项目之一。同时&#xff0c;Vite 的社区也越来越活跃&#xff0c;目前已经形成非常庞…

如何用手机实现三维可视化

三维可视化是一种强大的工具&#xff0c;可以将复杂的数据、概念或场景以直观、具体的形式展现出来。它将数据或模型转化成三维图像&#xff0c;使人们能够更清晰地理解和分析其中的关系和特征。三维可视化不仅可以用于科学研究和工程设计&#xff0c;还广泛应用于教育、娱乐和…

linux内核调试工具记录

Linux性能测试使用的工具在github网站可见&#xff0c;网址如下&#xff1a; slides: http://www.slideshare.net/brendangregg/linux-performance-analysis-new-tools-and-old-secrets video: https://www.usenix.org/conference/lisa14/conference-program/presentation/greg…

在线考试系统源码搭建:springboot+mybatis+mysql+vue

下载源码 在线考试 刷题小程序 题库答题小程序 : 适用机构场景&#xff1a;在线考试系统适用于企业考核、员工职评测、培训机构考证刷题等场景&#xff1b;用户端功能&#xff1a;顺序练习&#xff0c;真题模拟&#xff0c;我的错题&#xff0c;我的收藏、错题重练(答对自动移…

【Atcoder】 [ARC156C] Tree and LCS

题目链接 Luogu方向 Atcoder方向 题目解法 手玩几个小数据之后可以猜测最小的最大相似度一定为1 考虑构造&#xff1a;每次找到2个叶子&#xff0c;交换权值&#xff0c;然后删掉&#xff08;最后如果剩下一个点权值不变&#xff09; 证明&#xff1a; 首先可以证明最大的相…

【微服务实战之Docker容器】第三章-镜像仓库

系列文章目录 【微服务实战之Docker容器】第一章-下载及安装 文章目录 系列文章目录Docker镜像提交本地镜像发布到阿里云阿里云镜像下载到本地使用本地镜像发布到私有库 Docker镜像提交 docker commit提交容器副本使之成为一个新的镜像docker commit -m“提交的描述信息” -a…

2023年网络安全需把握十大趋势

过去的2022年&#xff0c;网络安全继续成为全社会的关注焦点。网络战在俄乌冲突中风头尽出&#xff1b;勒索攻击给企业造成的损失触目惊心&#xff1b;数据泄露事件愈发频繁、甚至威胁社会安全&#xff1b;供应链攻击无处不在……网络安全已经成为发展的先决条件。 2023年是贯…

【大模型】AutoDL 快速使用

网站&#xff1a;https://www.autodl.com/ BUY 性价比之选&#xff1a;NVIDIA RTX A5000 / 24GB PS&#xff1a;CUDA版本 -12.0 PS&#xff1a;Pytorch/2.0.0/3.8(ubuntu20.04)/11.8 Use Tips git clone 慢 学术资源加速 source /etc/network_turbo切换pip 阿里源

TCP文件传输功能

实现代码 tcp.h #ifndef _TCP_H_ #define _TCP_H_#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <strings.h> #include <…

链表的简单示意

链表的实质就是指针。存放下一个元素的地址。 typedef struct spy {char * name ;struct spy * next; }spy ,*p_spy;spy A {A,NULL}; spy B {B,NULL}; spy C {C,NULL};int main() {p_spy &A;A.next&B;//A是一个结构体变量&#xff0c;A.next是对这个结构体变量的引用。…

MySQL八股学习记录4事务的实现from小林coding

MySQL八股学习记录4事务的实现from小林coding 事务的概念与特性并行事务引发的问题脏读不可重复读幻读 MySQL的应对策略InnoDB引擎可重复读详解ReadView在MVCC中的工作方式两种隔离级别通过MVCC实现幻读被完全解决了吗 事务的概念与特性 概念:一个操作要么执行成功,要么回滚到…

Matplotlib subplots()函数详解

matplotlib.pyplot模块提供了一个 subplots() 函数&#xff0c;它的使用方法和 subplot() 函数类似。其不同之处在于&#xff0c;subplots() 既创建了一个包含子图区域的画布&#xff0c;又创建了一个 figure 图形对象&#xff0c;而 subplot() 只是创建一个包含子图区域的画布…

面试题揭秘:Spring Boot 自动配置原理是什么?

大家好&#xff0c;我是你们的小米。在过去的几年里&#xff0c;Spring Boot已经成为了Java开发领域中最受欢迎的框架之一。它以其简化的开发方式和强大的功能而闻名于世。今天&#xff0c;我们来揭秘一个常见的面试题&#xff1a;Spring Boot自动配置原理是什么&#xff1f;让…

针对汽配企业的生产难点,提出MES管理系统解决方案

随着汽车产业的快速发展&#xff0c;汽配企业面临着越来越多的生产难点&#xff0c;如生产过程不透明、效率低下、质量控制困难等。为了应对这些挑战&#xff0c;引入MES生产管理系统成为了一种有效的解决方案。本文将探讨MES生产管理系统在汽配企业中的应用&#xff0c;以及它…

【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码

【江西省研究生数学建模竞赛】题目之一 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 相关链接 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MA…

如何顺势而为,让ChatGPT为教育所用?

恐惧和回避无法阻挡科技的浪潮&#xff0c;教育与AI的深度融合时代已经到来&#xff0c;如何把AI当做工具&#xff0c;把其成为教育的机会而非威胁&#xff0c;是教育体系未来不得不得面对的新变化。 接受ChatGPT作为一种教学辅助工具&#xff0c;成为教师的朋友或者帮手&…

备战秋招010(20230717)

文章目录 前言一、基础1、网络模型01、OSI 七层02、TCP/IP 四层04、Linux 网络协议栈05、问题 2、常见的网络协议01、应用层02、传输层03、网络层 3、输入网址到网页显示过程01、基础02、DNS 解析03、URL 和 URI 二、HTTP1、基础01、概念02、状态码03、无状态 2、Get 和 Post01…

element-ui select数据回显显示数字的问题 el-select校验失效出现阿拉伯数字问题

初始化参数 return {fields: [{"title":"景区","id":0},{"title":"酒店","id":1}],evaluates: [{"title":"好评","id":0},{"title":"中评","id":1…

【Linux】- Linux 磁盘分区、挂载

Linux 磁盘分区、挂载 1.1 Linux 分区1.2 硬盘说明1.3 磁盘情况查询 1.1 Linux 分区 原理介绍 Linux 来说无论有几个分区&#xff0c;分给哪一目录使用&#xff0c;它归根结底就只有一个根目录&#xff0c;一个独立且唯一的文件结构 , Linux 中每个分区都是用来组成整个文件系…

SAP AES encrypt

加密算法简介: 加密技术通常分为两大类:"对称式"和"非对称式"。 对称性加密算法&#xff1a;对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的&#xff0c;之后便是对数据进行加解密了。对称加密算法…