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

深入React Hoooks:从基础到自定义 Hooks

使用 useContext

useContext 是另一个常用的 Hook,它可让我们在函数组件中轻松访问 React 的 context。如果你的应用程序依赖于一些全局状态,或者你希望避免将 props 一层一层地传递到子组件,context 很有用。你可以在父组件设置一个值,然后在任何子组件中直接读取到它。

创建一个 context 对象很简单,使用 React.createContext() 并在需要访问它的组件中使用 useContext 即可。

import React, { useContext } from 'react';// Create a context with a default value
const ThemeContext = React.createContext('light');function Display() {// Use the context value (the closest provider up the tree)const theme = useContext(ThemeContext);return <div>{theme}</div>;
}// This Component sets the value and includes Display as a child
function App() {return (<ThemeContext.Provider value='dark'><Display /></ThemeContext.Provider>);
}export default App;

在这个例子中,我们在 App 组件中定义了 context 的值为 'dark',然后在 Display 组件中直接读取到 'dark'。

自定义 Hooks

自定义 Hook 是一种复用代码的有效方式,能让我们将组件逻辑提取到可重用的函数中。自定义 Hook 是一个以 “use” 开头的函数,这个函数可以调用其他的 Hook。

比如,我们可以创建一个自定义 Hook 来处理表单的输入:

import { useState } from 'react';function useInput(initialValue) {const [value, setValue] = useState(initialValue);function handleChange(e) {setValue(e.target.value);}return [value, handleChange];
}

我们的 useInput 同时返回了当前的值和一个处理改变的函数,其可以直接在表单输入中使用。例如:

function Signup() {const [name, handleName] = useInput('');const [email, handleEmail] = useInput('');const handleSubmit = (e) => {e.preventDefault();console.log(name, email);}return (<form onSubmit={handleSubmit}><input type="text" value={name} onChange={handleName} placeholder="Name" /><input type="text" value={email} onChange={handleEmail} placeholder="Email" /><button type="submit">Submit</button></form>);
}export default Signup;

我们的 Signup 组件使用 useInput 自定义 Hook 来处理 name 和 email 字段。提交表单时将打印出这两个字段的值。

总的来说,React Hooks 引入了一种优雅的方式来管理状态和副作用,既可以简化代码,又可以增强可读性。除了上述所述的 Hook 外,还有许多其他的 Hook,例如 useReduceruseMemo 和 useRef 等等,每个都具有自己的用途和唯一性。

相关文章:

深入React Hoooks:从基础到自定义 Hooks

使用 useContext useContext 是另一个常用的 Hook&#xff0c;它可让我们在函数组件中轻松访问 React 的 context。如果你的应用程序依赖于一些全局状态&#xff0c;或者你希望避免将 props 一层一层地传递到子组件&#xff0c;context 很有用。你可以在父组件设置一个值&…...

9.7 Go语言入门(映射 Map)

Go语言入门&#xff08;映射 Map&#xff09; 目录六、映射 Map1. 声明和初始化映射1.1 使用 make 函数1.2 使用映射字面量 2. 映射的基本操作2.1 插入和更新元素2.2 访问元素2.3 检查键是否存在2.4 删除元素2.5 获取映射的长度 3. 遍历映射4. 映射的注意事项4.1 映射的零值4.2…...

过期视频怎么恢复?如何从手机、电脑和其他设备中恢复?

过期视频是指那些被误删、丢失或因系统升级等原因而无法正常访问的视频文件。这些视频可能包含了我们珍贵的回忆、重要的信息或者具有商业价值的内容。过期视频的恢复可以帮助我们找回失去的数据&#xff0c;减少损失&#xff0c;提高工作效率和生活质量。过期视频怎么恢复&…...

LeetCode刷题第2题

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …...

mysql执行拼接的sql语句

在MySQL中&#xff0c;可以使用 CONCAT() 函数来拼接SQL语句。但是&#xff0c;请注意&#xff0c;直接拼接SQL语句可能会导致SQL注入问题&#xff0c;因此应当使用参数化查询来避免这个问题。 以下是一个使用 CONCAT() 函数拼接SQL语句的例子&#xff1a; SET tableName us…...

使用 pm2 或 screen 等工具来管理和后台运行你的 Node.js 应用

使用 pm2 或 screen 等工具来管理和后台运行你的 Node.js 应用。 使用 pm2 pm2 是一个用于 Node.js 应用的进程管理工具&#xff0c;提供了守护进程、日志管理和应用重启等功能。 安装 pm2&#xff1a; npm install pm2 -g启动你的 Node.js 应用&#xff1a; pm2 start se…...

leetcode4 寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.00000 解释&a…...

水库大坝安全监测系统建设方案

一、背景 随着自动化技术的进步&#xff0c;大部分水库大坝不同程度地实现了安全监测自动化。但仍存在以下问题&#xff1a; 1、重建轻管&#xff0c;重视安全监测系统建设&#xff0c;不够重视运行维护。 2、缺乏系统性、综合性及相关性的资料分析功能。 3、软件大多为数据…...

单片机的内存映射和重映射

内存映射 在单片机内&#xff0c;不管是RAM还是ROM还是寄存器&#xff0c;他们都是真实存在的物理存储器&#xff0c;为了方便操作&#xff0c;单片机会给每一个存储单元分配地址&#xff0c;这就叫做内存映射。 单片机的内存映射是指将外部设备或外部存储器映射到单片…...

详解和实现数据表格中的行数据合并功能

theme: smartblue 前言 需求场景&#xff1a; 在提供了数据查看和修改的表格视图中(如table、a-table等…)&#xff0c;允许用户自行选择多行数据&#xff0c;依据当前状态进行特定列数据的合并操作。选中的数据将统一显示为选中组的首条数据值。同时&#xff0c;页面会即时反…...

深度学习-05-反向传播理论知识

深度学习-05-反向传播理论知识 本文是《深度学习入门2-自製框架》 的学习笔记&#xff0c;记录自己学习心得&#xff0c;以及对重点知识的理解。如果内容对你有帮助&#xff0c;请支持正版&#xff0c;去购买正版书籍&#xff0c;支持正版书籍不仅是尊重作者的辛勤劳动&#xf…...

黑马程序员——Spring框架——day04——SpringMVC基础

目录&#xff1a; SpringMVC简介 背景SpringMVC概述技术体系定位快速入门 目的需求步骤代码实操测试工具 PostMan简介PostMan安装PostMan使用知识点总结请求与参数处理 请求路径 环境准备问题分析解决方式请求方式 环境准备技术分析参数 基本数据类型POJO嵌套POJO数组集合&…...

SpaceX间接「颠覆」了手机?星链如何直连手机通信?

SpaceX 旗下的星链项目推出了一个极具颠覆性的技术——direct to cell&#xff08;DTC&#xff09;&#xff0c;即通过卫星直接与手机建立通信。这项技术无需对手机进行任何改装&#xff0c;大多数普通手机都可以直接接入星链的卫星网络&#xff0c;实现全球范围内的手机信号覆…...

初识C++ · 模拟实现stack和Queue

目录 前言&#xff1a; 1 Stack 1.1 双端队列 2 Queue 前言&#xff1a; 经历了list三个自定义类型的洗礼&#xff0c;来个简单的放松放松&#xff0c;即栈和队列&#xff1a; 文档记录的&#xff0c;栈和队列是一种容器适配器&#xff0c;它们不属于stl&#xff0c;但是它…...

MFC工控项目实例之一主菜单制作

1、本项目用在WIN10下安装的vc6.0兼容版实现。创建项目名为SEAL_PRESSURE的MFC对话框。在项目res文件下添加相关256色ico格式图片。 2、项目名称&#xff1a;密封压力试验机 主菜单名称&#xff1a; 系统参数 SYS_DATA 系统测试 SYS_TEST 选择型号 TYP_CHOICE 开始试验 TES_STA…...

JVMの堆、栈内存存储

1、JVM栈的数据存储 通过前面的学习&#xff0c;我们知道&#xff0c;将源代码编译成字节码文件后&#xff0c;JVM会对其中的字节码指令解释执行&#xff0c;在解释执行的过程中&#xff0c;又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…...

二叉树—堆(C语言实现)

一、树的概念及结构 1.树的概念 树是一种非线性的数据结构&#xff0c;它是有n&#xff08;n > 0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下。 ● 有一个特殊的结点…...

儿童有声挂图的芯片AD156—云信通讯

有声挂图是一种结合了图像和声音的媒体形式&#xff0c;用户可以触发图像上的声音&#xff0c;从而获得与图像内容相关的音频信息。这种融合了视觉和听觉的交互方式&#xff0c;既满足了人们对美感和观感的需求&#xff0c;又提高了信息传递的效果和效率。 有声挂图作为孩子的…...

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.04.25-2024.05.01

文章目录~ 1.Soft Prompt Generation for Domain Generalization2.Modeling Caption Diversity in Contrastive Vision-Language Pretraining3.Q-GroundCAM: Quantifying Grounding in Vision Language Models via GradCAM4.HELPER-X: A Unified Instructable Embodied Agent t…...

gdb调试常见指令

quit&#xff1a;退出gdb list/l&#xff1a;l 文件名&#xff1a;行号/函数名&#xff0c;l 行号/函数名 b:b 文件名&#xff1a;行号/函数名&#xff0c;b 行号/函数名 info/i: info b d:d 断电编号 disable/enable 断电编号&#xff1a;使能&#xff08;关闭&#xff0…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...