react18【系列实用教程】useState (2024最新版)

news/2024/5/21 3:24:29

类似 vue 的 data 选项

功能

向组件添加响应式变量,当响应式变量变化时,组件的视图UI也会跟着变化【数据驱动视图】

语法

  • 参数为变量的初始值
  • 返回值为一个只有两个元素的数组,第一项元素为传入的参数,第二项元素是一个setter 函数

使用范例 – 响应式变量

import { useState } from "react";
const Demo = () => {const [count, setCount] = useState(0);function addOne() {setCount(count + 1);}return <button onClick={addOne}>{count}</button>;
};export default Demo;
  • 声明了响应式变量 count ,初始值为 0
  • 通过 [] 进行了数组的解构赋值,将 0 赋值给了 count ,可响应式改变 count 值的 setter 函数赋值给了
  • 通过 setCount 可修改 count 的值 (setCount 可以自定义为其他名称,如 updateCount , 但推荐统一 set 开头)
  • setCount 的语法是将 count 的新值作为参数传入
  • setCount 的作用是触发视图根据 count 的新值重新渲染

使用范例 – 响应式对象

  const [person, setPerson] = useState({firstName: 'Barbara',lastName: 'Hepworth',email: 'bhepworth@sculpture.com'});function handleFirstNameChange(e) {// 修改属性值setPerson({...person,firstName: e.target.value});}

修改嵌套的属性值

  const [person, setPerson] = useState({name: 'Niki de Saint Phalle',artwork: {title: 'Blue Nana',city: 'Hamburg',image: 'https://i.imgur.com/Sd1AgUOm.jpg',}});function handleNameChange(e) {setPerson({...person,name: e.target.value});}function handleTitleChange(e) {setPerson({...person,artwork: {...person.artwork,title: e.target.value}});}

显然,非常麻烦,可以用 Immer 库编写简洁的更新逻辑

npm install use-immer
import { useImmer } from 'use-immer';
  const [person, updatePerson] = useImmer({name: 'Niki de Saint Phalle',artwork: {title: 'Blue Nana',city: 'Hamburg',image: 'https://i.imgur.com/Sd1AgUOm.jpg',}});function handleNameChange(e) {updatePerson(draft => {draft.name = e.target.value;});}function handleTitleChange(e) {updatePerson(draft => {draft.artwork.title = e.target.value;});}

使用范例 – 响应式数组

  const [fruitList, setFruitList] = useState([]);function changeHandler(e) {let newValue = e.target.value;if (fruitList.includes(newValue)) {// 数组删除元素setFruitList(fruitList.filter((item) => item !== newValue));} else {// 数组新增元素setFruitList([...fruitList, newValue]);}}

http://www.mrgr.cn/p/24437453

相关文章

预约咨询小程序源码搭建/部署/上线/运营/售后/更新

包含在线咨询、视频咨询、电话咨询、面询多种咨询方式&#xff0c;适用于心理、法律、宠物等预约咨询问诊场景 分类预览&#xff1a;小程序提供清晰的分类选项&#xff0c;使用户能够迅速找到所需的咨询服务类型&#xff0c;如法律咨询、心理咨询、医疗咨询等。预约时间选择&a…

实验四

一、实验题目 :代码审查 二、实验目的 1、熟悉编码风格,利用开发环境所提供的平台工具对代码进行自动格式审查; 2、根据代码规范制定代码走查表,并按所制定的审查规范互审代码。 三、实验内容 1、IDEA环境和PyCharm环境二选一; IDEA环境 (1)预先准备在IDEA环境下实现对输…

【redis学习】Redis-IO多路复用

为什么要有IO多路复用 大家印象中的redis都是单线程的,没有加锁的操作,因此才会是redis这么快的原因其中之一。先暂且不说redis究竟是不是单线程,即便是单线程的,作为服务提供方,面对成百上千的客户端连接请求,读写操作,单线程是怎么做到高效的处理这些请求?单线程处理…

h5使用js拉起微信支付

近期,业务需求对接了微信支付,做个总结。web网页想要拉起微信支付,有两种方法: H5下单支付 , JSAPI支付 。首先纯前端做不了微信支付,必须配合后端才能通过微信的下单请求。接下来说说这两种方法的区别。 H5微信下单支付 这种支付方式是用户在浏览器端打开网页,通过下单等…

Android studio 新版本 NewUI toolbar显示快捷按钮

新版本的Android studio 启用新的界面&#xff0c;以前许多快捷按键位置有变化 文章目录 设置始终显示主菜单设置ToolBar快捷按钮显示设置右下角显示分支 设置始终显示主菜单 原本要点击左上角几个横向才显示的菜单 设置始终显示&#xff0c;View -> Appearance -> Main…

C#开发的网络速度计 - 开源研究系列文章 - 个人小作品

上次发布了一个获取网络速度的例子( https://www.cnblogs.com/lzhdim/p/18167854 )&#xff0c;就是为了这次这个例子。用于在托盘里显示网络速度的图标&#xff0c;并且能够显示网络速度。下面就介绍一下这个小应用的源码。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b…

[muduo网络库]——muduo库的Reactor模型(剖析muduo网络库核心部分、设计思想)

一、前言 在学习 C 服务端的过程中&#xff0c;必不可少的一项就是熟悉一个网络库&#xff0c;包括网络库的应用和其底层实现。我们熟知的网络库有 libevent、libev、muduo、Netty 等&#xff0c;其中 muduo 是由陈硕大佬个人开发的 TCP 网络库&#xff0c;最近跟着课程正在深…

任天堂Switch全部记录

NS SWTICH大气层制作新的SD卡,解决部分大气层及固件问题。 原先的SD卡(128G)快全部放满游戏了,需要新的内存卡用于存放新的游戏。 有几张闲置的内存卡,可是容量最大只有64G, 无法通过直接全部复制+粘贴的办法,来启用新的小内存卡,涉及制作新的NS Switch SD卡有什么用 s…

用一个查询从销售订单直通供应商账单-NetSuite

朗读全文Your browser does not support the audio element. 有什么用 用一个查询从销售订单直通供应商账单 NetSuite: 从SO销售订单,到PO采购订单,到Bill供应商账单 下面文章的分享仅作为演示在SuiteQL Query Too中的展示,现实情况下的应用可以非常灵活(由于范围广泛…

ArrayList in C#

https://dotnettutorials.net/lesson/arraylist-collection-csharp/ c#中的数组列表是什么?c#中的ArrayList是一个非泛型集合类,它的工作方式类似于数组,但提供了动态调整大小、从集合中间添加和删除元素等功能。c#中的ArrayList可以用来添加未知数据,也就是说,当我们不知…

【JavaEE 初阶(四)】多线程进阶

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.常见的锁策略2.1悲观锁vs乐观锁2.2轻量级锁vs重量级锁2.3自旋锁vs挂起锁2.4读写…

bzoj4399: 魔法少女LJJ

先上头图:诈骗题认真读题 c<=7 只需要考虑前七个操作 一.动态开点即可 二.线段树合并 三.四.对于这两个操作,可以先统计出有多少个数小于/大于x,然后删除所有小于/大于x的数,并在x位置加上这些数 五.下放标记查询即可 六.每个数最大为1e9,直接乘肯定会炸,所以可以用do…

unity基础(一)

内容概要&#xff1a; 生命周期函数vector3 位置 方向 缩放旋转等信息Vector3欧拉角和Quaternion四元素unity脚本执行顺序设置 一 生命周期函数 方法说明Awake最早调用,所以一般可以再此实现单例模式OnEnable组件激活后调用,在Awake后会调用一次Start在Update之前调用一次&a…

信息安全技术-分析题【太原理工大学】

没有历年题或明确说明大题会考什么&#xff0c;以下为个人猜测 简答题和选择判断占60&#xff0c;认真看题库和总结&#xff0c;能过d(^_^o) 好像说是加解密这类题会给公式让你直接套&#xff0c;但还是看一下基本原理&#xff0c;要不到时候蒙圈 1.加密算法步骤 图 1 是一个采…

基于Springboot+Vue的Java项目-车辆管理系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

企业数据保护,从严防内部信息泄露开始

在当今的数字化时代,数据已成为企业最宝贵的资产之一。然而,随之而来的是数据安全威胁,尤其是内部信息泄露,这不仅会导致企业面临巨大的经济损失,还可能损害企业的品牌形象和客户信任。因此,从严防内部信息泄露开始,成为企业数据保护策略中的重要一环。确立内部数据分类…

实验四--代码审查

一、实验题目 :代码审查 二、实验目的 1、熟悉编码风格,利用开发环境所提供的平台工具对代码进行自动格式审查; 2、根据代码规范制定代码走查表,并按所制定的审查规范互审代码。 三、实验内容 1、IDEA环境和PyCharm环境二选一; IDEA环境 (1)预先准备在IDEA环境下实现对输…

回溯法、全排列、子集等

回溯法 感想&#xff1a;回溯算法本质是一个循环&#xff0c;有点像while循环 一些回溯法&#xff08;递归&#xff09;的经典应用 1.全排列 2.子集 其实上面两个点&#xff0c;也是对应着高中数学里面的“排列”与“组合” 1.全排列问题 给定一个集合S{a,b,c}&#xff0…

选择排序桌面检查

码云代码:https://gitee.com/yibo886/codes/0ihau3t9pj6bkfqzxcmnl93 博客园: 一、实验题目 :代码审查 二、实验目的 1、熟悉编码风格,利用开发环境所提供的平台工具对代码进行自动格式审查; 2、根据代码规范制定代码走查表,并按所制定的审查规范互审代码。 三、实验内容…

tomcat打开乱码修改端口

将UTF-8改成GBK 如果端口冲突&#xff0c;需要修改tomcat的端口