expect(cloned2).toEqual(node2)
expect(cloneVNode(node2)).toEqual(node2)
expect(cloneVNode(node2)).toEqual(cloned2)
+
+ // #1041 should use reoslved key/ref
+ expect(cloneVNode(createVNode('div', { key: 1 })).key).toBe(1)
+ expect(cloneVNode(createVNode('div', { key: 1 }), { key: 2 }).key).toBe(2)
+ expect(cloneVNode(createVNode('div'), { key: 2 }).key).toBe(2)
+
+ // ref normalizes to [currentRenderingInstance, ref]
+ expect(cloneVNode(createVNode('div', { ref: 'foo' })).ref).toEqual([
+ null,
+ 'foo'
+ ])
+ expect(
+ cloneVNode(createVNode('div', { ref: 'foo' }), { ref: 'bar' }).ref
+ ).toEqual([null, 'bar'])
+ expect(cloneVNode(createVNode('div'), { ref: 'bar' }).ref).toEqual([
+ null,
+ 'bar'
+ ])
})
describe('mergeProps', () => {
_isVNode: true,
type,
props,
- key: props && props.key !== undefined ? props.key : null,
+ key: props && props.key != null ? props.key : null,
ref:
- props && props.ref !== undefined
+ props && props.ref != null
? [currentRenderingInstance!, props.ref]
: null,
scopeId: currentScopeId,
vnode: VNode<T, U>,
extraProps?: Data & VNodeProps
): VNode<T, U> {
+ const props = (extraProps
+ ? vnode.props
+ ? mergeProps(vnode.props, extraProps)
+ : extend({}, extraProps)
+ : vnode.props) as any
// This is intentionally NOT using spread or extend to avoid the runtime
// key enumeration cost.
return {
_isVNode: true,
type: vnode.type,
- props: extraProps
- ? vnode.props
- ? mergeProps(vnode.props, extraProps)
- : extend({}, extraProps)
- : vnode.props,
- key: vnode.key,
- ref: vnode.ref,
+ props,
+ key: props && props.key != null ? props.key : null,
+ ref:
+ props && props.ref != null
+ ? isArray(props.ref)
+ ? props.ref
+ : [currentRenderingInstance!, props.ref]
+ : null,
scopeId: vnode.scopeId,
children: vnode.children,
target: vnode.target,