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

React文档-State数据扁平化

1、选择 State 结构

思考一下:
如果渲染列表, 并更新列表数据在下面展示~

state 过去常常是这样复制的:

  • items = [{ id: 0, title: 'pretzels'}, ...]
  • selectedItem = {id: 0, title: 'pretzels'}
    改了之后是这样的:
  • items = [{ id: 0, title: 'pretzels'}, ...]
  • selectedId = 0

重复的 state 没有了,你只保留了必要的 state!
现在,如果你编辑 selected 元素,下面的消息将立即更新。这是因为 setItems 会触发重新渲染,而 items.find(…) 会找到带有更新文本的元素。你不需要在 state 中保存 选定的元素,因为只有 选定的 ID 是必要的。其余的可以在渲染期间计算。
在这里插入图片描述

2、state “扁平化”(也称“规范化”)嵌套更加容易

1、如果 state 嵌套太深,难以轻松更新,可以考虑将其“扁平化”。 这里有一个方法可以重构上面这个数据。不同于树状结构,每个节点的 place 都是一个包含 其子节点 的数组,你可以让每个节点的 place 作为数组保存 其子节点的 ID。然后存储一个节点 ID 与相应节点的映射关系。
2、现在要删除一个地点,您只需要更新两个 state 级别:

  • 其 父级 地点的更新版本应该从其 childIds 数组中排除已删除的 ID。
  • 其根级“表”对象的更新版本应包括父级地点的更新版本。
    places.js 文件
export const initialTravelPlan = {0: {id: 0,title: '(Root)',childIds: [1],},1: {id: 1,title: 'Earth',childIds: [2, 7]},2: {id: 2,title: 'Africa',childIds: [3, 4, 5, 6]}, 3: {id: 3,title: 'Botswana',childIds: []},4: {id: 4,title: 'Egypt',childIds: []},5: {id: 5,title: 'Kenya',childIds: []},6: {id: 6,title: 'Madagascar',childIds: []}, 7: {id: 7,title: 'Morocco',childIds: [8, 9]},8: {id: 8,title: 'Nigeria',childIds: [11]},9: {id: 9,title: 'South Africa',childIds: []},10: {id: 10,title: 'Americas',childIds: [11, 12],   },11: {id: 11,title: 'Argentina',childIds: []},
};
import { useState } from 'react';
import { initialTravelPlan } from './places.js';export default function TravelPlan() {const [plan, setPlan] = useState(initialTravelPlan);function handleComplete(parentId, childId) {const parent = plan[parentId];// 创建一个其父级地点的新版本// 但不包括子级 ID。const nextParent = {...parent,childIds: parent.childIds.filter(id => id !== childId)};// 更新根 state 对象...setPlan({...plan,// ...以便它拥有更新的父级。[parentId]: nextParent});}const root = plan[0];const planetIds = root.childIds;return (<><h2>Places to visit</h2><ol>{planetIds.map(id => (<PlaceTreekey={id}id={id}parentId={0}placesById={plan}onComplete={handleComplete}/>))}</ol></>);
}
// 计划树
function PlaceTree({ id, parentId, placesById, onComplete }) {const place = placesById[id];const childIds = place.childIds;return (<li>{place.title}<button onClick={() => {onComplete(parentId, id);}}>Complete</button>{childIds.length > 0 &&<ol>{childIds.map(childId => (<PlaceTreekey={childId}id={childId}parentId={id}placesById={placesById}onComplete={onComplete}/>))}</ol>}</li>);
}

在这里插入图片描述

https://react.docschina.org/learn/choosing-the-state-structure#avoid-deeply-nested-state

相关文章:

  • 利用大型语言模型有效识别网络威胁情报报告中的攻击技术
  • 前端面试题:说说你对 Vue 中异步组件的理解
  • Kotlin Android LeakCanary内存泄漏检测实战
  • python打卡day21
  • 第二个简单的SpringBoot和Vue前后端全栈的todoapp案例
  • Ubuntu22.04安装显卡驱动/卸载显卡驱动
  • Python+OpenCV打造AR/VR基础框架:从原理到实战的全链路解析
  • 电子电器架构 --- 车载网关的设计
  • [特殊字符]Meilisearch:AI驱动的现代搜索引擎
  • 【MyBatis-7】深入理解MyBatis二级缓存:提升应用性能的利器
  • 从0开始学习大模型--Day05--理解prompt工程
  • STL-list
  • DA14585墨水屏学习
  • LLMs之ChatGPT:《Connecting GitHub to ChatGPT deep research》翻译与解读
  • [学习]RTKLib详解:sbas.c与rtcm.c
  • cursor sign in 网页登录成功,sursor软件里一直登陆不成功没有登陆信息
  • 扫雷革命:矩阵拓扑与安全扩散的数学之美
  • [架构之美]Spring Boot多环境5种方案实现Dev/Test/Prod环境隔离
  • 二、Hive安装部署详细过程
  • 深度学习中的目标检测:从 PR 曲线到 AP
  • 上海市委常委会会议暨市生态文明建设领导小组会议研究基层减负、生态环保等事项
  • 西安机场回应航站楼“水帘洞”事件:屋面排水系统被冰雹堵塞
  • 习近平出席俄罗斯纪念苏联伟大卫国战争胜利80周年庆典
  • 巴基斯坦称约50名印度士兵在克什米尔实控线丧生
  • 加力、攻坚、借力、问效,上海为优化营商环境推出增量举措
  • 央行:全力推进一揽子金融政策加快落地