diff --git a/libs/horizon/src/dom/DOMPropertiesHandler/DOMPropertiesHandler.ts b/libs/horizon/src/dom/DOMPropertiesHandler/DOMPropertiesHandler.ts index 5ec79c33..482a15a9 100644 --- a/libs/horizon/src/dom/DOMPropertiesHandler/DOMPropertiesHandler.ts +++ b/libs/horizon/src/dom/DOMPropertiesHandler/DOMPropertiesHandler.ts @@ -14,8 +14,11 @@ function updateOneProp(dom, propName, isNativeTag, propVal?, 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); + const type = typeof propVal; + if (type === 'string') { + dom.textContent = propVal; + } else if (type === 'number') { + dom.textContent = propVal + ''; // 这种数字转字符串的方式效率最高 } } else if (isEventProp(propName)) { // 事件监听属性处理 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); } diff --git a/libs/horizon/src/event/customEvents/CustomBaseEvent.ts b/libs/horizon/src/event/customEvents/CustomBaseEvent.ts index 5ea40d96..e58b91c4 100644 --- a/libs/horizon/src/event/customEvents/CustomBaseEvent.ts +++ b/libs/horizon/src/event/customEvents/CustomBaseEvent.ts @@ -34,9 +34,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); }; @@ -44,7 +47,7 @@ function extendAttribute(target, source) { target[attr] = source[attr]; } } - }) + } } export class CustomBaseEvent { diff --git a/libs/horizon/src/external/JSXElement.ts b/libs/horizon/src/external/JSXElement.ts index 9a06a957..2a138387 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 diff --git a/libs/horizon/src/renderer/ErrorHandler.ts b/libs/horizon/src/renderer/ErrorHandler.ts index db190048..3c3305c1 100644 --- a/libs/horizon/src/renderer/ErrorHandler.ts +++ b/libs/horizon/src/renderer/ErrorHandler.ts @@ -134,7 +134,7 @@ function triggerUpdate(vNode, state) { const root = updateShouldUpdateOfTree(vNode); if (root !== null) { - tryRenderRoot(root); + tryRenderFromRoot(root); } } 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) {