当前位置: 首页 > news >正文

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

类似 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.lryc.cn/news/348685.html

相关文章:

  • 电商选品的数据是可以用爬虫进行采集的吗?
  • 数据特征降维 | 局部线性嵌入(LLE)
  • js发票查验、票据OCR接口助力解决发票录入与真假辨别难题
  • HTML静态网页成品作业(HTML+CSS+JS)——华为商城网页(1个页面)
  • 【吃透Java手写】5-RPC-简易版
  • express 本地https服务 接口、静态文件,并支持跨域
  • 从零手写实现 tomcat-08-tomcat 如何与 springboot 集成?
  • yarn 安装以及报错处理
  • 31万奖金池等你挑战!IJCAI 2024 第九届“信也科技杯”全球AI算法大赛正式开赛!聚焦AI尖端赛题!
  • 线性表—栈的实现
  • react+antd --- 日期选择器,动态生成日期表格表头
  • webgl入门-js与着色器间的数据传输
  • springmvc异常处理
  • 可拖动、连线的React画布组件有哪些? 官网分别是什么?
  • 专访 Staynex 创始人 Yuen Wong:酒店行业的变革者
  • 最新版Ceph( Reef版本)块存储简单对接k8s(上集)
  • 稳态大面积光伏组件IV测试太阳光模拟器
  • 编写HTTP协议代理的一些知识(源码)
  • LabVIEW天然气压缩因子软件设计
  • GCP谷歌云有什么数据库类型,该怎么选择
  • 项目经理之路:裁员与内卷下的生存策略
  • MWM触摸屏工控机维修TEM-EV0 EN00-Z312yy-xx
  • idm下载到99.99%不动了 idm突然不下载了 idm下载到最后没速度咋办 IDM下载后没网了是怎么回事
  • 设计模式-07 设计模式-观察者模式(Observer Pattern)
  • 戒烟网站|基于SSM+vue的戒烟网站系统的设计与实现(源码+数据库+文档)
  • 研发管理之认识DevOps
  • Spring MVC(五) 文件上传
  • Redis——Redis数据分片的三种算法
  • 【专利】一种日志快速分析方法、设备、存储介质
  • HFSS学习-day5-边界条件