React中的useState和useEffect解析

server/2024/10/20 12:25:09/

一、组件状态管理——useState

1.定义

useState 是一个 React Hook(函数),它允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果 和普通JS变量不同的是,状态变量一旦发生变化组件的视图UI也会跟着变化(数据驱动视图)

useState使用规则:

1.useState是一个函数,返回值是一个数组
2.数组中的第一个参数是状态变量,第二个参数是set函数用来修改状态变量
3.useState的参数将作为count的初始值

function App(){const [ count, setCount ] = React.useState(0)return (<div><button onClick={()=>setCount(count+1)}>{ count }</button></div>)
}

2.状态的修改规则

在React中状态被认为是只读的,我们应该始终替换它而不是修改它, 直接修改状态不能引发视图更新

理解:

当我们用解构获取到状态count时,我们直接修改状态,例如:count++,这样修改无法引发视图的更新;所以我们应该替换他,给set方法传入一个全新的值作为参数,这样才能更新视图

3.修改对象状态

对于对象类型的状态变量,应该始终给set方法一个全新的对象来进行修改

4.useState定义的变量和普通变量有什么区别?

1. 状态管理

  • useState 变量

    使用 useState 定义的变量是 React 组件的状态,React 会管理它的生命周期。你可以通过 setState 函数来更新这个状态。
例如:const [count, setCount] = React.useState(0);
  • 普通变量

    普通变量(例如 letconst 定义的变量)是普通的 JavaScript 变量,React 不会对它们进行管理或跟踪。
例如:let count = 0;

2. 组件更新

  • useState 变量

    当你调用 setState 更新 useState 变量时,React 会重新渲染组件,更新 UI。
例如:setCount(count + 1); // 这会触发组件重新渲染
  • 普通变量

    • 更新普通变量不会触发组件重新渲染,React 不会知道这个变量的值发生了变化。

例如:count += 1; // 这不会触发组件重新渲染

3. 持久性

  • useState 变量

    useState 定义的变量在组件的生命周期内保持持久性。即使组件重新渲染,变量的状态仍然可以保持。例如,点击按钮多次会增加 count 的值,且这个值在不同的渲染中保持。
  • 普通变量

    普通变量的值在每次组件重新渲染时会重置为初始值。这意味着你在渲染期间更改的任何值都不会在下一次渲染中保留。
let count = 0; function handleClick() { count += 1; // 仅在当前渲染中有效,下一次渲染会重置为 0 }

4. 闭包问题

  • useState 变量

    使用 useState 时,更新状态函数可以在闭包中使用,确保每次调用时都能访问到最新的状态。
  • 普通变量

    如果在回调函数中使用普通变量,可能会出现闭包问题,导致你无法访问到最新的值。
let count = 0; function handleClick() { setTimeout(() => {   console.log(count); // 会打印上一次渲染的值,而不是最新的值 }, 1000); }

总结

  • useState 定义的变量:是 React 组件的状态,可以在组件中保持持久性,并在更新时触发组件重新渲染。

  • 普通变量:是 JavaScript 中的普通变量,React 不会管理它们,更新不会触发组件重新渲染,也不会保持在组件的生命周期内。

二、React副作用管理——useEffect

1.定义

useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作(副作用), 比 如发送AJAX请求,更改DOM等等

说明:上面的组件中没有发生任何的用户事件,组件渲染完毕之后就需要和服务器要数据,整个过程属于“只由渲染引起的操作”

2.useEffect依赖说明

useEffect副作用函数的执行时机存在多种情况,根据传入依赖项的不同,会有不同的执行表现

依赖项副作用功函数的执行时机
没有依赖项组件初始渲染 + 组件更新时执行
空数组依赖只在初始渲染时执行一次
添加特定依赖项组件初始渲染 + 依赖项变化时执行

说明:表格中1,3行的效果区别仅在是依赖项变化时执行 

3.清除副作用

概念:在useEffect中编写的由渲染本身引起的对接组件外部的操作,社区也经常把它叫做副作用操作,比如在useEffect中开启了一个定时器,我们想在组件卸载时把这个定时器再清理掉,这个过程就是清理副作用

说明:清除副作用的函数最常见的执行时机是在组件卸载时自动执行

下面是用定时器来演示清除副作用的具体例子 

import { useEffect, useState } from "react"function Son () {// 1. 渲染时开启一个定时器useEffect(() => {const timer = setInterval(() => {console.log('定时器执行中...')}, 1000)return () => {// 清除副作用(组件卸载时)clearInterval(timer)}}, [])return <div>this is son</div>
}function App () {// 通过条件渲染模拟组件卸载const [show, setShow] = useState(true)return (<div>{show && <Son />}<button onClick={() => setShow(false)}>卸载Son组件</button></div>)
}export default App

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

相关文章

STM32F1+HAL库+FreeTOTS学习17——事件标志组

STM32F1HAL库FreeTOTS学习17——事件标志组 1. 事件标志组1.1 事件标志组的的引入1.2 事件标志组简介1.3 事件标志组与队列、信号量的区别 2. 事件标志组下相关API函数2. 1 xEventGroupCreate()2. 2 xEventGroupCreateStatic()2. 3 vEventGroupDelete()2. 4 xEventGroupWaitBit…

python 爬虫 入门 三、登录以及代理。

目录 一、登录 &#xff08;一&#xff09;、登录4399 1.直接使用Cookie 2.使用账号密码进行登录 可选观看内容&#xff0c;使用python对密码进行加密&#xff08;无结果代码&#xff0c;只有过程分析&#xff09; 二、代理 免费代理 后续&#xff1a;协程&#xff0c;…

fastjson注解说明,fastjson注解有那些?fastjson是java的json序列化和反序列化工具包

fastjson注解说明,fastjson注解有那些?fastjson是java的json序列化和反序列化工具包 包版本说明 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞。 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞。 fastjson请使用1.2.83以上版本,小于这个版本的存在漏洞…

Golang Map简介

Go Map Map 简介 在Go语言中提供了map数据结构来存储键值对数据。map的数据类型为map[K]V&#xff0c;其中K为键的类型&#xff0c;V为值的类型。map的键类型必须支持操作符&#xff0c;用来比较两个键是否相等。Go语言提供了4种内置的map操作: len、delete、comparison、ass…

关于C语言——对一个数据定义的两种属性

对一个数据的定义&#xff0c;需要去定义它的两种属性:数据类型和存储类型。 对于数据类型主要有: intcharlongfloatdouble 对于存储类型有这四种: auto static register extern 平时使用的时候一般不标明存储类型&#xff0c;而存储类型主动是为auto&#xff0c;自动变…

基于x86_64汇编语言简单教程1: 环境预备与尝试

目录 前言 环境配置 基本硬件与操作系统要求 WSL VSCode基本配置(For Windows) 安装基本的依赖 为您的VSCode安装插件&#xff1a; 学习要求 入门 先试试味道 前言 笔者最近正在梭哈使用NASM汇编器的x86 32位汇编&#xff0c;笔者这里记录一下一个晚上的成果。 环境…

Java爬虫:获取商品评论数据的高效工具

在电子商务的激烈竞争中&#xff0c;商品评论作为消费者购买决策的重要参考&#xff0c;对于商家来说具有极高的价值。它不仅能够帮助商家了解消费者的需求和反馈&#xff0c;还能作为改进产品和服务的依据。Java爬虫技术&#xff0c;以其稳健性和高效性&#xff0c;成为了获取…

探索 Python Web 开发:从框架到爬虫

Python 是 Web 开发中广泛使用的编程语言&#xff0c;因其简单、灵活和强大的生态系统&#xff0c;适合构建各种类型的 Web 应用和 API。在本篇博客中&#xff0c;我们将讨论 Web 开发的几个重要主题&#xff0c;包括 Flask 和 Django 框架、API 开发、HTTP 请求处理以及网页爬…