如何使用 props 和 spread 运算符从子组件中操作状态?

Posted

技术标签:

【中文标题】如何使用 props 和 spread 运算符从子组件中操作状态?【英文标题】:How do I manipulate state from a child component using props and spread operator? 【发布时间】:2022-01-03 11:03:12 【问题描述】:

我传的是props.key和props.expansion,它们的数据类型分别是字符串和对象。

在 if 语句中,JS 引擎对展开​​运算符(props.key: true) 之后的第二个参数抛出错误,错误消息说需要逗号。 我在代码中没有看到任何错误。

请针对 if 语句中 props.selectExpansion 的参数(尤其是第二个参数)指出并提出解决方案。

const Expansion = (props) => 

return (
    // unique props.key is the expansion name
    <div className=props.key onClick=() => 
    // only alters the expansionList state by changing the expansion name corresponding to props.key
        
    // change the boolean value of expansion on expansionList
        if(!props.expansion[props.key]) 
            props.selectExpansion(...props.expansion, props.key: true)
         else 
            props.selectExpansion(...props.expansion, props.key: false)
        
    >
        
      <h1>Expansion</h1>
    </div>
    );

 
export default Expansion;

【问题讨论】:

我认为您打算将对象作为第二个参数传递,但您直接传递它。用花括号把它包起来。 [props.key]: true 嗨,我的意图是使用 selectExpansion 设置状态。该状态有 24 个键/值对,所以我使用的是扩展语法。然后我使用 props.key:true (或 false) 只更改一个键/值对。它不工作。更新)您的解决方案有效! 您确定props.key 甚至可以在组件中访问吗? React 有几个 非常特别的 属性,keyref,它们不会传递给子组件。换句话说,它们不能从子组件访问。如果props.key 可以通过某种方式访问​​,那么您需要传递一个对象,将props.key 作为动态属性名称,即props.selectExpansion( ...props.expansion, [props.key]: true ) @DrewReese 在我解决了这个问题之后,我肯定也必须检查一下。感谢您指出;你救了我一个问题 【参考方案1】:

为了更好地理解,我认为我们需要查看父组件,但我认为您正在尝试设置状态,因为它只是使用更新的键值。因此,您需要将参数包装在一个对象中。

const Expansion = (props) => 

return (
    // unique props.key is the expansion name
    <div className=props.key onClick=() => 
    // only alters the expansionList state by changing the expansion name corresponding to props.key
        
    // change the boolean value of expansion on expansionList
        if(!props.expansion[props.key]) 
            props.selectExpansion(...props.expansion, props.key: true)
         else 
            props.selectExpansion(...props.expansion, props.key: false)
        
    >
        
      <h1>Expansion</h1>
    </div>
    );

 
export default Expansion;

看看我用过这个

props.selectExpansion(...props.expansion, props.key: true)

代替

props.selectExpansion(...props.expansion, props.key: true)

之前您将 2 个参数传递给 setState(selectExpansion) 函数。

【讨论】:

我犯了一个非常愚蠢的错误,谢谢! 另外,这个关键属性是反应道具的一部分还是一个单独的属性?你能访问它吗?这可能仍然行不通。您必须执行类似 props.selectExpansion(...props.expansion, [props.key]: true) 的操作。仅当密钥可访问且不是 react 属性时。【参考方案2】:

很难说props.expansion 是什么,如果您想更改该对象内部的某些内容,可以将代码更改为以下内容:

// change the boolean value of expansion on expansionList
if(!props.expansion[props.key]) 
    props.selectExpansion(...props.expansion, [props.key]: true)
 else 
    props.selectExpansion(...props.expansion, [props.key]: false)

【讨论】:

以上是关于如何使用 props 和 spread 运算符从子组件中操作状态?的主要内容,如果未能解决你的问题,请参考以下文章

javascript React:使用spread(... spread)运算符

从子组件中修改 props.value

在 Redux 中使用 Spread 运算符或 Object.assign 的权利是啥?

This.props.history 未定义,如果从子组件调用[重复]

使用 Spread 运算符时出现 TypeScript 错误?

Laravel:是不是可以在组件构造函数中使用 Spread 运算符?