react之useState详解

server/2024/11/9 17:08:11/

在这里插入图片描述

1. 为什么要用useState?

  • 它是React 16.8 的新特性,我们在React里面一般都是用Class去写组件,但是有时候会发现不用它更方便,但是问题来了:不用Class的时候,数据的状态改变如何存储呢?
  • 如果你用 var,let,const 等等,你会发现:值虽然改变了,但是页面并没有重新渲染,也就是说,这些关键字定义的值并不是响应式的
  • 这个时候,就轮到 useState 上场了,它允许我们定义状态变量,并且能保证在页面上能重新渲染,数据是响应式的。

2. 基本语法

javascript">const [state, setState] = useState(initialState);
  • state => 存储的状态值
  • setState => 用来修改状态的函数
  • initialState => 首次渲染的初始值
  • 比如 useState 返回一个数组,长度为 2
javascript">// 通常使用的定义方法
const [key, setKey] = useState(0);
// 但是怕大家不好理解,所以也可以拆开,如下:
const keyArr = useState(0);
const key = keyArr[0];
const setKey = keyArr[1];

3. 实践案例

javascript">const initData = [{imgSrc: '',contentStr: '第一条评论',},{imgSrc: '',contentStr: '第二条评论',},{imgSrc: '',contentStr: '第三条评论',},
];
import { useState, useEffect } from "react";
// useEffect  用于监听数据变化,不要也可以的
const BuyComment = () => {// 带入初始值const [dataList, setDataList] = useState(initData);// 重点在这里// 往数组里添加数据const addRule = () => {let obj = {imgSrc: [],contentStr: '新的评论',};// 有深拷贝的必要,防止数据出问题const addItems = JSON.parse(JSON.stringify(dataList));addItems.push(obj);// 在这里完成值的修改setDataList(addItems);};return (<div>{dataList.map((item, i) => {return (<div className={styles.mianBorder} key={i}>{item.contentStr}</div>);})}<div className={styles.addDiv}><span className={styles.addCom} onClick={addRule}>+ 添加评论</span></div></div>)
};
// 用于监听数据变化的
useEffect(() => {console.log(dataList);
}, [dataList]);
export default BuyComment;
  • 做完以上的步骤,点击 添加评论 就会发现数据同步更改了。

4. useState 的惰性初始化

  • useState 初始值是支持惰性初始化的,所以我们可以传递一个函数给它。
  • 这个函数会在组件第一次渲染的时候执行,当然,后续的渲染就不会执行了。
  • 之所以有这个特性,是为了优化性能。因为有时候我们会遇到非常庞大的数据处理,可能还要进行深拷贝,这些操作还是很耗性能的,如果每次组件渲染的时候都会执行,那代价是很大的,但又不是必须的,所以 useState 的优点就体现出来了:只执行一次,大大的减少了操作的性能和代价。
javascript">// 假设这里数据量非常大:jsonObj,我们需要对它进行解析,计算等等操作
const jsonObj = "{...}"; // 可能是一个很大的js 对象 或者json字符串function DemoComponent() {const [data, setData] = useState(() => {console.log("执行了")// 这种深拷贝是很耗性能的,所以我们在这里先把数据处理好,并且只处理一次return JSON.parse(JSON.stringify(jsonObj ));});
}
  • 上面的代码中,打印只会执行一次。
  • 避免重复的操作,提高代码性能。

1. 希望本文能对大家有所帮助,如有错误,敬请指出

2. 原创不易,还请各位客官动动发财的小手支持一波(关注、评论、点赞、收藏)
3. 拜谢各位!后续将继续奉献优质好文
4. 如果存在疑问,可以私信我(主页有Q)

在这里插入图片描述


http://www.ppmy.cn/server/8445.html

相关文章

Idea 调试SpringBoot项目Debug启动很慢,直接启动很快

踩雷记录 一、现象 目前排查到是在接口中的方法上加了断点&#xff0c;然后就是一直加载加载加载。。。最终也有机会启动成功。 像下面这样的加断点 接口方法上加断点的&#xff0c;启动时间&#xff1a; 如果加在类中的方法体中&#xff0c;没有出现加载慢的问题 二、具体…

socket编程实现TCP通信

socket编程实现TCP通信 tcp_client.cc #include <iostream> #include <cstring> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <pthread.h> #include <unistd.h&…

kubebuilder(1)开发环境搭建

开发一个k8s operator,当然可以在官方原生的controller-runtime 项目上从头构建&#xff0c;但是比较复杂。现在一般基于operator脚手架进行开发。目前最流行的的脚手架是Kubebuilder 或 OperatorSDK。Kubebuilder 或 OperatorSDK都是对controller-runtime 项目进行了上层的封装…

MySQL表级锁——技术深度+1

引言 本文是对MySQL表级锁的学习&#xff0c;MySQL一直停留在会用的阶段&#xff0c;需要弄清楚锁和事务的原理并DEBUG查看。 PS:本文涉及到的表结构均可从https://github.com/WeiXiao-Hyy/blog中获取&#xff0c;欢迎Star&#xff01; MySQL表级锁 MySQL中表级锁主要有表锁…

Docker安装部署Jenkins并发布NetCore应用

Docker安装Jenkins # 拉取镜像 docker pull jenkins/jenkins # 查看镜像 docker images # 运行jenkins # 8080端口为jenkins Web 界面的默认端口 13152是映射到外部 &#xff1a;前面的是映射外部 # 50000端口为jenkins 的默认代理节点&#xff08;Agent&#xff09;通信端口…

【嵌入式linux】Ubuntu 修改用户名

第一次打开Ubuntu时不小心把初始用户名“siriusiot”写成“siriousiot”&#xff08;多了一个o&#xff09; 。作为技术人&#xff0c;我们要保持严谨&#xff0c;我们要纠正过来&#xff08;其实就是单词拼错了怕被笑话&#xff09;。 打开终端&#xff0c;输入&#xff1a; …

linux内核源码分析--通用函数指针

除了稍早讨论的net_device 结构的列表管理字段外&#xff0c;还有一些字段用于管理一些结构&#xff0c;确保这些结构在不需要时能予以删除。 atomic_t refcnt 引用计数&#xff0c;此计数器变为零之前&#xff0c;设备无法除名&#xff0c;参见第八章。 int watchdog_timeo st…

开源项目实现简单实用的股票回测

1 引言 之前&#xff0c;尝试做股票工具一直想做的大而全&#xff0c;试图抓取长期的各个维度数据&#xff0c;然后统计或者训练模型。想把每个细节做到完美&#xff0c;结果却陷入了细节之中&#xff0c;最后烂尾了。 最近&#xff0c;听到大家分享了一些关于深度学习、时序…