antd 的 usePropsValue 的使用场景和源码解析

usePropsValue 是 Ant Design 提供的一个自定义 Hook,用于处理受控和非受控组件的值管理。它可以帮助开发者轻松地在受控模式和非受控模式之间切换,同时简化组件的状态管理逻辑。

功能

usePropsValue 的主要功能是:

  1. 支持受控模式:
    • 如果传入了 value 和 onChange 属性,usePropsValue 会将组件视为受控组件,value 的值完全由外部控制,组件内部不会维护状态。
  2. 支持非受控模式:
    • 如果没有传入 value,但传入了 defaultValue,usePropsValue 会将组件视为非受控组件,内部会维护状态。
  3. 简化逻辑:
    • 自动处理受控和非受控模式的切换,避免开发者手动编写复杂的逻辑。

使用场景

usePropsValue 通常用于开发需要支持受控和非受控模式的组件,例如表单组件(Input、Select 等)。

示例代码

以下是一个使用 usePropsValue 的示例,展示如何在自定义组件中使用它:

示例:自定义输入框组件

import React from 'react';
import { usePropsValue } from 'ahooks';interface CustomInputProps {value?: string; // 受控模式的值defaultValue?: string; // 非受控模式的默认值onChange?: (value: string) => void; // 值变化时的回调
}const CustomInput: React.FC<CustomInputProps> = (props) => {// 使用 usePropsValue 管理受控和非受控模式const [value, setValue] = usePropsValue({value: props.value,defaultValue: props.defaultValue,onChange: props.onChange,});return (<inputvalue={value}onChange={(e) => setValue(e.target.value)}placeholder="请输入内容"/>);
};export default CustomInput;

解释

  1. 受控模式:
    • 如果父组件传入了 value 和 onChange,CustomInput 会完全受控,value 的值由父组件控制。
    • 示例:
    const App = () => {const [value, setValue] = React.useState('');return (<CustomInput value={value} onChange={setValue} />);
    };
    
  2. 非受控模式:
    • 如果父组件没有传入 value,但传入了 defaultValue,CustomInput 会在内部维护状态。
    • 示例:
    const App = () => {return (<CustomInput defaultValue="默认值" />);
    };
    
  3. usePropsValue 的返回值:
    • usePropsValue 返回一个数组,包含当前值和更新值的方法:
      • value: 当前的值。
      • setValue: 更新值的方法。

参数

usePropsValue 接收一个配置对象,常见的参数包括:

  • value: 受控模式下的值。
  • defaultValue: 非受控模式下的默认值。
  • onChange: 值变化时的回调函数。

源码

示例源码

import { useState, useEffect, useCallback } from 'react';interface UsePropsValueOptions<T> {value?: T; // 受控模式下的值defaultValue?: T; // 非受控模式下的默认值onChange?: (value: T) => void; // 值变化时的回调
}/*** usePropsValue 用于处理受控和非受控组件的值管理*/
export function usePropsValue<T>(options: UsePropsValueOptions<T>) {const { value, defaultValue, onChange } = options;// 如果是非受控模式,使用内部状态const [innerValue, setInnerValue] = useState<T | undefined>(defaultValue);// 当前值:优先使用受控值 `value`,否则使用内部状态 `innerValue`// value === undefined 时为非受控模式const mergedValue = value === undefined ? innerValue : value;// 更新值的方法const setValue = useCallback((newValue: T) => {// 如果是非受控模式,更新内部状态if (value === undefined) {setInnerValue(newValue);}// 调用 `onChange` 回调onChange?.(newValue);},[value, onChange]);// 如果 `defaultValue` 或 `value` 发生变化,更新内部状态useEffect(() => {if (value === undefined && defaultValue !== undefined) {setInnerValue(defaultValue);}}, [defaultValue, value]);return [mergedValue, setValue] as const;
}

解释

  1. 参数:
    • value: 受控模式下的值。如果传入了 value,组件会完全受控。
    • defaultValue: 非受控模式下的默认值。如果没有传入 value,但传入了 defaultValue,组件会使用内部状态。
    • onChange: 值变化时的回调函数。
  2. 内部状态:
    • 使用 useState 来管理非受控模式下的内部状态。
  3. 合并值:
    • mergedValue 是当前的值。如果传入了 value(受控模式),优先使用 value;否则使用内部状态 innerValue。
  4. 更新值:
    • setValue 是更新值的方法。如果是非受控模式,会更新内部状态;同时会调用 onChange 回调。
  5. 同步默认值:
    • 如果 defaultValue 或 value 发生变化,useEffect 会同步更新内部状态。
  6. 返回值:
    • 返回一个数组,包含当前值 mergedValue 和更新值的方法 setValue。

总结

usePropsValue 是一个非常实用的 Hook,用于简化受控和非受控组件的开发。它可以帮助开发者轻松地处理组件的值管理逻辑,避免手动编写复杂的状态管理代码。通过使用 usePropsValue,你可以更高效地开发支持受控和非受控模式的组件。

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

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

相关文章

学习threejs,使用多面体(IcosahedronGeometry、TetrahedronGeometry、OctahedronGeometry等)

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.PolyhedronGeometry …

DeepSeek详解:探索下一代语言模型

文章目录 前言一、什么是DeepSeek二、DeepSeek核心技术2.1 Transformer架构2.1.1 自注意力机制 (Self-Attention Mechanism)(a) 核心思想(b) 计算过程(c) 代码实现 2.1.2 多头注意力 (Multi-Head Attention)(a) 核心思想(b) 工作原理(c) 数学描述(d) 代码实现 2.1.3 位置编码 (…

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解

【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…

网络运维学习笔记(DeepSeek优化版) 022 HCIP-Datacom路由概念、BFD协议详解与OSPF第一课

文章目录 路由概念、BFD协议详解与OSPF第一课一、路由协议优先级与选路原则1.1 路由协议优先级对照表1.2 路由选路核心原则 二、BFD&#xff08;Bidirectional Forwarding Detection&#xff0c;双向转发检测&#xff09;的配置与应用2.1 双向心跳探测&#xff08;双端配置&…

单应性矩阵(homography)

利用单应性矩阵计算内外参矩阵 利用单应性矩阵解决问题 问题描述&#xff1a;

Scavenge算法的优缺点问题

Scavenge 的缺点是只能使用堆内存中的一半&#xff0c;这是由划分空间和复制机制所决定的。但 Scavenge 由于只复制存活的对象&#xff0c;并且对于生命周期短的场景&#xff0c;存活对象只占少部分&#xff0c;所以它在时间效率上有优异的表现。 由于 Scavenge 是典型的牺牲空…

丝杆支撑座间隙调整不当会带来哪些影响?

丝杆支撑座是一种用于支撑滚珠丝杆的零件&#xff0c;通常用于机床、数控机床、自动化生产线等高精度机械设备中。支撑座间隙调整不当会对机械设备的运行产生多方面的影响&#xff0c;接下来一起了解一下&#xff1a; 1、降低加工精度&#xff1a;在机械加工设备中&#xff0c;…

Unity:EasyRoad3D插件学习 二期

前言&#xff1a; 书接上回。 一、场景视图状态&#xff1a; 创建好道路以后&#xff0c;切换到第一个选项&#xff0c;场景视图状态&#xff0c;查看道路信息&#xff0c;Main Settings修改道路名称、类型&#xff0c;宽度&#xff0c;是否闭环。 RoadWidth改为15&#xff…

内网渗透-DLL和C语言加载木马

免杀进阶技术 1、DLL的定义与使用 DLL:Dynamic Link library,动态链接库&#xff0c;是一个无法自己运行&#xff0c;需要额外的命令或程序来对其接口进行调用&#xff08;类方法、函数&#xff09;。 (1)在DevCpp中创建一个DLL项目 (2)在dllmain.c中定义源代码函数接口 #i…

一洽让常见问题的快速咨询,触手可及

在客户服务场景中&#xff0c;重复性常见问题的处理效率直接影响用户体验与客服成本。针对重复性常见问题&#xff0c;如何以直观的方式呈现给用户&#xff0c;使其能够快速、精准地提出咨询&#xff0c;已成为提升客户满意度的关键因素。 一、传统客服模式的效率枷锁 用户咨…

WEB攻防-Java安全SPEL表达式SSTI模版注入XXEJDBCMyBatis注入

目录 靶场搭建 JavaSec ​编辑​编辑 Hello-Java-Sec(可看到代码对比) SQL注入-JDBC(Java语言连接数据库) 1、采用Statement方法拼接SQL语句 2.PrepareStatement会对SQL语句进行预编译&#xff0c;但如果直接采取拼接的方式构造SQL&#xff0c;此时进行预编译也无用。 3、…

树莓集团南京园区启航:数字经济新地标!

深耕数字产业&#xff0c;构筑生态闭环 树莓集团在数字产业领域拥有超过十年的深厚积累&#xff0c;专注于构建“数字产业”的融合生态链。其核心优势在于有效整合政府、产业、企业及高校资源&#xff0c;形成一个协同创新、价值共生的产业生态闭环系统。 赋能转型&#xff0c…

Redis之bimap/hyperloglog/GEO

bimap/hyperloglog/GEO的真实需求 这些需求的痛点&#xff1a;亿级数据的收集清洗统计展现。一句话&#xff1a;存的进取得快多维度 真正有价值的是统计。 统计的类型 亿级系统中常见的四种统计 聚合统计 统计多个集合元素的聚合结果&#xff0c;就是交差并等集合统计。 排…

nara wpe去混响学习笔记

文章目录 1.WPE方法去混响的基本流程1.1.基本流程 2.离线迭代方法3.在线求法3.1.回顾卡尔曼方法3.2.在线去混响递推滤波器G方法 nara wpe git地址 博客中demo代码下载 参考论文 NARA - WPE: A Python Package for Weighted Prediction Error Dereverberation in Numpy and Ten…

JavaScript函数、箭头函数、匿名函数

1.示例代码(包括用法和注意事项) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JS-函数</title…

练习:求平方根

需求&#xff1a;键盘录入一个大于等于2的整数x&#xff0c;计算并返回x的平方根。结果只保留整数部分&#xff0c;小数部分将被舍去。 代码一&#xff1a; //求平方根 //方法一&#xff1a; package Online; import java.util.Scanner; public class SquareRoot {public sta…

win10 安装后的 系统盘的 分区

win10 安装后的 系统盘的 分区 MBR 分区 GPT 分区

反向 SSH 隧道技术实现内网穿透

反向 SSH 隧道技术实现内网穿透 场景描述 有一台内网的 Linux PC 机&#xff0c;想在其他地方&#xff08;如家中&#xff09;使用浏览器&#xff0c;在浏览器中能够使用内网 Linux PC 机的命令行。 实现思路 内网 Linux PC 机在内网可以使用 SSH 进行连接&#xff0c;但内…

[MRCTF2020]套娃

一。 按F12看源代码 发现代码 读代码发现 1.我们传的参数中不能存在_和%5f&#xff0c;可以通过使用空格来代替_&#xff0c;还是能够上传成功。 2.正则表达式"/^23333/ " &#xff0c;开头结尾都被 " " 和 " /"&#xff0c;开头结尾都被&qu…

基于Windows11的WSL2通过Ollama平台安装部署DeepSeek-R1模型

DeepSeek-R1模型各参数版本硬件要求 一、在Windows上安装Linux子系统WSL2 检查电脑是否支持虚拟化&#xff0c;按住<font style"color:rgb(199, 37, 78);background-color:rgb(249, 242, 244);">WindowsR</font>输入<font style"color:rgb(199,…