【问题标题】:destructuring props with the rest properties使用其余属性解构道具
【发布时间】:2018-04-08 07:19:40
【问题描述】:

据我了解,这个{...props}{prop1, prop2, prop3} 是一回事

在声明无状态功能组件时,使用解构很方便,这样您就不必不断输入props.prop1, props.prop2 等。但是,当您有 10 多个道具时,您需要传递给您的子组件变得非常丑陋,所以我认为我可以使用扩展运算符来解构我的道具对象!

基于{...props}{prop1, prop2, prop3} 基本相同的想法,我希望下面的代码可以工作,但我得到了prop1 is undefined 错误

const Component = ({...props}) => {
    return (
        <div>
            {prop1}
        </div>
    )
}

我正在尝试做的事情可能吗?我在网上找不到任何示例,但是如果有一种方法可以在不明确列出每个道具的情况下解构道具对象,那就太棒了!

编辑:请理解我知道如何正确访问 props 对象的属性。仔细阅读我的问题,我试图在 props 对象中传播所有属性,类似于明确声明它们的示例:

const Component = ({prop1, prop2, prop3}) => {
    return (
        <div>
            {prop1}
        </div>
    )
}

我希望它的行为与使用 {...props} 初始化组件的行为相同

【问题讨论】:

  • props 实际上是一个对象,所以你需要这样访问它:props.prop1
  • 当然可以,但是如果我解构为 ({ prop1 }) 我可以显式访问 prop1。所以我希望扩展运算符会创建类似的行为,但它不会
  • "据我了解,{...props}{prop1, prop2, prop3}" - 嗯,。如果你想解构到单个变量,你需要明确地这样做。写出你真正的意思。
  • 首先,没有“传播算子”。其次,你没有在这里传播任何东西。在这种情况下,{...props} 意味着作为参数传递的对象的所有剩余(“rest”)属性都应该收集到分配给props 的新对象中。因此({...props}) =&gt; {}props =&gt; {} 基本相同,所以你什么也得不到。如果你写的是{prop1, ...props},那就不一样了。这将从传递的对象中提取prop1 并将其分配给变量prop1,并将prop2prop3) 分配给分配给props 的新对象。
  • 为了完整起见,您基本上需要with 语句,如Destructuring an object without specifying its properties 中所述,但不推荐使用with 语句,在严格模式下不起作用,ES6 模块是严格的.

标签: javascript reactjs ecmascript-6 ecmascript-next


【解决方案1】:

这个{...props}{prop1, prop2, prop3}是一回事

只有在你的函数参数通过值解构对象的属性时才是正确的

我的意思:

const doAThing = ({ prop1, prop2, prop3 }) => { console.log(prop1) }

然后像doAThing({...props}) 一样调用它(其中prop1props 对象上的一个属性)- 在这种情况下,您是正确的。这就是它的工作原理。

您无法像尝试那样访问prop1 的原因是因为您没有为deconstruction assigment 分配任何内容。它只是作为具有 prop1, prop2, prop3 等键/值对的对象坐在那里。

【讨论】:

  • 查看 Viveks 对我的问题的回答,并注意我专门指的是反应中的功能组件,而不是常规的 es6 功能。如果我明确声明一个名为 props 的对象,并将其作为 prop 传入并使用 ({...props}) 初始化组件,则行为会按预期工作。但是,如果我尝试对 React 创建的 props 对象执行此操作,则它不起作用。这就是我困惑的地方
  • 那么您的问题是关于派生自React.Component 基类的组件,而不是关于对象解构分配功能?
  • 是正确的,正如我所理解的,当我定义一个组件时,我传递的所有属性都被收集到一个 props 对象中,并且可以作为 props.prop1 等引用,所以我对为什么我感到困惑无法传播该对象而不是显式解构它
  • @RobbieMilejczak:正如我在其他 cmets 中提到的,...props 在这种情况下是 rest 属性,而不是 spread 属性。它收集属性,而不是传播它们。 spread property 仅存在于对象字面量中,例如var point1 = {x: 0, y: 0}; var point2 = {...point1, x: 1}。在这种情况下,point1 的属性“传播到”point2。但是你不能使用扩展属性来隐式创建局部变量。
  • 是的,我已经从你那里得到了答案,但我尽量不做毫无意义的 cmets,不过谢谢你清理它。我只认为 ... 语法做了一件事
猜你喜欢
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2022-06-20
  • 2020-03-16
  • 2019-05-11
  • 2020-06-20
相关资源
最近更新 更多