51 lines
1.2 KiB
JavaScript
51 lines
1.2 KiB
JavaScript
import { clone, isString, isFunction, toLowerCase } from '../util';
|
|
import { isFunctionalComponent } from './functional-component';
|
|
|
|
|
|
/** Check if two nodes are equivalent.
|
|
* @param {Element} node
|
|
* @param {VNode} vnode
|
|
* @private
|
|
*/
|
|
export function isSameNodeType(node, vnode) {
|
|
if (isString(vnode)) {
|
|
return node instanceof Text;
|
|
}
|
|
if (isString(vnode.nodeName)) {
|
|
return isNamedNode(node, vnode.nodeName);
|
|
}
|
|
if (isFunction(vnode.nodeName)) {
|
|
return node._componentConstructor===vnode.nodeName || isFunctionalComponent(vnode);
|
|
}
|
|
}
|
|
|
|
|
|
export function isNamedNode(node, nodeName) {
|
|
return node.normalizedNodeName===nodeName || toLowerCase(node.nodeName)===toLowerCase(nodeName);
|
|
}
|
|
|
|
|
|
/**
|
|
* Reconstruct Component-style `props` from a VNode.
|
|
* Ensures default/fallback values from `defaultProps`:
|
|
* Own-properties of `defaultProps` not present in `vnode.attributes` are added.
|
|
* @param {VNode} vnode
|
|
* @returns {Object} props
|
|
*/
|
|
export function getNodeProps(vnode) {
|
|
let defaultProps = vnode.nodeName.defaultProps,
|
|
props = clone(vnode.attributes);
|
|
|
|
if (defaultProps) {
|
|
for (let i in defaultProps) {
|
|
if (props[i]===undefined) {
|
|
props[i] = defaultProps[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (vnode.children) props.children = vnode.children;
|
|
|
|
return props;
|
|
}
|