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

如何同时使用React属性展开与属性提取?

React组件类名合并的精准控制写法

先看现有组件实现:

const TextLarge = (props) => { // props包含classes、color和children
    return <Text
               classes={'text-large-style'}
               {...props}>
               {props.children}
           </Text>
}

const Text = ({
    children,
    color,
    classes,
}) => {
    return <p
               className={clsx('text-styles', classes)}
               style={{color: color}}>
               {children}
           </p>
}

当使用 <TextLarge classes='some-special-style'>Foo</TextLarge> 时,传入的classes会覆盖内部的text-large-style——因为{...props}属性展开操作在显式赋值的classes之后,后赋值的属性会覆盖前序属性。

虽然可以通过调整顺序让合并后的类名覆盖展开的props:

const TextLarge = (props) => {
    return <Text
               {...props}
               classes={clsx('text-large-style', props.classes)}>
               {props.children}
           </Text>
}

但如果想要更精准的控制——也就是先提取classes进行合并,再把剩余不含classes的props展开传入Text,可以用对象解构+剩余参数的写法:

const TextLarge = ({ classes: propsClasses, ...restProps }) => {
    return <Text
               classes={clsx('text-large-style', propsClasses)}
               {...restProps}>
               {restProps.children}
           </Text>
}

这种写法直接从props中解构出classes并重命名为propsClasses,剩余所有属性都存入restProps,展开restProps时不会包含classes,彻底避免了属性覆盖问题,实现了精准的属性传递控制。


内容的提问来源于stack exchange,提问作者four-eyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:57:24