fix: 修复配置最小渲染单元组件的子组件会出现输入卡顿问题

This commit is contained in:
liujuping 2022-02-23 16:29:46 +08:00
parent a10b2423ea
commit fb749d7a04

View File

@ -2,6 +2,7 @@ import { BuiltinSimulatorHost, Node, PropChangeOptions } from '@ali/lowcode-desi
import { GlobalEvent, TransformStage } from '@ali/lowcode-types'; import { GlobalEvent, TransformStage } from '@ali/lowcode-types';
import { isReactComponent, cloneEnumerableProperty } from '@ali/lowcode-utils'; import { isReactComponent, cloneEnumerableProperty } from '@ali/lowcode-utils';
import { EngineOptions } from '@ali/lowcode-editor-core'; import { EngineOptions } from '@ali/lowcode-editor-core';
import { debounce } from '../utils/common';
import adapter from '../adapter'; import adapter from '../adapter';
import * as types from '../types/index'; import * as types from '../types/index';
@ -267,15 +268,17 @@ export function leafWrapper(Comp: types.IBaseRenderer, {
singleRender?: boolean; singleRender?: boolean;
}; };
shouldRenderSingleNode(): boolean { judgeMiniUnitRender() {
if (!this.renderUnitInfo) { if (!this.renderUnitInfo) {
this.getRenderUnitInfo(); this.getRenderUnitInfo();
} }
const renderUnitInfo = this.renderUnitInfo; const renderUnitInfo = this.renderUnitInfo || {
singleRender: true,
};
if (renderUnitInfo.singleRender) { if (renderUnitInfo.singleRender) {
return true; return;
} }
const ref = cache.ref.get(renderUnitInfo.minimalUnitId); const ref = cache.ref.get(renderUnitInfo.minimalUnitId);
@ -283,29 +286,32 @@ export function leafWrapper(Comp: types.IBaseRenderer, {
if (!ref) { if (!ref) {
__debug('Cant find minimalRenderUnit ref! This make rerender!'); __debug('Cant find minimalRenderUnit ref! This make rerender!');
container.rerender(); container.rerender();
return false; return;
} }
__debug(`${this.leaf?.componentName}(${this.props.componentId}) need render, make its minimalRenderUnit ${renderUnitInfo.minimalUnitName}(${renderUnitInfo.minimalUnitId})`); __debug(`${this.leaf?.componentName}(${this.props.componentId}) need render, make its minimalRenderUnit ${renderUnitInfo.minimalUnitName}(${renderUnitInfo.minimalUnitId})`);
ref.makeUnitRender(); ref.makeUnitRender();
return false;
} }
getRenderUnitInfo(leaf = this.leaf) { getRenderUnitInfo(leaf = this.leaf) {
if (leaf?.isRoot()) { // leaf 在低代码组件中存在 mock 的情况,退出最小渲染单元判断
if (!leaf || typeof leaf.isRoot !== 'function') {
return;
}
if (leaf.isRoot()) {
this.renderUnitInfo = { this.renderUnitInfo = {
singleRender: true, singleRender: true,
...(this.renderUnitInfo || {}), ...(this.renderUnitInfo || {}),
}; };
} }
if (leaf?.componentMeta.isMinimalRenderUnit) { if (leaf.componentMeta.isMinimalRenderUnit) {
this.renderUnitInfo = { this.renderUnitInfo = {
minimalUnitId: leaf.id, minimalUnitId: leaf.id,
minimalUnitName: leaf.componentName, minimalUnitName: leaf.componentName,
singleRender: false, singleRender: false,
}; };
} }
if (leaf?.hasLoop()) { if (leaf.hasLoop()) {
// 含有循环配置的元素,父元素是最小渲染单元 // 含有循环配置的元素,父元素是最小渲染单元
this.renderUnitInfo = { this.renderUnitInfo = {
minimalUnitId: leaf?.parent?.id, minimalUnitId: leaf?.parent?.id,
@ -313,12 +319,13 @@ export function leafWrapper(Comp: types.IBaseRenderer, {
singleRender: false, singleRender: false,
}; };
} }
if (leaf?.parent) { if (leaf.parent) {
this.getRenderUnitInfo(leaf.parent); this.getRenderUnitInfo(leaf.parent);
} }
} }
makeUnitRender = () => { // 最小渲染单元做防抖处理
makeUnitRenderDebounced = debounce(() => {
this.beforeRender(RerenderType.MinimalRenderUnit); this.beforeRender(RerenderType.MinimalRenderUnit);
const nextProps = getProps(this.leaf?.export?.(TransformStage.Render) as types.ISchema, scope, Comp, componentInfo); const nextProps = getProps(this.leaf?.export?.(TransformStage.Render) as types.ISchema, scope, Comp, componentInfo);
const children = getChildren(this.leaf?.export?.(TransformStage.Render) as types.ISchema, scope, Comp); const children = getChildren(this.leaf?.export?.(TransformStage.Render) as types.ISchema, scope, Comp);
@ -333,6 +340,10 @@ export function leafWrapper(Comp: types.IBaseRenderer, {
__debug(`${this.leaf?.componentName}(${this.props.componentId}) MinimalRenderUnit Render!`); __debug(`${this.leaf?.componentName}(${this.props.componentId}) MinimalRenderUnit Render!`);
this.setState(nextState); this.setState(nextState);
}, 20);
makeUnitRender = () => {
this.makeUnitRenderDebounced();
}; };
componentWillReceiveProps(nextProps: any) { componentWillReceiveProps(nextProps: any) {
@ -376,9 +387,6 @@ export function leafWrapper(Comp: types.IBaseRenderer, {
cache.component.delete(componentCacheId); cache.component.delete(componentCacheId);
return; return;
} }
if (!this.shouldRenderSingleNode()) {
return;
}
this.beforeRender(RerenderType.PropsChanged); this.beforeRender(RerenderType.PropsChanged);
const state = this.state; const state = this.state;
const nodeCacheProps = state.nodeCacheProps; const nodeCacheProps = state.nodeCacheProps;
@ -397,6 +405,8 @@ export function leafWrapper(Comp: types.IBaseRenderer, {
nodeProps, nodeProps,
nodeCacheProps, nodeCacheProps,
}); });
this.judgeMiniUnitRender();
}); });
dispose && this.disposeFunctions.push(dispose); dispose && this.disposeFunctions.push(dispose);
@ -411,15 +421,12 @@ export function leafWrapper(Comp: types.IBaseRenderer, {
return; return;
} }
if (!this.shouldRenderSingleNode()) {
return;
}
__debug(`${leaf?.componentName}[${this.props.componentId}] component trigger onVisibleChange(${flag}) event`); __debug(`${leaf?.componentName}[${this.props.componentId}] component trigger onVisibleChange(${flag}) event`);
this.beforeRender(RerenderType.VisibleChanged); this.beforeRender(RerenderType.VisibleChanged);
this.setState({ this.setState({
visible: flag, visible: flag,
}); });
this.judgeMiniUnitRender();
}); });
dispose && this.disposeFunctions.push(dispose); dispose && this.disposeFunctions.push(dispose);
@ -434,9 +441,6 @@ export function leafWrapper(Comp: types.IBaseRenderer, {
type, type,
node, node,
} = param || {}; } = param || {};
if (!this.shouldRenderSingleNode()) {
return;
}
this.beforeRender(`${RerenderType.ChildChanged}-${type}`, node); this.beforeRender(`${RerenderType.ChildChanged}-${type}`, node);
// TODO: 缓存同级其他元素的 children。 // TODO: 缓存同级其他元素的 children。
// 缓存二级 children Next 查询筛选组件有问题 // 缓存二级 children Next 查询筛选组件有问题
@ -448,6 +452,7 @@ export function leafWrapper(Comp: types.IBaseRenderer, {
childrenInState: true, childrenInState: true,
}); });
}); });
this.judgeMiniUnitRender();
dispose && this.disposeFunctions.push(dispose); dispose && this.disposeFunctions.push(dispose);
} }