问题情景
直接上代码!
<template>
<div>
<div v-if="type==1">
<chart-a></chart-a>
</div>
<div v-if="type==2">
<chart-b></chart-b>
</div>
<div v-if="type==3">
<chart-c></chart-c>
</div>
<div v-if="type==4">
<chart-d></chart-d>
</div>
</div>
</template>
import ChartA from 'pathA';
import ChartB from 'pathB';
import ChartC from 'pathC';
import ChartD from 'pathD';
export default {
components:[ChartA,ChartB,ChartC,ChartD]
}
诸如上述的情况,当一些逻辑相近的条件渲染,如根据type值做不同组件的显示。当条件越来越多,以后需要引入更多类似charta,chartb这样的组件时,整个模板代码片段就会越来越冗余,解决方法是通过监听type值的变化,动态注册组件,然后在做组件的渲染
dynamicComponent方法
dynamicComponent方法(){
var CHART_DICT = {
1:ChartA,
2:ChartB,
3:ChartC,
4:ChartD
}
if(this.type && CHART_DICT[this.type]){
Vue.component('Chart', CHART_DICT[this.type]);
}
}
方法实现了根据type的值来动态注册对应的组件,如1对chartA,并且统一命名为chart.这种用法也可以给chart组件传递数据
注:该方法应在type被赋值或改变之后执行,否则可能会提示未注册组件的报错
template写法更新
<template>
<div v-if="type">
<chart></chart>
</div>
</template>