React函数组件状态Hook—useState《进阶-对象数组》

news2024/11/29 4:46:05

React函数组件状态-state

对象 state

state 中可以保存任意类型的 JavaScript 值,包括对象。但是,你不应该直接修改存放在 React state 中的对象。相反,当你想要更新⼀个对象时,你需要创建⼀个新的对象(或者将其拷⻉⼀ 份),然后将 state 更新为此对象。
官⽹说明:https://react.docschina.org/learn/updating-objects-in-state

改变对象state逻辑:

  1. 把所有存放在 state 中的 JavaScript 对象都视为只读的
  2. 你需要创建⼀个新对象并把它传递给 state 的设置函数
  3. 使⽤扩展运算符拷⻉对象 “…”
import React, { useState } from "react";
const App = () => {
  const [message, setMessage] = useState({
    name: "吴用",
    website: "teacherself.com"
  })
  const changeName = () => {
    setMessage({ ...message, name: "安徽吴彦祖",website:"asdasdas" })
  }
  return (
    <div>
      <h1>{message.name}</h1>
      <h1>{message.website}</h1>
      <button onClick={changeName}>更改title</button>
    </div>
  );
}
export default App;

改变嵌套对象逻辑

… 展开语法本质是“浅拷⻉”,它只会复制⼀层。当你想要更新⼀个嵌套属性时,你必须得多次使 ⽤展开语法。

	setMessage({ ...message, staff: { ...message.staff, hobby: "洗脚" } });

使⽤ Immer 编写简洁的更新逻辑(针对复杂的对象数据!)

如果你的 state 有多层的嵌套,你或许应该考虑将其扁平化。但是,如果你不想改变 state 的数据结构,你可能更喜欢⽤⼀种更便捷的⽅式来实现嵌套展开的效果,Immer是⼀个⾮常流⾏的库,它可以让你使⽤简便但可以直接修改的语法编写代码,并会帮你处理好复制的过程。

安装:

 npm install use-immer  

引入

 import { useImmer } from "use-immer";

使用:

import React from "react";
import { useImmer } from "use-immer";
const App = () => {
  const [message, setMessage] = useImmer({
    name: "吴用",
    website: "teacherself.com"
  })
  const changeName = () => {
    // setMessage({ ...message, name: "安徽吴彦祖",website:"asdasdas" })
    setMessage((draft)=>{
      draft.name = "安徽吴彦祖"
    })
  }
  return (
    <div>
      <h1>{message.name}</h1>
      <h1>{message.website}</h1>
      <button onClick={changeName}>更改title</button>
    </div>
  );
}
export default App;

数组 state

数组是另外⼀种可以存储在 state 中的 JavaScript 对象,它虽然是可变的,但是却应该被视为不可
变。同对象⼀样,当你想要更新存储于 state 中的数组时,你需要创建⼀个新的数组(或者创建⼀
份已有数组的拷⻉值),并使⽤新数组设置 state。

改变数组state逻辑

  • 数组是另一种对象,你需要将React state中的数组视为只读的。
  • 不能直接修改原来数组,相反需要生成一个新的数组。
    react 改变数组state逻辑
    数组添加删除元素
import React, { useState } from "react";
const App = () => {
  const [name, setName] = useState("")
  const [person, setPerson] = useState([
    { id: 0, name: "老王" }
  ])
  return (
    <div>
      <h1>react学习</h1>
      <input value={name} onChange={(e) => { setName(e.target.value) }} />
      <button onClick={() => {
        setPerson([...person, { id: person.length, name: name }])
      }}>添加</button>
      <button onClick={() => {
        setPerson(person.filter((i) => i.id !== item.id))
      }}>删除</button>
      <ul>
        {person.map((item) => (
          <li key={item.id}>{item.name}
            <button onClick={() => {
              setPerson(person.filter((i) => i.id !== item.id))
            }}>删除</button>
          </li>
        ))}
      </ul>
    </div>
  );
}
export default App;

react中state数组元素的操作

使⽤Immer编写简洁代码逻辑

import React, { useState } from "react";
import { useImmer } from "use-immer";
const App = () => {
  const [name, setName] = useState("")
  const [person, setPerson] = useImmer([
    { id: 0, name: "老王",check: false}
  ])
  const handleChek=(id,checked)=>{
    setPerson((darft)=>{
      const checkItem = darft.find((i)=>i.id===id)
      checkItem.check = checked
    })
  }
  const deleteTab=(item)=>{
    setPerson(person.filter((i)=>i.id!==item.id))
  }
  return (
    <div>
      <h1>react学习</h1>
      <input value={name} onChange={(e) => { setName(e.target.value) }} />
      <button onClick={() => {
        setPerson([...person, { id: person.length, name: name,check: false}])
      }}>添加</button>
      <button onClick={() => {
        // setPerson(person.filter((i) => i.id !== item.id))
        setPerson(person.filter((i)=>!i.check))
      }}>批量删除</button>
      <ul>
        {person.map((item) => (
        <li key={item.id}>          
          <input type="checkbox" checked={item.check} onChange={(e)=>handleChek(item.id,e.target.checked)} />
          {item.name}
          <button onClick={()=>deleteTab(item)}>删除</button>
        </li>
        ))}
      </ul>
    </div>
  );
}
export default App;

react中state的数组增加删除
react对象及其数组操作完结~

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

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

相关文章

Ubuntu18.04安装Loam保姆级教程

系统环境&#xff1a;Ubuntu18.04.6 LTS 1.Loam的安装前要求&#xff1a; 1.1 ROS安装&#xff1a;参考我的另一篇博客 Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客还是那句话&#xff0c;有时候加了这行也不好使&#xff0c;我是疯狂试了20次&#xf…

基于51单片机步进电机加减速正反转数码管显示( proteus仿真+程序+原理图+设计报告+讲解视频)

基于51单片机步进电机加减速正反转数码管显示( proteus仿真程序原理图设计报告讲解视频&#xff09; &#x1f4d1;1.主要功能&#xff1a;&#x1f4d1;讲解视频&#xff1a;&#x1f4d1;2.仿真&#x1f4d1;3. 程序代码&#x1f4d1;4. 设计报告&#x1f4d1;5. 设计资料内容…

如何快速本地搭建悟空CRM结合内网穿透工具高效远程办公

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 无需公网IP&#xff0c;使用cpolar实现悟空CRM远程访问二. 通过公网来访问公司…

移动机器人路径规划(三)--- 基于采样的路径规划Sample-basedpath finding

目录 1 基于采样的路径规划的优点和一些重要概念 2 概率路图 Probabilistic Road Map 3 快速搜索随机树Rapidly-exploring Random Tree 3.1 RRT 3.2 RRT Connect 4 RRT算法的优化 4.1 RRT* 4.2 Kinodynamic-RRT* 4.3 Anytime-RRT* 5 Advanced Sampling-based Methods…

在混料配料输送系统中使用485modbus转profinet网关案例

485Modbus转Profinet网关是一种在工业自动化控制系统中常用的设备&#xff0c;能够实现不同通信协议之间的转换&#xff0c;对于混料配料输送系统的优化和控制具有重要作用。 通过使用485Modbus转Profinet网关&#xff0c;混料配料输送系统能够实现与不同设备之间的通信和数据交…

linux下安装python3.8(有坑)

1安装包下载 ###直接官网下载linux版本&#xff0c;找到对应的包 https://www.python.org/downloads/source/2安装包解压 tar -zxvf Python-3.8.0.tgz 3编译安装 1&#xff09;设置安装目录&#xff0c;比如在此创建在 /usr/local/python3 &#xff1a; mkdir -p /usr/loca…

clip4clip:an empirical study of clip for end to end video clip retrieval

广告深度学习计算&#xff1a;阿里妈妈智能创意服务优化使用CPU/GPU分离的多进程架构&#xff0c;加速阿里妈妈智能创意服务。https://mp.weixin.qq.com/s/_pjhXrUZVzFRtiwG2LhnkwCLIP4Clip: CLIP 再下一城&#xff0c;利用CLIP实现视频检索 - 知乎前言&#xff1a; OpenAI 的论…

networkx使用draw画图报错:TypeError: ‘_AxesStack‘ object is not callable

一、问题描述 在使用networkx的draw绘图时nx.draw(g,posnx.spring_layout(g))&#xff0c;报错&#xff1a;TypeError: _AxesStack object is not callable 二、原因 可能是当前python环境下的networkx和matplotlib的版本不匹配。我报错时的networkx2.8&#xff0c;matplotl…

DBeaver还原mysql数据库

DBeaver还原mysql数据库 DBEaver还原mysql数据库新建一个要还原的数据库选择工具》恢复数据库 DBEaver还原mysql数据库 新建一个要还原的数据库 选中数据库,右键新建一个数据库&#xff0c;字符集和排序规则默认的即可 选择工具》恢复数据库 选中刚刚创建好的数据库&#x…

2—10岁女童羽绒服,黑色长款也太好看了吧

冬天怎么能没有一件暖呼呼的羽绒服呢&#xff1f; 黑色长款羽绒服也赞了吧 大长款连帽&#xff0c;防风保暖设计 时尚与美观度都兼具呢&#xff01;好穿又耐穿&#xff01;

电路综合-基于简化实频的集总参数电路匹配1

电路综合-基于简化实频的集总参数电路匹配1 对于分布式参数的匹配方法&#xff0c;我们已经深入探讨并给出了解决方案&#xff1a; 10、电路综合-基于简化实频的宽带匹配电路设计方法 {阻抗匹配其实就是S11电路的匹配&#xff0c;给定需要匹配的阻抗数值去设计微带电路&#…

李开复再度回应争议;10 月中国游戏厂商及应用出海收入 30 强出炉丨 RTE 开发者日报 Vol.86

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有…

什么是等保测评?

随着近几年随着网络技术的发展&#xff0c;互联网应用的普及和丰富&#xff0c;互联网安全问题也日益严重&#xff0c;利用信息技术进行的高科技犯罪事件呈现增长态势。从2004年度CNCERT的信息网络安全工作报告中我们看到&#xff0c;信息网络安全事故在逐年上升&#xff0c;20…

2022年09月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 点击绿旗,下面哪个选项可以实际播放放马叫声并在声音全部播放完后,马向右移动? A: B: C: D: 答案:D

Linux 爱好者线下沙龙:成都场圆满结束 下一场西子湖畔相见 | LLUG·第五站

导读&#xff1a;第四站 LLUG成都场已于10 月 29 日在武侯区菁蓉汇成功举办。LLUG 第五站将于11 月 25 日走进美丽的西子湖畔&#xff0c;在这个冬日&#xff0c;LLUG 与你在杭州线下相见。 10 月 29 日&#xff0c;LLUG 成都场成功在武侯区菁蓉汇举办。 LLUG成都站由 Linux 中…

中小企业数字化的“下半场”,与华为的生态伙伴“引力场”

作者 | 曾响铃 文 | 响铃说 中小企业数字化始终是业界关注的重点&#xff0c;也催生了庞大的产业数字化价值空间等待挖掘&#xff0c;在如何推进这件事上&#xff0c;各方都在持续发力。 这其中&#xff0c;针对中小企业迫切需求&#xff0c;来自华为的动作正变得越来越紧凑…

苏宁API:一键搜索,海量商品任你选!

使用苏宁API按关键字搜索商品&#xff0c;可以在API的搜索参数中设置关键字。 例如&#xff0c;在搜索商品时&#xff0c;可以在API的请求参数中设置q关键字。例如&#xff0c;要搜索“鞋子”&#xff0c;可以将q设置为“鞋子”。 另外&#xff0c;还可以设置其他的搜索参数&…

CDR最新CorelDRAWX8安装步骤教程

CorelDRAW Graphics Suite非凡的设计能力广泛地应用于商标设计、标志制作、模型绘制、插图描画、排版及分色输出等等诸多领域。作为一个强大的绘图软件&#xff0c;它被喜爱的程度可用事实说明&#xff1a;用作商业设计和美术设计的PC机几乎都安装了 。CorelDRAW让您轻松应对创…

华为Matebook X Pro 2022款 i7 集显(MRG-W76)原装出厂Windows11预装系统21H2

下载链接&#xff1a;https://pan.baidu.com/s/12ru9lUeQ7mWd5u1KLCM0Pg?pwdc7pi 提取码&#xff1a;c7pi 原厂系统自带指纹、面部识别、声卡、网卡、显卡等所有驱动、出厂主题壁纸、Office办公软件、华为电脑管家等预装程序&#xff0c;如图 由于时间关系,绝大部分资料没…

什么是CMDB?为什么企业需要CMDB?

CMDB即Configuration Management Database&#xff0c;配置管理数据库&#xff0c;它是组织IT基础结构中配置项CI(Configuration Item)及其关系的数据库。 而CI是指任何需要进行管理以确保成功提供服务的条目&#xff0c;CI可以是一个具体的实体&#xff0c;如服务器、交换机&…