从克隆的 React 组件中删除一个道具

Posted

技术标签:

【中文标题】从克隆的 React 组件中删除一个道具【英文标题】:Remove a prop from cloned React component 【发布时间】:2019-01-18 19:32:00 【问题描述】:

目标:我需要对 React 组件进行一些后处理,这涉及到移除一些道具。我尝试使用React.cloneElement 传递propToRemove: undefined 作为第二个参数,但没有删除道具,只是设置为undefined。我可以使用React.createElement,但根据文档,这将失去refs,这是一个严重的缺点。

一个人为的例子,没有做任何有用的事情,只是为了测试:

const removeUnknownPropWithClone = (el) => 
  return React.cloneElement(el, unknownProp: undefined)
;

const App = (props) => 
  removeUnknownPropWithClone(
    <div unknownProp="1">Hello</div>
  );

这显示了错误消息:“React 无法识别 DOM 元素上的 unknownProp 属性”。事实上,道具设置为undefined,但它仍然存在。我需要完全删除它。

Runnable snippet(打开控制台查看错误信息)

相关问题(但未在此处回答):React - Remove prop from child

相关源码:https://github.com/facebook/react/blob/master/packages/react/src/ReactElement.js#L293

【问题讨论】:

查看***.com/questions/43041013/…,看看能不能找到一些灵感? 谢谢,@DamianSimonPeter,我做到了,甚至写了几个 cmets :) 是的,我认为错误似乎有点简单,我可能错了。您不应该在 DOM 元素中包含“unknownProp=1”。我想这是你的错误的原因&lt;div unknownProp="1"@tokland 是的,当然,这是一个人为的例子,我会在问题中添加一个注释。我希望处理删除正在其他地方使用的道具。 【参考方案1】:

有时查看来源是件好事;)

cloneElement 不允许删除道具 - 它们被复制和覆盖。没有删除或传递函数的选项。

但是看高一点我们可以看到:

export function cloneAndReplaceKey(oldElement, newKey) 
  const newElement = ReactElement(
    oldElement.type,
    newKey,
    oldElement.ref,
    oldElement._self,
    oldElement._source,
    oldElement._owner,
    oldElement.props,
  );

  return newElement;

看起来很容易扩展,但没有导出 ReactElement :]

...但看起来refkey 和修剪过的道具可以复制/传递(通过配置)到createElement。检查是否足够。

【讨论】:

我检查过,这里:github.com/facebook/react/blob/master/packages/react/src/…。我没有办法移除道具,因此是这个问题。我将检查手动操作 ref/key,即使这是我想避免的。【参考方案2】:

我们是这样解决的

const  propToRemove, ...childProps  = child.props
const filteredChild =  ...child, props: childProps 

return React.cloneElement(filteredChild, additionalProps)

【讨论】:

【参考方案3】:

使用 JSX 非常简单(在 Children.map() 函数中):

const  filtered, ...rest  = child.props
const clone = <child.type key=child.key ref=child.ref ...rest />

【讨论】:

【参考方案4】:

您可以将元素道具复制到另一个对象并删除新对象中不需要的道具

const removeUnknownPropWithClone = (el) => 
  const props =  ...el.props 
  delete props['unknownProps']
  return React.cloneElement(el, props)
;

【讨论】:

传递给 cloneElement 的道具被合并到 el.props 中,所以unknownProp 仍然存在。

以上是关于从克隆的 React 组件中删除一个道具的主要内容,如果未能解决你的问题,请参考以下文章

React.Js 将道具从组件传递到 NavBar 组件?

Typescript & React:在组件之间传递道具与默认道具

如何使用链接(react-router)将道具从一个页面传递到类组件

React-Router-Dom v5.2 ,无法从父级收到的道具中将道具传递给子组件

React Typescript 类组件默认道具接口

一种从外部调用 React 组件方法的方法(使用它的状态和道具)