mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2026-01-19 22:58:15 +00:00
fix: 修复配置最小渲染单元组件的子组件会出现输入卡顿问题
This commit is contained in:
parent
a10b2423ea
commit
fb749d7a04
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user