diff --git a/packages/designer/src/builtin-simulator/create-simulator.ts b/packages/designer/src/builtin-simulator/create-simulator.ts
index 15ab3507b..57369efd8 100644
--- a/packages/designer/src/builtin-simulator/create-simulator.ts
+++ b/packages/designer/src/builtin-simulator/create-simulator.ts
@@ -56,12 +56,13 @@ export function createSimulator(
}
const id = asset.id ? ` data-id="${asset.id}"` : '';
const lv = asset.level || level || AssetLevel.Environment;
+ const scriptType = asset.scriptType ? ` type="${asset.scriptType}"` : '';
if (asset.type === AssetType.JSUrl) {
scripts[lv].push(
- ``,
+ ``,
);
} else if (asset.type === AssetType.JSText) {
- scripts[lv].push(``);
+ scripts[lv].push(``);
} else if (asset.type === AssetType.CSSUrl) {
styles[lv].push(
``,
diff --git a/packages/designer/src/component-actions.ts b/packages/designer/src/component-actions.ts
index 76ead7d9a..57ad30bf2 100644
--- a/packages/designer/src/component-actions.ts
+++ b/packages/designer/src/component-actions.ts
@@ -10,6 +10,14 @@ import {
} from './icons';
import { componentDefaults, legacyIssues } from './transducers';
+function deduplicateRef(node: IPublicModelNode | null | undefined) {
+ const currentRef = node?.getPropValue('ref');
+ if (currentRef) {
+ node?.setPropValue('ref', `${node.componentName.toLowerCase()}-${Math.random().toString(36).slice(2, 9)}`);
+ }
+ node?.children?.forEach(deduplicateRef);
+}
+
export class ComponentActions {
private metadataTransducers: IPublicTypeMetadataTransducer[] = [];
@@ -53,6 +61,7 @@ export class ComponentActions {
const { document: doc, parent, index } = node;
if (parent) {
const newNode = doc?.insertNode(parent, node, (index ?? 0) + 1, true);
+ deduplicateRef(newNode);
newNode?.select();
const { isRGL, rglNode } = node?.getRGL();
if (isRGL) {
diff --git a/packages/renderer-core/src/hoc/index.tsx b/packages/renderer-core/src/hoc/index.tsx
index aae03045e..3e7f5ec6a 100644
--- a/packages/renderer-core/src/hoc/index.tsx
+++ b/packages/renderer-core/src/hoc/index.tsx
@@ -2,7 +2,12 @@ import { cloneEnumerableProperty } from '@alilc/lowcode-utils';
import adapter from '../adapter';
import { IBaseRendererInstance, IRendererProps } from '../types';
-function patchDidCatch(Comp: any, { baseRenderer }: { baseRenderer: IBaseRendererInstance }) {
+interface Options {
+ baseRenderer: IBaseRendererInstance;
+ schema: any;
+}
+
+function patchDidCatch(Comp: any, { baseRenderer }: Options) {
if (Comp.patchedCatch) {
return;
}
@@ -44,7 +49,9 @@ function patchDidCatch(Comp: any, { baseRenderer }: { baseRenderer: IBaseRendere
}
}
-export function compWrapper(Comp: any, options: { baseRenderer: IBaseRendererInstance }) {
+const cache = new Map();
+
+export function compWrapper(Comp: any, options: Options) {
const { createElement, Component, forwardRef } = adapter.getRuntime();
if (
Comp?.prototype?.isReactComponent || // react
@@ -54,6 +61,11 @@ export function compWrapper(Comp: any, options: { baseRenderer: IBaseRendererIns
patchDidCatch(Comp, options);
return Comp;
}
+
+ if (cache.has(options.schema.id)) {
+ return cache.get(options.schema.id);
+ }
+
class Wrapper extends Component {
render() {
return createElement(Comp, { ...this.props, ref: this.props.forwardRef });
@@ -63,10 +75,14 @@ export function compWrapper(Comp: any, options: { baseRenderer: IBaseRendererIns
patchDidCatch(Wrapper, options);
- return cloneEnumerableProperty(
+ const WrapperComponent = cloneEnumerableProperty(
forwardRef((props: any, ref: any) => {
return createElement(Wrapper, { ...props, forwardRef: ref });
}),
Comp,
);
+
+ cache.set(options.schema.id, WrapperComponent);
+
+ return WrapperComponent;
}
diff --git a/packages/renderer-core/src/renderer/base.tsx b/packages/renderer-core/src/renderer/base.tsx
index 2ed476b1c..7b9562fcc 100644
--- a/packages/renderer-core/src/renderer/base.tsx
+++ b/packages/renderer-core/src/renderer/base.tsx
@@ -615,7 +615,7 @@ export default function baseRendererFactory(): IBaseRenderComponent {
});
});
- Comp = compWrapper(Comp, { baseRenderer: this });
+ Comp = compWrapper(Comp, { baseRenderer: this, schema });
components[schema.componentName] = Comp;
otherProps.ref = (ref: any) => {
diff --git a/packages/types/src/assets.ts b/packages/types/src/assets.ts
index 852ed0038..f0e6d3539 100644
--- a/packages/types/src/assets.ts
+++ b/packages/types/src/assets.ts
@@ -38,6 +38,7 @@ export interface AssetItem {
device?: string;
level?: AssetLevel;
id?: string;
+ scriptType?: string;
}
export type AssetList = Array;