diff options
Diffstat (limited to 'preact/src/clone-element.js')
-rw-r--r-- | preact/src/clone-element.js | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/preact/src/clone-element.js b/preact/src/clone-element.js new file mode 100644 index 0000000..4cff226 --- /dev/null +++ b/preact/src/clone-element.js @@ -0,0 +1,34 @@ +import { assign, slice } from './util'; +import { createVNode } from './create-element'; + +/** + * Clones the given VNode, optionally adding attributes/props and replacing its children. + * @param {import('./internal').VNode} vnode The virtual DOM element to clone + * @param {object} props Attributes/props to add when cloning + * @param {Array<import('./internal').ComponentChildren>} rest Any additional arguments will be used as replacement children. + * @returns {import('./internal').VNode} + */ +export function cloneElement(vnode, props, children) { + let normalizedProps = assign({}, vnode.props), + key, + ref, + i; + for (i in props) { + if (i == 'key') key = props[i]; + else if (i == 'ref') ref = props[i]; + else normalizedProps[i] = props[i]; + } + + if (arguments.length > 2) { + normalizedProps.children = + arguments.length > 3 ? slice.call(arguments, 2) : children; + } + + return createVNode( + vnode.type, + normalizedProps, + key || vnode.key, + ref || vnode.ref, + null + ); +} |