1. 概述
动态组件就是可以根据控件名称,动态的加载组件到页面,这个好处由很多,比如在表单设计器中,我们可以使用动态组件,对每一个组件设置不同的属性数据。这里有一个问题,就是每一个组件的属性都可能不相同,那么这个时候,就可以用上动态属性绑定了。
2. 实现方法
比如我们现在需要将 流程启动,流程审批,流程实例放到同一个页面。
这些组件都有不同的属性。
那么我们可以这样做:
<template>
<div class="formBox" style="width: 100%;height:100%;">
<component :is="currentView" v-bind="props"></component>
</div>
</template>
<script>
import Vue from "vue";
import userState from "@/assets/js/userState";
import {RxFit, Util} from "jpaas-common-lib";
import BpmInstApi from "@/api/bpm/core/bpmInst";
import BpmInstStart from "@/views/modules/bpm/core/BpmInstStart";
import BpmTaskStart from "@/views/modules/bpm/core/BpmTaskStart";
import BpmInstDetail from "@/views/modules/bpm/core/BpmInstDetail";
import RxLoading from "@/views/modules/bpm/workbench/RxLoading";
Vue.component(BpmInstStart.name,BpmInstStart);
Vue.component(BpmTaskStart.name,BpmTaskStart);
Vue.component(BpmInstDetail.name,BpmInstDetail);
Vue.component(RxLoading.name,RxLoading);
//打开文档的窗口
export default {
name: "OpenDoc",
mixins: [userState],
components:{
RxFit
},
data(){
return {
props:{},
currentView:"rx-loading",
actionMap:{
start:"bpm-inst-start",
startDraft:"bpm-inst-start",
task:"bpm-task-start",
detail:"bpm-task-start",
}
}
},
created() {
let params=this.$route.params;
BpmInstApi.getInfoByDefKeyInstId(params.defKey,params.instId).then(res=>{
if(!res.success){
this.$message.warn(res.message);
return;
}
this.currentView=this.actionMap[res.action];
if(res.action=="start" || res.action=="startDraft"){
this.props.config={defKey:params.defKey};
}
if(res.action=="startDraft" ){
this.props.instId= params.instId;
}
if(res.action=="task" ){
this.props.taskId= res.taskId;
this.props.instId= params.instId;
}
})
},
}
</script>
页面首先加载一个loading 组件,我们会根据实际的情况,当前到底是加载哪个组件。
这里最关键的代码在我们可以根据我们返回的信息,动态的构建 props 对像,并通过 v-bind 指令将属性绑定到组件上。这样就可以根据不同的组件,动态构建传入参数。
文档更新时间: 2022-03-27 16:09 作者:zyg