Javascript 从部件上拆下支柱

Javascript 从部件上拆下支柱,javascript,reactjs,Javascript,Reactjs,目标:我需要对React组件进行一些后处理,这包括移除一些道具。我试图使用passing{propToRemove:undefined}作为第二个参数,但是这个prop没有被删除,只是设置为undefined。我可以使用,但根据文档,这将丢失refs,这是一个严重的缺点 一个做作的示例没有做任何有用的事情,只是为了测试: const removeUnknownPropWithClone = (el) => { return React.cloneElement(el, {unknown

目标:我需要对React组件进行一些后处理,这包括移除一些道具。我试图使用passing
{propToRemove:undefined}
作为第二个参数,但是这个prop没有被删除,只是设置为
undefined
。我可以使用,但根据文档,这将丢失
ref
s,这是一个严重的缺点

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

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

const App = (props) => 
  removeUnknownPropWithClone(
    <div unknownProp="1">Hello</div>
  );
const removeUnknownPropWithClone=(el)=>{
return React.cloneElement(el,{unknownProp:undefined})
};
常量应用=(道具)=>
用克隆删除未知的复制(
你好
);
这将显示错误消息:“React无法识别DOM元素上的
unknownProp
prop”。实际上,道具设置为
未定义
,但它仍然存在。我需要完全移除它

(打开控制台以查看错误消息)

相关问题(但未在此处回答):


相关源代码:

有时查看源代码是很好的;)

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

但往高处看,我们可以看到:

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

  return newElement;
}
看起来易于扩展,但未导出元素:]


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

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

const removeUnknownPropWithClone = (el) => {
  const props = { ...el.props }
  delete props['unknownProps']
  return React.cloneElement(el, props)
};
JSX非常简单(在
Children.map()函数中):

const{filtered,…rest}=child.props
常数克隆=
我们就是这样解决的

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

return React.cloneElement(filteredChild, additionalProps)

看看你是否能找到一些灵感?谢谢,@DamianSimonPeter,我写了,甚至写了一些评论:)是的,我认为错误似乎有点简单,我可能错了。DOM元素中不应该有“unknownProp=1”。我想这就是你的错误的原因
是的,当然,这是一个人为的例子,我会给这个问题添加一个注释。我希望处理过程删除正在其他地方使用的道具。传递给cloneElement的道具将合并到el.Props中,因此
unknownProp
仍将存在。我检查了,这里:。我看不到拆除道具的方法,因此提出了这个问题。我将检查ref/key的手动操作,即使这是我想要避免的。
const { propToRemove, ...childProps } = child.props
const filteredChild = { ...child, props: childProps }

return React.cloneElement(filteredChild, additionalProps)