+ {visible.map((placement) => {
+ if (!isPluginRegistered(placement.pluginId)) {
+ return (
+
+ 未注册插件:{placement.pluginId}
+
+ );
+ }
+ const manifest = REGISTRY[placement.pluginId];
+ if (!manifest) {
+ return null;
+ }
+ const pluginProps: PluginProps = {
+ instanceId: `${placement.pluginId}-${slotName}-${placement.sortOrder}`,
+ role,
+ user: {
+ id: userId,
+ name: user.name,
+ email: user.email,
+ dataScope: user.dataScope,
+ },
+ slot: {
+ name: slotName,
+ layoutId,
+ size: parseSizeJson(placement.sizeJson),
+ },
+ props: parsePropsJson(placement.propsJson),
+ };
+ return (
+
+ );
+ })}
+
+ );
+}
+
+/** Slot 加载态占位(layout 切换瞬间) */
+export function SlotSkeleton({ count = 1 }: { count?: number }): ReactNode {
+ return (
+