Match-id-fcb41f29c2d0ac83e94d1822a856dd5d45b3c9db

This commit is contained in:
* 2022-08-04 18:57:21 +08:00 committed by *
parent 8bf49d834e
commit 558678d27b
4 changed files with 29 additions and 30 deletions

View File

@ -1,6 +1,6 @@
import {TYPE_COMMON_ELEMENT} from './JSXElementType';
import {getProcessingClassVNode} from '../renderer/GlobalVar';
import { TYPE_COMMON_ELEMENT } from './JSXElementType';
import { getProcessingClassVNode } from '../renderer/GlobalVar';
import { Source } from '../renderer/Types';
/**
* vtype element
@ -9,7 +9,7 @@ import {getProcessingClassVNode} from '../renderer/GlobalVar';
* ref ref属性
* props
*/
export function JSXElement(type, key, ref, vNode, props, source) {
export function JSXElement(type, key, ref, vNode, props, source: Source | null) {
return {
// 元素标识符
vtype: TYPE_COMMON_ELEMENT,
@ -27,12 +27,7 @@ export function JSXElement(type, key, ref, vNode, props, source) {
}
function isValidKey(key) {
const keyArray = [
'key',
'ref',
'__source',
'__self',
];
const keyArray = ['key', 'ref', '__source', '__self'];
return !keyArray.includes(key);
}
@ -46,9 +41,9 @@ function mergeDefault(sourceObj, defaultObj) {
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);
const props = isClone ? {...type.props} : {};
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;
const props = isClone ? { ...type.props } : {};
let vNode = isClone ? type.belongClassVNode : getProcessingClassVNode();
if (setting !== null && setting !== undefined) {
@ -73,8 +68,15 @@ function buildElement(isClone, type, setting, children) {
if (element && element.defaultProps) {
mergeDefault(props, element.defaultProps);
}
let src: Source | null = null;
if (setting?.__source) {
src = {
fileName: setting.__source.fileName,
lineNumber: setting.__source.lineNumber,
};
}
return JSXElement(element, key, ref, vNode, props, setting?.__source ?? null);
return JSXElement(element, key, ref, vNode, props, src);
}
// 创建Element结构体供JSX编译时调用

View File

@ -59,7 +59,6 @@ export interface SuspenseState {
}
export type Source = {
columnNumber: number;
fileName: string;
lineNumber: number;
};

View File

@ -1,21 +1,19 @@
import type {VNode} from '../Types';
import type { Source, VNode } from '../Types';
import {mergeDefaultProps} from './LazyComponent';
import {updateVNode, onlyUpdateChildVNodes, createFragmentVNode, createUndeterminedVNode} from '../vnode/VNodeCreator';
import {shallowCompare} from '../utils/compare';
import { mergeDefaultProps } from './LazyComponent';
import {
TYPE_FRAGMENT,
TYPE_PROFILER,
TYPE_STRICT_MODE,
} from '../../external/JSXElementType';
updateVNode,
onlyUpdateChildVNodes,
createFragmentVNode,
createUndeterminedVNode,
} from '../vnode/VNodeCreator';
import { shallowCompare } from '../utils/compare';
import { TYPE_FRAGMENT, TYPE_PROFILER, TYPE_STRICT_MODE } from '../../external/JSXElementType';
import { markVNodePath } from '../utils/vNodePath';
export function bubbleRender() {}
export function captureMemoComponent(
processing: VNode,
shouldUpdate: boolean,
): VNode | null {
export function captureMemoComponent(processing: VNode, shouldUpdate: boolean): VNode | null {
const Component = processing.type;
// 合并 函数组件或类组件 的defaultProps
const newProps = mergeDefaultProps(Component, processing.props);
@ -26,7 +24,7 @@ export function captureMemoComponent(
if (type === TYPE_STRICT_MODE || type === TYPE_FRAGMENT || type === TYPE_PROFILER) {
newChild = createFragmentVNode(null, newProps.children);
} else {
newChild = createUndeterminedVNode(type, null, newProps,processing.src);
newChild = createUndeterminedVNode(type, null, newProps, processing.src);
}
newChild.parent = processing;
newChild.ref = processing.ref;

View File

@ -27,7 +27,7 @@ import {
TYPE_SUSPENSE,
} from '../../external/JSXElementType';
import { VNode } from './VNode';
import { JSXElement } from '../Types';
import { JSXElement, Source } from '../Types';
import { markVNodePath } from '../utils/vNodePath';
const typeLazyMap = {
@ -105,7 +105,7 @@ export function createPortalVNode(portal) {
return vNode;
}
export function createUndeterminedVNode(type, key, props, source) {
export function createUndeterminedVNode(type, key, props, source: Source | null): VNode {
let vNodeTag = FunctionComponent;
let isLazy = false;
const componentType = typeof type;