在开发大型管理系统或低代码平台时,常常会遇到如下需求:
orderId
)save(orderId)
)orderId
)ref
调用子组件的方法(如 save()
)
:动态渲染组件defineAsyncComponent
:按需异步加载组件
:缓存组件状态defineExpose
:暴露子组件方法供父组件调用ref
数组:管理多个子组件实例引用src/
├── components/
│ ├── PageA.vue
│ ├── PageB.vue
│ └── PageC.vue
├── views/
│ └── HomeView.vue
├── utils/
│ └── componentMap.js
└── App.vue
// componentMap.js
export const componentMap = {
'node1': 'PageA',
'node2': 'PageB',
'node3': 'PageC'
}
当前订单号:{{ orderId }}
其他组件类似。
缓存组件
function toggleSelection(node) {
const index = selectedNodes.value.findIndex(n => n.id === node.id)
if (index === -1) {
selectedNodes.value.push(node)
loadComponent(node)
} else {
selectedNodes.value.splice(index, 1)
removeComponent(node)
}
}
function loadComponent(node) {
const componentName = componentMap[node.id]
if (components[componentName]) {
loadedComponents.value.push({
id: node.id,
label: node.label,
component: defineAsyncComponent(components[componentName]),
orderId: `ORDER_${node.id.toUpperCase()}`
})
}
}
save()
方法async function saveAll() {
for (let i = 0; i < componentRefs.value.length; i++) {
const comp = componentRefs.value[i]
if (comp && comp.save) {
await comp.save(loadedComponents.value[i].orderId)
}
}
}
区域 | 内容 |
---|---|
左侧树 | 多个节点,支持点击选择 |
右侧内容 | 每个选中节点对应一个子组件,显示订单号 |
底部按钮 | “保存全部”按钮,调用所有子组件的 save() |
功能 | 实现方式 |
---|---|
动态加载组件 | 使用
|
异步加载 | 使用 defineAsyncComponent() |
传递参数 | 使用 props |
获取组件实例 | 使用 ref 和 setComponentRef() |
调用子组件方法 | 使用 ref.value.save() |
缓存组件状态 | 使用
|
生命周期钩子 | onActivated() / onDeactivated() |
v-show
控制显隐通过 Vue 3 提供的强大特性,我们可以轻松实现复杂的动态组件加载、状态缓存和跨层级通信。本文提供了一套完整的解决方案,适用于企业级后台系统、低代码编辑器、配置中心等场景。
如果你正在构建一个多标签页、模块化管理系统的项目,这套方案将非常实用!