From 3d8502d8ccfc85d709dd37a9344f148fda77467f Mon Sep 17 00:00:00 2001 From: * <8> Date: Wed, 26 Jan 2022 14:40:21 +0800 Subject: [PATCH 1/5] Match-id-75c2d0560e7b4ee729267dae97f85520e426bf6b --- libs/horizon/src/dom/utils/DomCreator.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libs/horizon/src/dom/utils/DomCreator.ts b/libs/horizon/src/dom/utils/DomCreator.ts index 360aea81..9d89ef5f 100644 --- a/libs/horizon/src/dom/utils/DomCreator.ts +++ b/libs/horizon/src/dom/utils/DomCreator.ts @@ -5,6 +5,13 @@ export const NSS = { svg: 'http://www.w3.org/2000/svg', }; +const div = document.createElement('div'); +const span = document.createElement('span'); +const tr = document.createElement('tr'); +const td = document.createElement('td'); +const a = document.createElement('a'); +const p = document.createElement('p'); + // 创建DOM元素 export function createDom( tagName: string, @@ -16,6 +23,18 @@ export function createDom( if (ns !== NSS.html) { dom = document.createElementNS(ns, tagName); + } else if (tagName === 'div') { + dom = div.cloneNode(false); + } else if (tagName === 'span') { + dom = span.cloneNode(false); + } else if (tagName === 'tr') { + dom = tr.cloneNode(false); + } else if (tagName === 'td') { + dom = td.cloneNode(false); + } else if (tagName === 'a') { + dom = a.cloneNode(false); + } else if (tagName === 'p') { + dom = p.cloneNode(false); } else { dom = document.createElement(tagName); } From d074f507fb4915cc8ea40bdf30ae4aa076813fb6 Mon Sep 17 00:00:00 2001 From: * <8> Date: Wed, 26 Jan 2022 14:40:54 +0800 Subject: [PATCH 2/5] Match-id-10b63a2cc012a3a05fb8c502131856090e0315b4 --- libs/horizon/src/renderer/vnode/VNodeFlags.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/libs/horizon/src/renderer/vnode/VNodeFlags.ts b/libs/horizon/src/renderer/vnode/VNodeFlags.ts index f511ac85..494d93fa 100644 --- a/libs/horizon/src/renderer/vnode/VNodeFlags.ts +++ b/libs/horizon/src/renderer/vnode/VNodeFlags.ts @@ -39,14 +39,15 @@ export class FlagUtils { }); } static hasAnyFlag(node: VNode) { // 有标志位 - let keyFlag = false; - FlagArr.forEach(key => { - if (node.flags[key]) { - keyFlag = true; - return; + const flags = node.flags; + const arrLength = FlagArr.length; + for(let i = 0; i < arrLength; i++) { + const key = FlagArr[i]; + if (flags[key]) { + return true; } - }); - return keyFlag; + } + return false; } static setNoFlags(node: VNode) { From d8f6349c31e1f5bbb356bbfca949452b71548bc8 Mon Sep 17 00:00:00 2001 From: * <8> Date: Wed, 26 Jan 2022 14:53:01 +0800 Subject: [PATCH 3/5] Match-id-ebfb7eb1a6693fb72c23d8ba7798ee6f1ba9772d --- .../horizon/src/event/customEvents/CustomBaseEvent.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/libs/horizon/src/event/customEvents/CustomBaseEvent.ts b/libs/horizon/src/event/customEvents/CustomBaseEvent.ts index d4595d31..7e73fb16 100644 --- a/libs/horizon/src/event/customEvents/CustomBaseEvent.ts +++ b/libs/horizon/src/event/customEvents/CustomBaseEvent.ts @@ -110,9 +110,12 @@ function extendAttribute(target, source) { 'deltaX', 'deltaY', 'deltaZ', 'deltaMode', ]; - attributes.forEach(attr => { - if (typeof source[attr] !== 'undefined') { - if (typeof source[attr] === 'function') { + const length = attributes.length; + for (let i = 0; i < length; i++) { + const attr = attributes[i]; + const type = source[attr]; + if (type !== 'undefined') { + if (type === 'function') { target[attr] = function() { return source[attr].apply(source, arguments); }; @@ -120,5 +123,5 @@ function extendAttribute(target, source) { target[attr] = source[attr]; } } - }) + } } From fdc7a831d179707c86acc5d9fe8c098bd8ef81be Mon Sep 17 00:00:00 2001 From: * <8> Date: Wed, 26 Jan 2022 14:53:36 +0800 Subject: [PATCH 4/5] Match-id-2a52349292593a758f5be74be4ea3f24ef9a5509 --- .../src/dom/DOMPropertiesHandler/DOMPropertiesHandler.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/horizon/src/dom/DOMPropertiesHandler/DOMPropertiesHandler.ts b/libs/horizon/src/dom/DOMPropertiesHandler/DOMPropertiesHandler.ts index 3d5f7d36..da668f60 100644 --- a/libs/horizon/src/dom/DOMPropertiesHandler/DOMPropertiesHandler.ts +++ b/libs/horizon/src/dom/DOMPropertiesHandler/DOMPropertiesHandler.ts @@ -44,8 +44,10 @@ function updateOneProp(dom, propName, propVal, isNativeTag, isInit?: boolean) { } else if (propName === 'dangerouslySetInnerHTML') { dom.innerHTML = propVal.__html; } else if (propName === 'children') { // 只处理纯文本子节点,其他children在VNode树中处理 - if (typeof propVal === 'string' || typeof propVal === 'number') { - dom.textContent = String(propVal); + if (typeof propVal === 'string') { + dom.textContent = propVal; + } else if (typeof propVal === 'number') { + dom.textContent = propVal + ''; // 这种数字转字符串的方式效率最高 } } else if (isEventProp(propName)) { // 事件监听属性处理 From 42ad304f524a1b567ed22136e43da03ee511af07 Mon Sep 17 00:00:00 2001 From: * <8> Date: Wed, 26 Jan 2022 16:51:22 +0800 Subject: [PATCH 5/5] Match-id-49b2c6ccbd0cc263e411bbca72854bd2f69bbb73 --- libs/horizon/src/external/JSXElement.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/libs/horizon/src/external/JSXElement.ts b/libs/horizon/src/external/JSXElement.ts index f0218ac9..5c379dce 100644 --- a/libs/horizon/src/external/JSXElement.ts +++ b/libs/horizon/src/external/JSXElement.ts @@ -37,7 +37,7 @@ function mergeDefault(sourceObj, defaultObj) { }); } -function buildElement(isClone, type, setting, ...children) { +function buildElement(isClone, type, setting, children) { // setting中的值优先级最高,clone情况下从 type 中取值,创建情况下直接赋值为 null const key = (setting && setting.key !== undefined) ? String(setting.key) : (isClone ? type.key : null); const ref = (setting && setting.ref !== undefined) ? setting.ref : (isClone ? type.ref : null); @@ -45,11 +45,14 @@ function buildElement(isClone, type, setting, ...children) { let vNode = isClone ? type.belongClassVNode : getProcessingClassVNode(); if (setting != null) { - Object.keys(setting).forEach(k => { + const keys = Object.keys(setting); + const keyLength = keys.length; + for(let i = 0; i < keyLength; i++) { + const k = keys[i]; if (isValidKey(k)) { props[k] = setting[k]; } - }); + } if (setting.ref !== undefined && isClone) { vNode = getProcessingClassVNode(); } @@ -69,11 +72,11 @@ function buildElement(isClone, type, setting, ...children) { // 创建Element结构体,供JSX编译时调用 export function createElement(type, setting, ...children) { - return buildElement(false, type, setting, ...children); + return buildElement(false, type, setting, children); } export function cloneElement(element, setting, ...children) { - return buildElement(true, element, setting, ...children); + return buildElement(true, element, setting, children); } // 检测结构体是否为合法的Element