Merge branch 'hotfix/rax-simulator' into 'release/1.0.63'

修复 Rax Simulator 的两个问题

1. Rax 模式下报错信息丢失的问题
2. 使用 rax v1.2.0 或更高版本时因为 `__parentInstance` 被压缩掉而导致无法选中组件的问题

See merge request !1360597
This commit is contained in:
力皓 2021-08-16 10:11:16 +08:00
commit e861c301c2
2 changed files with 32 additions and 4 deletions

View File

@ -410,7 +410,9 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer {
};
}
instance = Instance.get(dom);
while (instance && instance[INTERNAL]) {
let loopNum = 0; // 防止由于某种意外而导致死循环
while (instance && instance[INTERNAL] && loopNum < 1000) {
if (isValidDesignModeRaxComponentInstance(instance)) {
// if (instance && SYMBOL_VNID in instance) {
// const docId = (instance.props as any).schema.docId;
@ -422,7 +424,8 @@ export class SimulatorRendererContainer implements BuiltinSimulatorRenderer {
};
}
instance = instance[INTERNAL].__parentInstance;
instance = getRaxVDomParentInstance(instance);
loopNum += 1;
}
return null;
@ -636,4 +639,21 @@ function getLowCodeComponentProps(props: any) {
return newProps;
}
/**
* Rax VDOM
* Rax development __parentInstance
* production __parentInstance
* _internal ()
*/
function getRaxVDomParentInstance(instance: { _internal: any }) {
const internalInstance = instance._internal;
return internalInstance.__parentInstance ||
Object.values(internalInstance).find(v => (
v !== null &&
v !== instance &&
typeof v === 'object' &&
typeof (v as {_internal: unknown})._internal === 'object'
));
}
export default new SimulatorRendererContainer();

View File

@ -111,9 +111,17 @@ export default function rendererFactory() {
return;
}
SetComponent.patchedCatch = true;
SetComponent.getDerivedStateFromError = (error: Error) => {
return { engineRenderError: true, error };
// Rax 的 getDerivedStateFromError 有 BUG这里先用 componentDidCatch 来替代
// @see https://github.com/alibaba/rax/issues/2211
const originalDidCatch = SetComponent.prototype.componentDidCatch;
SetComponent.prototype.componentDidCatch = function didCatch(this: any, error: Error, errorInfo: any) {
this.setState({ engineRenderError: true, error });
if (originalDidCatch && typeof originalDidCatch === 'function') {
originalDidCatch.call(this, error, errorInfo);
}
};
const engine = this;
const originRender = SetComponent.prototype.render;
SetComponent.prototype.render = function () {