React 中利用解构语法 ... 快速方便传递 props 参数

本文介绍了如何通过React的解构特性简化组件间props的传递,从interfaceProps到解构对象、省略对象定义和ES6字面量对象,展示了更便捷的写法,并推荐了个人常用的优雅传递方式。

当我们创建一个组件之后,传递的 props 有时候比较多:

interface Props {
  token: string;
  setToken: Dispatch<SetStateAction<string>>;
  gitProviderOrgName: string;
  setGitProviderOrgName: Dispatch<SetStateAction<string>>;
  modalDisplay: boolean;
  setModalDisplay: Dispatch<SetStateAction<boolean>>;
  successCb?: Function;
}

export default function GitHubPAT(props: Props): React.ReactElement {
  // ... Code
}

引用组件时要写重复的一堆 prop:

<GitHubPAT
    token={token}
    setToken={setToken}
    gitProviderOrgName={gitProviderOrgName}
    setGitProviderOrgName={setGitProviderOrgName}
    modalDisplay={modalDisplay}
    setModalDisplay={setModalDisplay}
/>

看着这一坨 💩,心情:

temper

还好React 提供了一个叫做解构特性,利用解构操作符(...)将一个对象解构作为子组件的 props:

function Father() {
  const props = {
    token: token,
    setToken: setToken,
    gitProviderOrgName: gitProviderOrgName,
    setGitProviderOrgName: setGitProviderOrgName,
    modalDisplay: modalDisplay,
    setModalDisplay: setModalDisplay,
  };

  
  return (
    <>
      {/* 利用解构特性,将 props 对象透传给子组件 */}
      <GitHubPAT {...props} />
    </>
  );
}

当然,我们也可以省略定义对象,直接:

{/* 省略对象定义*/}
<GitHubPAT
  {...{
    token: token,
    setToken: setToken,
    gitProviderOrgName: gitProviderOrgName,
    setGitProviderOrgName: setGitProviderOrgName,
    modalDisplay: modalDisplay,
    setModalDisplay: setModalDisplay,
  }}
/>

再利用 ES6 字面量对象定义新特性,省到极致,快速方便:

<GitHubPAT
  {...{
    token,
    setToken,
    gitProviderOrgName,
    setGitProviderOrgName,
    modalDisplay,
    setModalDisplay,
  }}
/>

🧤 个人比较推荐使用这种方式,虽然它有一定的理解成本,但是并不高。只要习惯了这种传递方式,就会发现它的优雅和便捷。

Reference

[1] https://reactjs.org/docs/jsx-in-depth.html#spread-attributes

### Vue.js 中实现类似 React 的属性解构功能 在 Vue.js 中,虽然没有直接提供类似于 React 的 `{...props}` 语法,但可以通过多种方式实现类似的属性解构功能。以下是几种常见的实现方法: #### 方法一:通过 `v-bind` 动态绑定所有属性 Vue 提供了 `v-bind` 指令的简写形式 `:`,并且支持将对象的所有属性动态绑定到子组件或 DOM 元素上。例如: ```vue <template> <child-component v-bind="props"></child-component> </template> <script> export default { data() { return { props: { name: 'World', age: 25, location: 'Earth' } }; } }; </script> ``` 这种方式会将 `props` 对象中的所有键值对传递给子组件[^1]。 #### 方法二:使用 JavaScript 解构赋值 在 Vue 的 `props` 定义中,可以利用 JavaScript解构赋值功能手动提取所需的属性。例如: ```vue <template> <div> Hello, {{ name }}! You are {{ age }} years old. </div> </template> <script> export default { props: ['name', 'age'], mounted() { const { name, age } = this; console.log(name, age); // 输出解构后的值 } }; </script> ``` 这种方法适用于需要明确指定哪些属性需要传递的场景[^1]。 #### 方法三:结合 `Object.assign` 或扩展运算符 如果需要将父组件的多个属性动态传递给子组件,可以使用 `Object.assign` 或扩展运算符(`...`)来构造一个新对象。例如: ```vue <template> <child-component :data="mergedProps"></child-component> </template> <script> export default { data() { return { baseProps: { name: 'World', age: 25 }, extraProps: { location: 'Earth' } }; }, computed: { mergedProps() { return { ...this.baseProps, ...this.extraProps }; // 合并属性 } } }; </script> ``` 这种方式特别适合需要合并多个对象属性的场景[^1]。 #### 方法四:通过 `$attrs` 和 `v-bind="$attrs"` Vue 提供了一个特殊的属性 `$attrs`,它包含了父组件传递给当前组件的所有未声明为 `props` 的属性。可以使用 `v-bind="$attrs"` 将这些属性传递给子组件。例如: ```vue <template> <child-component v-bind="$attrs"></child-component> </template> <script> export default { inheritAttrs: false // 禁用默认的属性继承 }; </script> ``` 这种方式适用于需要透明地将所有属性传递给子组件的场景[^1]。 ### 总结 Vue.js 中可以通过 `v-bind`、JavaScript 解构赋值、扩展运算符以及 `$attrs` 等方式实现类似 React 的 `{...props}` 功能。每种方法都有其适用场景,开发者可以根据具体需求选择合适的实现方式。 ```javascript // 示例代码:结合扩展运算符和 $attrs <template> <child-component v-bind="mergedProps" v-bind="$attrs"></child-component> </template> <script> export default { computed: { mergedProps() { return { ...this.baseProps, ...this.extraProps }; } }, data() { return { baseProps: { name: 'World' }, extraProps: { age: 25 } }; }, inheritAttrs: false }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值