状态管理

news/2024/11/8 9:37:05/文章来源:https://www.cnblogs.com/duixue/p/18534471

在组件间共享状态

有时候你希望两个组件的状态始终同步更改。要实现这一点,可以将相关状态从这两个组件上移除,并把这些状态移到最近的父级组件,然后通过 props 将状态传递给这两个组件。这被称为“状态提升”,这是编写 React 代码时常做的事。

对 state 进行保留和重置

当你重新渲染一个组件时, React 需要决定组件树中的哪些部分要保留和更新,以及丢弃或重新创建。

如弹出表单填写之后关闭,再次打开,会有上一次的值。

迁移状态逻辑至 Reducer 中

对于那些需要更新多个状态的组件来说,过于分散的事件处理程序可能会令人不知所措。对于这种情况,你可以在组件外部将所有状态更新逻辑合并到一个称为 “reducer” 的函数中。这样,事件处理程序就会变得简洁,因为它们只需要指定用户的 “actions”。在文件的底部,reducer 函数指定状态应该如何更新以响应每个 action!

使用 Context 深层传递参数

通常,你会通过 props 将信息从父组件传递给子组件。但是,如果要在组件树中深入传递一些 prop,或者树里的许多组件需要使用相同的 prop,那么传递 prop 可能会变得很麻烦。Context 允许父组件将一些信息提供给它下层的任何组件,不管该组件多深层也无需通过 props 逐层透传

  • LevelContext.js
import { createContext } from 'react';export const LevelContext = createContext(0);
  • Heading.js
import { useContext } from 'react';
import { LevelContext } from './LevelContext.js';import { useContext } from 'react';
import { LevelContext } from './LevelContext.js';export default function Heading({ children }) {const level = useContext(LevelContext);switch (level) {case 0:throw Error('标题必须在 Section 内!');case 1:return <h1>{children}</h1>;case 2:return <h2>{children}</h2>;case 3:return <h3>{children}</h3>;case 4:return <h4>{children}</h4>;case 5:return <h5>{children}</h5>;case 6:return <h6>{children}</h6>;default:throw Error('未知级别:' + level);}
}
  • Section.js
import { useContext } from 'react';
import { LevelContext } from './LevelContext.js';export default function Section({ children }) {const level = useContext(LevelContext);return (<section className="section"><LevelContext.Provider value={level + 1}>{children}</LevelContext.Provider></section>);
}
  • App.js
import Heading from './Heading.js';
import Section from './Section.js';export default function Page() {return (<Section><Heading>大标题</Heading><Section><Heading>一级标题</Heading><Heading>一级标题</Heading><Heading>一级标题</Heading><Section><Heading>二级标题</Heading><Heading>二级标题</Heading><Heading>二级标题</Heading><Section><Heading>三级标题</Heading><Heading>三级标题</Heading><Heading>三级标题</Heading></Section></Section></Section></Section>);
}

使用 Reducer 和 Context 拓展你的应用

Reducer 帮助你合并组件的状态更新逻辑。Context 帮助你将信息深入传递给其他组件。你可以将 reducers 和 context 组合在一起使用,以管理复杂应用的状态。

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

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

相关文章

信号量机制

信号量机制 1965年由荷兰学者 Dijkstra 提出 ​​ ‍一、概念 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。 信号量甚实就是一个变量(可以是一个整数,也可以是更复杂的(数据结构)记录型变量),可以用一个信号量…

RAC:无训练持续扩展,基于检索的目标检测器 | ECCV24

来源:晓飞的算法工程笔记 公众号,转载请注明出处论文: Online Learning via Memory: Retrieval-Augmented Detector Adaptation论文地址:https://arxiv.org/abs/2409.10716创新点提出一种通过检索增强分类过程的创新在线学习框架RAC,与传统的基于离线训练/微调的方法相比,…

信号量实现进程互斥、同步、前驱关系

信号量实现进程互斥、同步、前驱关系 ‍ ​​ ‍​​​ P、V 操作必须成对出现。缺少 P(mutex) 就不能保证临界资源的互斥访问。缺少 V(mutex) 会导致资源永不被释放,等待进程永不被唤醒。 ‍ 一、实现进程互斥 注:下图中的第一行对信号量的初始化只是简化写法,并不严格遵循…

Git推送报错Authentication failed

在某一次的Git推送中出现了一个奇怪的报错Authentication failed,经过一番测试有可能是VSCode的Git插件所导致的问题,本文提供了一个在VSCode的Terminal中可以正常push的解决方案。问题背景 在某一次的Git推送时,配置好commit信息之后,执行push操作的时候出现了这样的一个报…

iOS微信授权登录中Universal Link(通用链接)的配置

配置Unuversal Links 1.苹果开发者账号打开配置2.配置JSON文件,创建一个空白文件(必须纯文本,命名为apple-app-site-association,去除后缀名)。这里建议让后台人员在其本地创建,避免文件传输时,文件自动被更改格式、后缀自动添加等问题{"applinks": {"ap…

充电桩着火预警系统

充电桩着火预警系统利用现场监控摄像头,充电桩着火预警系统对新能源汽车充电场景进行7*24小时实时监测,自动发现监控区域范围内的异常烟雾和火灾事故苗头,大大减少了人为因素导致的误报和漏报现象。同时,系统还会自动记录报警信息和处理过程,为后续的故障排查和责任追溯提…

小区消防通道堵塞监测识别系统

小区消防通道堵塞监测识别系统利用现场监控摄像头对消防安全通道进行实时监测。小区消防通道堵塞监测识别系统通过先进的图像处理技术和深度学习算法,系统能够准确识别出消防通道是否被车辆、杂物等占据或阻塞。一旦监测到异常情况,系统会立刻发出告警信息,通过声光报警、短…

2个月搞定计算机二级C语言——真题(10)解析

1. 前言 本篇我们讲解2个月搞定计算机二级C语言——真题102. 程序填空题 2.1 题目要求2.2 提供的代码 #include <stdio.h> #pragma warning (disable:4996) double fun(double x[], int n) {int i, k = 0;double avg = 0.0, sum = 0.0;for (i = 0; i < n; i++)avg +…

我会卡常!

以下是博客签名,正文无关本文来自博客园,作者:ppllxx_9G,转载请注明原文链接:https://www.cnblogs.com/ppllxx-9G/p/18534410

考研打卡(11)

开局(11) 开始时间 2024-11-07 14:12:35 结束时间 2024-11-08 09:07:12上机ing数据结构下面关于图的存储的叙述中正确的是___(北京师范大学2015年) A 用邻接表法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 B 用邻接表法存储图,占用的存储空间大小与图…

使用Kali进行Dos攻击实验

前言 1. 拒绝服务(DoS, Denial of Service)攻击是一种网络攻击手段,其目的是通过各种方式使目标系统或网络资源无法为合法用户提供正常服务。攻击者可能会利用网络协议的缺陷、发送大量无效请求或使用僵尸网络来耗尽目标系统的资源,如CPU、内存、带宽或网络连接,导致系统无…

PbootCMS提示会话目录写入权限不足

问题背景在使用 PbootCMS 时,可能会遇到“会话目录写入权限不足”的提示。这通常是由于某些目录的权限设置不正确导致的。解决方法通过设置 config、data、runtime 和 upload 等文件夹的可读写权限,可以解决这个问题。最简单的方法是将整个网站根目录设置为 777 权限。扫码添…