test: 渲染器应用深度监听当入参发生变化时重新渲染组件
This commit is contained in:
		
							parent
							
								
									2df2e3cffb
								
							
						
					
					
						commit
						a64433e57b
					
				| @ -266,26 +266,32 @@ const setupWujiePropsWatcher = () => { | ||||
|       // 更新快照 | ||||
|       prevPropsSnapshot = currentPropsSnapshot; | ||||
| 
 | ||||
|       // 更新 initParams | ||||
|       const newParams = window.$wujie.props as WujieProps; | ||||
|       // 获取当前的 props,并确保创建新的对象引用 | ||||
|       const newProps = JSON.parse(currentPropsSnapshot); | ||||
|       const oldParams = initParams.value; | ||||
| 
 | ||||
|       // 更新参数 | ||||
|       initParams.value = newParams; | ||||
|       // 创建新的引用,确保子组件能检测到变化 | ||||
|       initParams.value = { | ||||
|         ...newProps, | ||||
|         _timestamp: Date.now(), // 添加时间戳确保每次更新都是新对象 | ||||
|       }; | ||||
| 
 | ||||
|       console.log('initParams', initParams.value); | ||||
|       console.log('initParams 已更新为新对象:', initParams.value); | ||||
| 
 | ||||
|       // 如果核心参数发生变化,重新加载组件 | ||||
|       if ( | ||||
|         isValidParams(newParams) && | ||||
|         (oldParams?.fileId !== newParams.fileId || | ||||
|           oldParams?.projectId !== newParams.projectId) | ||||
|         isValidParams(initParams.value) && | ||||
|         (oldParams?.fileId !== initParams.value.fileId || | ||||
|           oldParams?.projectId !== initParams.value.projectId) | ||||
|       ) { | ||||
|         console.log('核心参数发生变化,重新加载组件'); | ||||
|         reloadComponent(); | ||||
|       } else { | ||||
|         // 即使没有重新加载组件,也需要强制更新渲染器 | ||||
|         forceUpdateRenderer(); | ||||
|       } | ||||
|     } | ||||
|   }, 300); // 每300ms检查一次,避免过于频繁 | ||||
|   }, 300); | ||||
| 
 | ||||
|   // 组件卸载时清除定时器 | ||||
|   onBeforeUnmount(() => { | ||||
| @ -293,6 +299,25 @@ const setupWujiePropsWatcher = () => { | ||||
|   }); | ||||
| }; | ||||
| 
 | ||||
| // 添加一个方法强制更新渲染器 | ||||
| const forceUpdateRenderer = () => { | ||||
|   if (renderer.value && typeof renderer.value.update === 'function') { | ||||
|     // 如果渲染器组件提供了 update 方法,调用它 | ||||
|     console.log('调用渲染器的 update 方法'); | ||||
|     renderer.value.update(initParams.value); | ||||
|   } else { | ||||
|     // 尝试通过临时移除并重新添加组件来强制刷新 | ||||
|     console.log('强制刷新渲染器组件'); | ||||
|     const temp = renderer.value; | ||||
|     renderer.value = null; | ||||
| 
 | ||||
|     // 在下一个周期重新设置组件,强制重新渲染 | ||||
|     setTimeout(() => { | ||||
|       renderer.value = temp; | ||||
|     }, 0); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // 重新加载组件的函数 | ||||
| const reloadComponent = async () => { | ||||
|   if (!isValidParams(initParams.value)) { | ||||
| @ -383,8 +408,10 @@ onMounted(async () => { | ||||
| 
 | ||||
| <template> | ||||
|   <div class="renderer-container"> | ||||
|     <renderer | ||||
|     <component | ||||
|       :is="renderer" | ||||
|       v-if="renderer" | ||||
|       :key="initParams?._timestamp || 'default'" | ||||
|       :ctx-props="initParams" | ||||
|       v-bind="initParams" | ||||
|       style="width: 100%; height: 100%" | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 wangxuefeng
						wangxuefeng