如何安全地将 props 注入 React children?
How to safely inject props into React children?
我正在构建一个 React 组件,它会延迟卸载其子项以便为它们设置动画。卸载时,我想传入一个额外的道具(例如,数据属性或 class 名称)以处理动画。
这是一般情况下的一个具体实例,我想覆盖子项的某些属性。我开始意识到以下模式完全符合我的要求:
this.props.children.map(child =>
<child.type key={child.key}
ref={child.ref}
{...child.props}
// add my props into children here
data-leaving={true} />)
我 return 一个具有相同类型和相同属性的新元素,而不是 return 子元素。然后我可以添加或删除我想要的任何道具!
然而,这是没有记录的,感觉很老套。我想知道这是否在任何情况下都可以安全使用。
请注意,我知道替代方案(例如,接受 return 子代而不是直接子代的函数)但这提供了迄今为止最方便的界面。
添加新道具或覆盖现有道具的最佳方式是映射您的子道具并使用 React.cloneElement
克隆每个元素。
阅读有关 react children 的好文章。
React.Children.map(this.props.children, child =>
React.cloneElement(child, { newProp: 'value', existingProp: 'value' }));
您也可以使用 children 作为函数。这样你也可以添加你的道具。
示例:
// Root Component
const Parent = () => {
const onClose = () => console.log('I am on Close Prop');
// Pass OnClose to children
return <MyComponent>{ children(onClose) }</MyComponent>
}
// MyComponent
const MyComponent = () => {
// Pass OnClose to children
return (
<div>
{/* children below */}
{(onClose) => (
<FormComponent
myNewProp={onClose}
/>
)}
</div>
);
}
我正在构建一个 React 组件,它会延迟卸载其子项以便为它们设置动画。卸载时,我想传入一个额外的道具(例如,数据属性或 class 名称)以处理动画。
这是一般情况下的一个具体实例,我想覆盖子项的某些属性。我开始意识到以下模式完全符合我的要求:
this.props.children.map(child =>
<child.type key={child.key}
ref={child.ref}
{...child.props}
// add my props into children here
data-leaving={true} />)
我 return 一个具有相同类型和相同属性的新元素,而不是 return 子元素。然后我可以添加或删除我想要的任何道具!
然而,这是没有记录的,感觉很老套。我想知道这是否在任何情况下都可以安全使用。
请注意,我知道替代方案(例如,接受 return 子代而不是直接子代的函数)但这提供了迄今为止最方便的界面。
添加新道具或覆盖现有道具的最佳方式是映射您的子道具并使用 React.cloneElement
克隆每个元素。
阅读有关 react children 的好文章。
React.Children.map(this.props.children, child =>
React.cloneElement(child, { newProp: 'value', existingProp: 'value' }));
您也可以使用 children 作为函数。这样你也可以添加你的道具。
示例:
// Root Component
const Parent = () => {
const onClose = () => console.log('I am on Close Prop');
// Pass OnClose to children
return <MyComponent>{ children(onClose) }</MyComponent>
}
// MyComponent
const MyComponent = () => {
// Pass OnClose to children
return (
<div>
{/* children below */}
{(onClose) => (
<FormComponent
myNewProp={onClose}
/>
)}
</div>
);
}