更新高阶组件中的道具

Posted

技术标签:

【中文标题】更新高阶组件中的道具【英文标题】:Updating props in Higher Order Components 【发布时间】:2019-10-31 07:45:52 【问题描述】:

我正在尝试切换单选按钮并将道具更新为其设置的当前值。

我的Modal 组件正在渲染RadioButton 组件:

<RadioButton
  currentValue=destination
  name=text.newOpp
  onChange=onClick
  value=text.newOpp
  labelText=text.newOpp
/>

onClick 函数正在被传入,此时看起来像这样:

export const onClick = ( destination ) => ( target ) => 
  let copyDestination = ;
  copyDestination.destination = target.name;
  destination = copyDestination;
  // this doesn't really do anything
;

export default compose(
  ...
  ...
  withProps( destination: '' ),
  ...
);

RadioButton 使用recompose 进行了增强,并将此函数作为道具传递:

export const checked = ( currentValue, value ) => 
  return currentValue === value;
;

这就是组件的输入部分的样子:

    <input
      checked=checked
      className=styles.input
      id=uniqueIdForhtml
      name=name
      onChange=onChange
      type="radio"
      value=value
    />

本质上,这应该起作用的方式是,当我单击单选按钮时,我将其 currentValue 属性更新为 target.name 等于的任何值。但我不完全确定如何更新道具,因为它们不应该直接改变。

【问题讨论】:

为什么在有钩子的时候使用recompose?你只是想更新 HOC 的 props 吗? 我遵守这个项目的编码标准。它大约有一年的历史,所以一切都是用 recompose 构建的。 currentValue 属性从 destination 获取价值 - 更新 destination - 可能通过呈现 &lt;RadioButton/&gt; 的父/组件中的 setState - 阅读有关“提升状态”的文档 【参考方案1】:

我最终使用withStateHandler 创建状态并更新它,我还将onClick 函数的名称更改为setDestination,这样更有意义。

export const setDestination = ( destination ) => ( target ) => (
  destination: target.name,
);

export default compose(
  setDisplayName('OpportunityPageFeatures/CopyDestinationModal'),
  withUniqueIDForHTML,
  withStateHandlers( destination: '' ,  setDestination ),
  consoleLogProps,
);

【讨论】:

以上是关于更新高阶组件中的道具的主要内容,如果未能解决你的问题,请参考以下文章

在反应中更改高阶组件中的道具

高阶组件中功能组件的道具

通过 React 高阶组件传递子道具的正确 TypeScript 类型

什么是渲染道具,它与高阶组件有什么不同?

使用 graphql 将道具传递给高阶组件时出现 React-apollo Typescript 错误

打字稿高阶组件