Skip to content

Commit ad765ac

Browse files
committed
add a new option to control element comparison (#1007)
1 parent 7e49a91 commit ad765ac

File tree

4 files changed

+26
-5
lines changed

4 files changed

+26
-5
lines changed

src/options.js

+11
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,17 @@ export default {
1818
*/
1919
//vnode(vnode) { }
2020

21+
/**
22+
* Compares two Components
23+
* @param {Component} component1 First Component to compare
24+
* @param {Component} component2 Second Component to compare
25+
* @returns Boolean, true if components are equal
26+
*/
27+
areComponentsEqual(component1, component2) {
28+
// default implementation is 4x times faster than optional object property access
29+
return component1 === component2;
30+
}
31+
2132
/** Hook invoked after a component is mounted. */
2233
// afterMount(component) { }
2334

src/vdom/component.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { SYNC_RENDER, NO_RENDER, FORCE_RENDER, ASYNC_RENDER, ATTR_KEY } from '..
22
import options from '../options';
33
import { extend } from '../util';
44
import { enqueueRender } from '../render-queue';
5-
import { getNodeProps } from './index';
5+
import { areComponentsEqual, getNodeProps } from './index';
66
import { diff, mounts, diffLevel, flushMounts, recollectNodeTree, removeChildren } from './diff';
77
import { createComponent, collectComponent } from './component-recycler';
88
import { removeNode } from '../dom/index';
@@ -212,11 +212,11 @@ export function buildComponentFromVNode(dom, vnode, context, mountAll) {
212212
let c = dom && dom._component,
213213
originalComponent = c,
214214
oldDom = dom,
215-
isDirectOwner = c && dom._componentConstructor===vnode.nodeName,
215+
isDirectOwner = c && areComponentsEqual(dom._componentConstructor, vnode.nodeName),
216216
isOwner = isDirectOwner,
217217
props = getNodeProps(vnode);
218218
while (c && !isOwner && (c=c._parentComponent)) {
219-
isOwner = c.constructor===vnode.nodeName;
219+
isOwner = areComponentsEqual(c.constructor, vnode.nodeName);
220220
}
221221

222222
if (c && isOwner && (!mountAll || c._component)) {

src/vdom/diff.js

-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ export function flushMounts() {
2929
}
3030
}
3131

32-
3332
/**
3433
* Apply differences in a given vnode (and it's deep children) to a real DOM Node.
3534
* @param {Element} [dom=null] A DOM node to mutate into the shape of the `vnode`

src/vdom/index.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
import { extend } from '../util';
2+
import options from '../options';
23

4+
/**
5+
* Checks that two components are equal
6+
* @param {Component} component1 First component to compare
7+
* @param {Component} component2 Second component to compare
8+
* @return {boolean}
9+
* @private
10+
*/
11+
export function areComponentsEqual(component1, component2) {
12+
return options.areComponentsEqual(component1, component2);
13+
}
314

415
/**
516
* Check if two nodes are equivalent.
@@ -16,7 +27,7 @@ export function isSameNodeType(node, vnode, hydrating) {
1627
if (typeof vnode.nodeName==='string') {
1728
return !node._componentConstructor && isNamedNode(node, vnode.nodeName);
1829
}
19-
return hydrating || node._componentConstructor===vnode.nodeName;
30+
return hydrating || areComponentsEqual(node._componentConstructor, vnode.nodeName);
2031
}
2132

2233

0 commit comments

Comments
 (0)