将对象作为道具传递是不是会干扰 componentWillReceiveProps?

Posted

技术标签:

【中文标题】将对象作为道具传递是不是会干扰 componentWillReceiveProps?【英文标题】:Does passing objects as props interfere with componentWillReceiveProps?将对象作为道具传递是否会干扰 componentWillReceiveProps? 【发布时间】:2018-04-01 23:46:32 【问题描述】:

我的 React 应用程序需要使用动态键来跟踪配置对象,所以我将它传递给这样的组件:

<Component configuration=this.state.configuration>

虽然这有效,但当我在组件的componentWillReceiveProps(nextProps) 中时,我无法辨别配置更改,因为this.props 已经更新为nextProps

如果这不是一个已知问题,也许它与我处理父级配置状态更新的方式有关?以下是我更新配置状态的方法:

  handleConfigurationChangeForKey(newOption, key) 
    const configObject = this.state.configuration;
    configObject[key] = newOption;
    this.setState(configuration: configObject);
  

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

我无法辨别配置更改,因为 this.props 已更新为 nextProps。

这不是真的。 this.props 将拥有当前的道具,nextProps 将拥有即将到来的道具。

您设置状态的方式可能是问题所在。尝试使用Object.create 或深拷贝功能(如lodash 提供的功能)创建一个新的配置对象。

const newConfig = Object.create(oldConfig)
# or
const newConfig = _.cloneDeep(oldConfig)

newConfig[key] = newValue

这样,对象不会通过引用旧版本而相等。如果复制带来性能问题,您可以尝试为您的状态对象使用Immutable.js 库。

【讨论】:

【参考方案2】:

当您更新配置对象时,您正在改变它:您无法区分nextProps.configurationthis.props.configuration,因为它们是同一个对象。

解决这个问题的方法基本上是克隆原始配置对象,改变 that,然后使用 setState 使配置指向那个新对象。

handleConfigurationChangeForKey(newOption, key) 
  const nextConfiguration = 
    ...this.state.configuration,
    [key]: newOption
  ;
  this.setState( configuration: nextConfiguration );

仅使用较旧的语言功能

handleConfigurationChangeForKey(newOption, key) 
  var nextConfiguration = ;
  nextConfiguration[key] = newOption;
  nextConfiguration = Object.assign(
    ,
    this.state.configuration,
    nextConfiguration
  );
  this.setState( configuration: nextConfiguration );

【讨论】:

很好的答案,感谢您向我展示如何使用新的传播运算符。

以上是关于将对象作为道具传递是不是会干扰 componentWillReceiveProps?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 vue 路由器将对象作为道具传递?

React styled-component 不传递道具

将对象道具作为 JSX 属性而不是对象传递

React TypeScript HoC - 将组件作为道具传递

Vue - 将方法作为道具传递给孩子

为啥数组中的两个对象中只有一个作为道具传递?