React hooks - useState

useState

      • 用法
      • 特点
      • 注意事项

在hooks出现之前,react的函数式组件也叫做无状态组件(函数里面无法创建属于自己的状态,只能使用props接收)

用法

一个管理状态的 hooks,能让函数组件拥有自己的状态,实现状态的初始化、读取、更新。

特点

  1. 状态变化时,会触发函数组件的重新执行,并根据最新的数据更新渲染 DOM 结构
  2. 以函数的形式为状态赋初始值
  3. 异步变更状态,useState() 返回一个以异步形式变更状态的函数,修改状态后无法立即拿到最新的状态
  4. 结合useEffect监听状态的变化
import React, { useState } from 'react'export const Count: React.FC = () => {const [count, setCount] = useState(0) // 默认初始值undefined,useState只有首次渲染会执行// 以函数的形式为状态赋初始值,useState也只会首次渲染执行,更新渲染不执行const [date] = useState(() => {const dt = new Date()return { year: dt.getFullYear(), mouth: dt.getMonth() + 1, day: dt.getDate()}})useEffect(()=>{console.log(count) // 可以监听到最新的值},count)console.log('组件被重新渲染了') // 每次 count 值发生变化,都会打印return (<><h1>{count}</h1> <button onClick={() => {setCount(count + 1)console.log(count) // 打印的还是上一次的值}}>+1</button><h2>{date.year}{date.mouth}{date.day}{date.second}</h2></>)
}

注意事项

  1. 组件rerender时useState不会被重复初始化
  2. 要更新对象类型的值
    须使用展开运算符或 Object.assign()生成新对象覆盖旧对象,才能触发组件的重新渲染
import React, { useState } from 'react'export const UserInfo: React.FC = () => {const [user, setUser] = useState({name: 'zs',age: 12})const updateUserInfo = () => {// user.name = 'Jesse Pinkman' // 错误使用:因为set 函数内部,会对更新前后的值进行对比,不会触发组件的重新渲染// 解决方案:用新对象的引用替换旧对象的引用,即可正常触发组件的重新渲染// setUser({ ...user })// setUser(Object.assign({}, user))setUser({ ...user, name: 'Jesse Pinkman' })}return (<><h1>用户信息:</h1><p>姓名:{user.name}</p><p>年龄:{user.age}</p><button onClick={updateUserInfo}>更新用户信息</button></>)
}
  1. 值异步更新
    连续多次以相同的操作更新状态值时,React 内部会对传递过来的新值进行比较,值相同,则会屏蔽后续的更新行为,从而防止组件频繁渲染的问题。
    当修改state状态时,如果新值依赖于旧值(基于旧值计算得到新值)时,不要直接在外部计算,通过函数的形参拿到旧值并计算最终return新值。
export const Count: React.FC = () => {const [count, setCount] = useState(() => 0)const add = () => {setCount(count + 1) // 两次操作后count值任然为1setCount(count + 1)}const addPrev = () => {setCount((c) => c + 1) // 传递了更新状态的函数进去,两次操作后count值为2setCount((c) => c + 1)}return (<><h1>当前的 count 值为:{count}</h1><button onClick={add}>+1</button><button onClick={addPrev}>+1</button></>)
} 
  1. 模拟组件的强制刷新
    useState 的状态发生了变化,就会触发函数组件的重新渲染,从而达到强制刷新的目的
import React, { useState } from 'react'export const FUpdate: React.FC = () => {const [, forceUpdate] = useState({})// 每次都会给 forceUpdate 传递一个新对象,从而触发组件的重新渲染const onRefresh = () => forceUpdate({})return (<><button onClick={onRefresh}>点击强制刷新 --- {Date.now()}</button></>)
}

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

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

相关文章

Lookin高效调试iOS App的UI

Lookin是一款iOS开发时常用的调试软件&#xff0c;由腾讯微信读书团队QMUI开发。 它可以查看和修改iOS App里的UI对象的软件&#xff0c;展示App UI图层&#xff0c;类似于Xcode自带的UI Inspector工具&#xff0c;或另一款叫做Reveal的软件。 此外&#xff0c;虽然Lookin主体…

内存泄漏案例分享4-异步任务流内存泄漏

案例4——异步任务内存泄漏 异步任务&#xff0c;代指起子线程异步完成一些数据操作、网络接口请求等&#xff0c;通常会使用以下API&#xff1a; Runnbale&#xff0c;Thread,线程池RxJavaHandlerThread 而这些异步任务很有可能操作内存泄漏&#xff0c;下面我们以Rxjava为…

【实战JVM】-基础篇-02-类的声明周期-加载器

【实战JVM】-基础篇-02-类的声明周期-加载器 3 类的生命周期3.1 生命周期的概述3.2 加载阶段3.2.1 查看内存中的对象 3.3 连接阶段3.3.1 验证阶段3.3.1.1 验证是否符合jvm规范3.3.1.2 元信息验证3.3.1.3 验证语义3.3.1.4 符号引用验证 3.3.2 准备阶段3.3.3 解析阶段 3.4 初始化…

使用OpenCV计算滑块缺口(2)

上一篇 openCV 计算滑块缺口&#xff0c;执行可能出现问题&#xff0c;这一篇文章&#xff0c;是上一版本的补充&#xff08;https://blog.csdn.net/weixin_42883164/article/details/137604965&#xff09; 实现计算滑块缺口的步骤&#xff1a; 接口部分参照上述文章&#xf…

创新营销之路:探索订单排队模式的无限可能

随着市场竞争的日益激烈&#xff0c;企业家们都在寻找新的营销策略来脱颖而出。在这里&#xff0c;我想向大家介绍一种充满活力和创新性的营销新模式——订单排队模式。它不仅能够有效提升用户黏性&#xff0c;还能为企业带来持续的增长动力。 一、订单排队模式的魅力 订单排队…

为什么建议大家加快拥抱Kotlin,说点不一样的

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 Kotlin自2017年起被Google正式宣布为Android的编程语言之一&#xff0c;随后在2019年进一步宣布Kotlin为Android的首选语言&#xff0c;普及速度…

京东商品API接口:电商数据自动化的钥匙

在电子商务的蓬勃发展中&#xff0c;京东作为中国领先的电商平台之一&#xff0c;提供了丰富的API接口&#xff0c;使得开发者能够访问和利用其庞大的商品数据。京东商品API接口不仅为商家提供了便捷的商品管理工具&#xff0c;也为数据分析和电商自动化提供了强大支持。 一、…

上下文视觉提示实现zero-shot分割检测及多visual-prompt改造

文章目录 一、Closed-Set VS Open-set二、DINOv2.1 论文和代码2.2 内容2.3 安装部署2.4 使用效果 三、多visual prompt 改造3.1 获取示例图mask3.2 修改函数参数3.3 推理代码3.4 效果的提升&#xff01; 四、总结 本文主要介绍visual prompt模型DINOv&#xff0c;该模型可输入八…

使用selenium实现网页的自动化登录

1.jdk版本&#xff08;jdk11&#xff09; 2.检查->元素->查看输入框Id 3.代码 import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.edge.EdgeDriver; import org.openqa.selen…

深度解析:医院管理全面数字化转型的技术实现与优势

随着科技的飞速发展&#xff0c;信息技术的应用已经渗透到社会的各个角落&#xff0c;医疗行业作为关乎人民群众生命健康的重要领域&#xff0c;更是急需借助科技的力量实现转型升级。在这样的时代背景下&#xff0c;全面数字化转型成为了医院管理创新的必由之路。 北京XXX医院…

untiy tmp textmeshPro text 代码设置对齐方式

TipText.alignment TextAlignmentOptions.Left;

linux下宝塔负载100%解决方法

今天发现服务器宝塔面板负载居然是100% 但是cpu 和内存其实并不高 通过命令查看主机 uptime 中load average 居然高达18.23 看来负载是真的高了 通过vmstat 看看具体问题 procs&#xff1a; ​ r 表示运行和等待CPU时间片的进程数&#xff0c;这个值如果长期大于系统CPU个数…

Pytorch深度学习实践笔记9(b站刘二大人)

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

AR游戏开发指南,AR游戏软件定制

增强现实&#xff08;AR&#xff09;游戏是一种将虚拟内容叠加到现实世界中的互动游戏类型。通过摄像头和传感器&#xff0c;AR游戏可以让玩家在现实环境中与虚拟物体互动&#xff0c;提供一种沉浸式的游戏体验。玩家可以在真实的世界中看到并与虚拟角色、物体或信息进行交互&a…

【一竞技CS2】YaLLa 2024邀请TheMongolz和BB

1、近日YaLLa Compass 2024主办方已宣布了最后两支受邀参赛的队伍是TheMongolz和BB两支战队,赛事将于6月5日至9日间在阿联酋阿布扎比的Space 42 Arena举行,总奖金为40万美元。 值得一说的是本次赛事的12支参赛队伍中,Cloud9和FURIA尚未确定参赛阵容。在arT离队后,FURIA让青训队…

LaTex安装及配置(Windows)

LaTex安装及配置&#xff08;Windows&#xff09; 安装环境安装texlive下载texlive安装 编辑器安装texstudio下载texstudio安装 环境配置 使用第一个LaTex文档新建文件编程查看results 安装 环境安装 texlive下载 镜像清华源下载地址&#xff1a;https://mirrors.tuna.tsing…

HTTPS能否避免流量劫持?如何实现HTTPS

在当今数字化时代&#xff0c;网站安全已经成为企业和个人的头等大事。随着网络犯罪和数据泄露的增加&#xff0c;保护您的网站免受潜在威胁比以往任何时候都更加重要。网站安全的一个关键组成部分是HTTPS&#xff0c;它代表着安全的超文本传输协议。HTTPS是标准HTTP协议的安全…

Python中的@property装饰器:幕后的工作原理

Python中的property装饰器&#xff1a;幕后的工作原理 在Python中&#xff0c;property装饰器是一个强大且灵活的工具&#xff0c;它允许我们将方法转换为属性的getter方法&#xff0c;从而为类的使用者提供一个更简洁、更直观的接口。通过使用property&#xff0c;我们可以实…

某商业落地充电桩后台服务器通迅协议V2.28 开源 | 嘎嘎快充充电桩平台V2(支持 汽车 电动自行车 云快充1.5、云快充1.6 单体服务 )

嘎嘎快充开源充电桩平台 源码下载地址https://gitee.com/itholiday 充电桩与后台服务器 通讯协议 V2.28 目录 1 网络拓扑 1.1 功能界定&#xff1a; 1.1.1 充电机智能终端 1.1.2 智能中心管理系统 1.2 接口定义&#xff1a; 1.3 通讯方式&#xff1a; 1.4 通信规约 1.5…

Java通过Html(ftl模板)生成PDF实战, 可支持商用

Java通过Html(freemarker模板)生成PDF实战, 可支持商用 技术架构 springboot freemarker [pdfbox] flying-saucer-pdf 生成流程&#xff1a; freemarker: 根据数据填充ftl模板文件&#xff0c;得到包含有效数据的html文件&#xff08;包含页眉页脚页码的处理&#xff0c…