Match-id-512f37017e5b961d1e1fda10ea7176284f4acaf7

This commit is contained in:
* 2022-02-17 14:09:07 +08:00 committed by *
parent 3c1a4bc02a
commit fcd3a54a1a
1 changed files with 11 additions and 15 deletions

View File

@ -14,13 +14,9 @@ import {
TreeRoot,
} from '../renderer/vnode/VNodeTags';
const prefix = '_horizon';
const internalKeys = {
VNode: `${prefix}VNode`,
props: `${prefix}Props`,
nonDelegatedEvents: `${prefix}NonDelegatedEvents`,
};
const INTERNAL_VNODE = '_horizon_VNode';
const INTERNAL_PROPS = '_horizon_Props';
const INTERNAL_NONDELEGATEEVENTS = '_horizon_NonDelegatedEvents';
// 通过 VNode 实例获取 DOM 节点
export function getDom(vNode: VNode): Element | Text | null {
@ -36,12 +32,12 @@ export function saveVNode(
vNode: VNode,
dom: Element | Text | Container,
): void {
dom[internalKeys.VNode] = vNode;
dom[INTERNAL_VNODE] = vNode;
}
// 用 DOM 节点,来找其对应的 VNode 实例
export function getVNode(dom: Node|Container): VNode | null {
const vNode = dom[internalKeys.VNode] || (dom as Container)._treeRoot;
const vNode = dom[INTERNAL_VNODE] || (dom as Container)._treeRoot;
if (vNode) {
const {tag} = vNode;
if (tag === DomComponent || tag === DomText || tag === TreeRoot) {
@ -53,7 +49,7 @@ export function getVNode(dom: Node|Container): VNode | null {
// 用 DOM 对象,来寻找其对应或者说是最近父级的 vNode
export function getNearestVNode(dom: Node): null | VNode {
let vNode = dom[internalKeys.VNode];
let vNode = dom[INTERNAL_VNODE];
if (vNode) { // 如果是已经被框架标记过的 DOM 节点,那么直接返回其 VNode 实例
return vNode;
}
@ -62,7 +58,7 @@ export function getNearestVNode(dom: Node): null | VNode {
let parentDom = dom.parentNode;
let nearVNode = null;
while (parentDom) {
vNode = parentDom[internalKeys.VNode];
vNode = parentDom[INTERNAL_VNODE];
if (vNode) {
nearVNode = vNode;
break;
@ -74,19 +70,19 @@ export function getNearestVNode(dom: Node): null | VNode {
// 获取 vNode 上的属性相关信息
export function getVNodeProps(dom: Element | Text): Props | null{
return dom[internalKeys.props] || null;
return dom[INTERNAL_PROPS] || null;
}
// 将 DOM 属性相关信息挂到 DOM 对象的特定属性上
export function updateVNodeProps(dom: Element | Text, props: Props): void {
dom[internalKeys.props] = props;
dom[INTERNAL_PROPS] = props;
}
export function getNonDelegatedListenerMap(dom: Element | Text): Map<string, EventListener> {
let eventsMap = dom[internalKeys.nonDelegatedEvents];
let eventsMap = dom[INTERNAL_NONDELEGATEEVENTS];
if (!eventsMap) {
eventsMap = new Map();
dom[internalKeys.nonDelegatedEvents] = eventsMap;
dom[INTERNAL_NONDELEGATEEVENTS] = eventsMap;
}
return eventsMap;
}