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

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 (
    <input
      value={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.dtcms.com/a/95378.html

相关文章:

  • Unity3D 性能剖析工具(Profiler Tools)的使用
  • vLLM命令行使用方法详解
  • 时序数据库 InfluxDB(一)
  • 批量将多个 OFD 文档转换为 PDF 格式
  • Java全栈面试宝典:内存模型与Spring设计模式深度解析
  • SSM框架加成SpringBoot项目
  • 基于yolov11的3D打印缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
  • scikit-learn 学习路线与知识结构全解析
  • 【Zookeeper搭建】Zookeeper分布式集群搭建完整指南
  • UE4学习笔记 FPS游戏制作29 更换武器时更换武器的图标
  • 鸿蒙 ArkUI 基础布局
  • 力扣67:二进制求和
  • 初识C++:Hello, World!
  • HarmonyOS NEXT 鸿蒙中关系型数据库@ohos.data.relationalStore API 9+
  • PPT制作,分享下2025年国内外做PPT的AI工具,一健生成PPT
  • 【RabbitMQ】
  • 高精度加减乘除 + R 格式
  • windows免密ssh登录linux
  • 核函数(机器学习深度学习)
  • (UI自动化测试web端)第三篇:元素的常用操作方法_鼠标操作
  • CF每日5题Day2(1400)
  • C语言代码如何操作硬件?
  • 量子计算的黎明:从理论到现实的突破之旅
  • 《Python实战进阶》No37: 强化学习入门:Q-Learning 与 DQN
  • 2025年人工智能产业TOP10有哪些省份?人工智能产业发展前景如何?
  • HarmonyOS NEXT 鸿蒙中手写和使用第三方仓库封装Logger打印工具
  • 04 单目标定实战示例
  • MySQL 用户权限与安全管理
  • 5G网络中CPE和ACS
  • 优雅的开始一个Python项目