chore: 渲染器定时查询 wujieProps 确认是否修改了入参
This commit is contained in:
parent
cf1fab8c58
commit
99b207ec59
@ -1,7 +1,13 @@
|
||||
<script setup lang="ts">
|
||||
import type { AxiosInterceptorManager, AxiosResponse } from 'axios';
|
||||
|
||||
import { getCurrentInstance, onMounted, ref, watch } from 'vue';
|
||||
import {
|
||||
getCurrentInstance,
|
||||
onBeforeUnmount,
|
||||
onMounted,
|
||||
ref,
|
||||
watch,
|
||||
} from 'vue';
|
||||
|
||||
import { useQuery } from '@tanstack/vue-query';
|
||||
import { jsonp, request } from '@vtj/utils';
|
||||
@ -237,6 +243,97 @@ const notifyParent = (event: string, data?: any) => {
|
||||
}
|
||||
};
|
||||
|
||||
// 添加一个函数来检测 wujie props 的变化并更新 initParams
|
||||
const setupWujiePropsWatcher = () => {
|
||||
if (!isWujieSubApp) return;
|
||||
|
||||
// 获取当前 props 的快照
|
||||
let prevPropsSnapshot = window.$wujie?.props
|
||||
? JSON.stringify(window.$wujie.props)
|
||||
: null;
|
||||
|
||||
// 设置定时器定期检查 props 变化
|
||||
const intervalId = setInterval(() => {
|
||||
if (!window.$wujie?.props) return;
|
||||
|
||||
// 获取最新的 props 并序列化
|
||||
const currentPropsSnapshot = JSON.stringify(window.$wujie.props);
|
||||
|
||||
// 比较是否发生变化
|
||||
if (currentPropsSnapshot !== prevPropsSnapshot) {
|
||||
console.log('检测到 wujie props 变化:', window.$wujie.props);
|
||||
|
||||
// 更新快照
|
||||
prevPropsSnapshot = currentPropsSnapshot;
|
||||
|
||||
// 更新 initParams
|
||||
const newParams = window.$wujie.props as WujieProps;
|
||||
const oldParams = initParams.value;
|
||||
|
||||
// 更新参数
|
||||
initParams.value = newParams;
|
||||
|
||||
// 如果核心参数发生变化,重新加载组件
|
||||
if (
|
||||
isValidParams(newParams) &&
|
||||
(oldParams?.fileId !== newParams.fileId ||
|
||||
oldParams?.projectId !== newParams.projectId)
|
||||
) {
|
||||
console.log('核心参数发生变化,重新加载组件');
|
||||
reloadComponent();
|
||||
}
|
||||
}
|
||||
}, 300); // 每300ms检查一次,避免过于频繁
|
||||
|
||||
// 组件卸载时清除定时器
|
||||
onBeforeUnmount(() => {
|
||||
clearInterval(intervalId);
|
||||
});
|
||||
};
|
||||
|
||||
// 重新加载组件的函数
|
||||
const reloadComponent = async () => {
|
||||
if (!isValidParams(initParams.value)) {
|
||||
errorMessage.value = '缺少必要参数:fileId 和 projectId';
|
||||
if (isWujieSubApp) {
|
||||
notifyParent('render-fail', errorMessage.value);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
isLoading.value = true;
|
||||
showLoading('参数已更新,重新加载组件...');
|
||||
|
||||
try {
|
||||
// 如果需要,重置 provider 以强制重新初始化
|
||||
provider.value = null;
|
||||
|
||||
// 重新初始化低代码引擎
|
||||
await initLowCodeEngine();
|
||||
|
||||
// 获取新的渲染组件
|
||||
const component = await getRenderComponent();
|
||||
if (component) {
|
||||
renderer.value = component;
|
||||
if (isWujieSubApp) {
|
||||
notifyParent('render-success');
|
||||
}
|
||||
} else {
|
||||
if (isWujieSubApp) {
|
||||
notifyParent('render-fail', 'Failed to get component');
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('重新加载过程出错:', error);
|
||||
if (isWujieSubApp) {
|
||||
notifyParent('render-fail', error);
|
||||
}
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
hideLoading();
|
||||
}
|
||||
};
|
||||
|
||||
// 组件挂载后执行初始化
|
||||
onMounted(async () => {
|
||||
// 通知父应用已准备就绪(如果是wujie子应用)
|
||||
@ -244,7 +341,7 @@ onMounted(async () => {
|
||||
notifyParent('ready', 'y-code-renderer is ready');
|
||||
}
|
||||
|
||||
// 获取初始化参数 - 在挂载时执行一次
|
||||
// 获取初始化参数
|
||||
initParams.value = getInitParams();
|
||||
const paramsValid = isValidParams(initParams.value);
|
||||
|
||||
@ -264,6 +361,9 @@ onMounted(async () => {
|
||||
renderer.value = component;
|
||||
if (isWujieSubApp) {
|
||||
notifyParent('render-success');
|
||||
|
||||
// 设置 wujie props 监听器
|
||||
setupWujiePropsWatcher();
|
||||
}
|
||||
} else {
|
||||
if (isWujieSubApp) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@sy/wujie-vue3-renderer-adapter",
|
||||
"version": "1.0.0",
|
||||
"version": "1.0.1",
|
||||
"description": "wujie-vue3 ycode renderer adapter",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
@ -3,7 +3,7 @@ import type { AxiosInterceptorManager } from 'axios';
|
||||
|
||||
import type { Router, RouteRecordRaw } from 'vue-router';
|
||||
|
||||
import { computed, onBeforeUnmount, onMounted } from 'vue';
|
||||
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue';
|
||||
|
||||
import WujieVue from 'wujie-vue3';
|
||||
|
||||
@ -26,6 +26,7 @@ const props = withDefaults(
|
||||
projectId: number;
|
||||
route?: RouteRecordRaw;
|
||||
router?: Router;
|
||||
searchParams?: Record<string, any>;
|
||||
sync?: boolean;
|
||||
url?: string;
|
||||
}>(),
|
||||
@ -41,6 +42,7 @@ const props = withDefaults(
|
||||
route: undefined,
|
||||
// 默认不使用 router
|
||||
router: undefined,
|
||||
searchParams: () => ({}),
|
||||
sync: true,
|
||||
url: 'https://y-code-renderer.shiyue.com',
|
||||
},
|
||||
@ -62,6 +64,29 @@ const { bus } = WujieVue;
|
||||
// // InstanceofPlugin(),
|
||||
// ];
|
||||
|
||||
// 使用 ref 创建响应式的 subAppProps
|
||||
const subAppProps = ref({
|
||||
...props,
|
||||
adapterInfo: {
|
||||
version,
|
||||
},
|
||||
});
|
||||
|
||||
// 监听 props 的所有变化
|
||||
watch(
|
||||
() => ({ ...props }),
|
||||
(newProps) => {
|
||||
console.log('props 发生变化', newProps);
|
||||
subAppProps.value = {
|
||||
...newProps,
|
||||
adapterInfo: {
|
||||
version,
|
||||
},
|
||||
};
|
||||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
||||
// 生命周期钩子
|
||||
const beforeLoad = (appWindow: Window) => {
|
||||
console.log(`${props.name} 开始加载`, appWindow);
|
||||
@ -76,14 +101,6 @@ const handleMessage = (data: any) => {
|
||||
console.log(`${props.name} 收到子应用消息:`, data);
|
||||
};
|
||||
|
||||
// 准备传递给子应用的数据
|
||||
const subAppProps = {
|
||||
...props,
|
||||
adapterInfo: {
|
||||
version,
|
||||
},
|
||||
};
|
||||
|
||||
const finalUrl = computed(() => {
|
||||
return `${props.url}?fileId=${props.fileId}&projectId=${props.projectId}&applicationId=${props.applicationId}`;
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user