You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Hooks中如何复用Vue Size Mixin的尺寸Props?

问题解答

1. 尺寸Props在多React组件中复用的实现方式

方式一:高阶组件(HOC)修正版

你之前的HOC写法未处理尺寸Props的验证与逻辑计算,正确的HOC应负责封装尺寸校验、优先级判断逻辑,再将最终计算结果传递给原组件:

// 尺寸验证工具函数
const validateSize = (value) => ['large', 'medium', 'small'].includes(value);

// 封装尺寸逻辑的高阶组件
export const withSize = (Component) => (props) => {
  const { size, small, sm, medium, md, large, lg, urInput, defaultSize = 'medium', ...restProps } = props;
  
  // 计算最终尺寸,与Vue的defineSize逻辑对齐
  let computedSize;
  if (size && validateSize(size)) {
    computedSize = size;
  } else if (medium || md) {
    computedSize = 'medium';
  } else if (large || lg) {
    computedSize = 'large';
  } else if (small || sm) {
    computedSize = 'small';
  } else if (urInput?.size && validateSize(urInput.size)) {
    computedSize = urInput.size;
  } else {
    computedSize = defaultSize;
  }

  return <Component {...restProps} size={computedSize} />;
};

// 使用示例:包裹复选框组件
const MyCheckboxComponent = (props) => {
  return <input type="checkbox" className={`checkbox-${props.size}`} />;
};

const CheckboxWithSize = withSize(MyCheckboxComponent);

// 父组件调用
<CheckboxWithSize size="medium" />
<CheckboxWithSize large />

方式二:Props组合 + 工具函数

若觉得HOC嵌套层级复杂,可提取独立工具函数,让需要尺寸逻辑的组件自行调用:

// 尺寸计算工具函数
export const computeSize = (props) => {
  const { size, small, sm, medium, md, large, lg, urInput, defaultSize = 'medium' } = props;
  const validateSize = (val) => ['large', 'medium', 'small'].includes(val);

  if (size && validateSize(size)) return size;
  if (medium || md) return 'medium';
  if (large || lg) return 'large';
  if (small || sm) return 'small';
  if (urInput?.size && validateSize(urInput.size)) return urInput.size;
  return defaultSize;
};

// 组件内使用
const MyCheckboxComponent = (props) => {
  const size = computeSize(props);
  return <input type="checkbox" className={`checkbox-${size}`} />;
};

// 父组件调用
<MyCheckboxComponent sm />
<MyCheckboxComponent size="large" />

2. 使用React Hooks替换Vue Mixin实现尺寸Props复用

自定义Hook是React中复用逻辑的最优方案,我们可以封装useSize Hook,把尺寸验证、计算逻辑全部封装进去:

// 自定义Hook:useSize
export const useSize = (props) => {
  const validSizes = ['large', 'medium', 'small'];
  const validateSize = (value) => validSizes.includes(value);

  const { size, small, sm, medium, md, large, lg, urInput, defaultSize = 'medium' } = props;

  // 计算最终尺寸
  const computedSize = (() => {
    if (size && validateSize(size)) return size;
    if (medium || md) return 'medium';
    if (large || lg) return 'large';
    if (small || sm) return 'small';
    if (urInput?.size && validateSize(urInput.size)) return urInput.size;
    return defaultSize;
  })();

  return computedSize;
};

// 复选框组件中使用Hook
const MyCheckboxComponent = (props) => {
  const size = useSize(props);
  return (
    <div className={`checkbox-container checkbox-${size}`}>
      <input type="checkbox" />
      <label>{props.label}</label>
    </div>
  );
};

// 父组件调用示例
<MyCheckboxComponent label="选择项" sm />
<MyCheckboxComponent label="选择项" size="large" />
<MyCheckboxComponent label="选择项" md />

这种方式的优势在于:逻辑完全封装,组件只需传入Props即可拿到计算结果;无额外嵌套,代码简洁;可在任意函数组件中复用,灵活性极强。

内容的提问来源于stack exchange,提问作者learningMonk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:09:25