Last active
March 27, 2024 10:06
-
-
Save dandelany/1ff06f4fa1f8d6f89c5e to your computer and use it in GitHub Desktop.
Recursively cloning React children
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var RecursiveChildComponent = React.createClass({ | |
render() { | |
return <div> | |
{this.recursiveCloneChildren(this.props.children)} | |
</div> | |
}, | |
recursiveCloneChildren(children) { | |
return React.Children.map(children, child => { | |
if(!_.isObject(child)) return child; | |
var childProps = {someNew: "propToAdd"}; | |
childProps.children = this.recursiveCloneChildren(child.props.children); | |
return React.cloneElement(child, childProps); | |
}) | |
} | |
}) |
Fantastic, was working on an issue like this for a while!
recursiveCloneChildren(children) {
return React.Children.map(children, (child) => {
if (!React.isValidElement(child)) return child;
const props = { ...{ className: '' }, ...child.props };
let childProps = {};
if (React.isValidElement(child) && !props.className.includes('exclude-node')) {
childProps = {
show: this.state.show,
toggle: this.toggle,
};
}
childProps.children = this.recursiveCloneChildren(child.props.children);
return React.cloneElement(child, childProps);
});
}
if you have SVG icon beneath your elements. this could be helpful.
This helped me to no end. Legends the lot of you!
Recursive cloning React children in Typescript
Use case: A form has a global Enable/Disable switch which should make all the elements in the form disabled.
function recursiveCloneChildren(children: React.ReactElement[], newProps: any) {
return React.Children.map(children, (child: React.ReactElement) => {
if (!React.isValidElement(child)) {
return child
}
// Eg. String has no props
if (child.props) {
// @ts-ignore
childProps.children = recursiveCloneChildren(child.props.children, newProps);
return React.cloneElement(child, newProps);
}
return child;
});
}
In usage you need to change type.
render() {
...
{ recursiveCloneChildren(children as React.ReactElement[], { disabled: true }) }
...
}
Recursive cloning React children in Typescript
Use case: A form has a global Enable/Disable switch which should make all the elements in the form disabled.
function recursiveCloneChildren(children: React.ReactElement[], newProps: any) { return React.Children.map(children, (child: React.ReactElement) => { if (!React.isValidElement(child)) { return child } // Eg. String has no props if (child.props) { // @ts-ignore childProps.children = recursiveCloneChildren(child.props.children, newProps); return React.cloneElement(child, newProps); } return child; }); }In usage you need to change type.
render() { ... { recursiveCloneChildren(children as React.ReactElement[], { disabled: true }) } ... }
childProps????? maybe newProps !!!
What if a child component has no children, but returns a tree, and you want to recursively clone / modify the returned tree?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Great stuff. Thanks!