在typescript + vue-class-component的语法下如何实现组件递归(recursive)

本文档记录了一位开发者在尝试使用typescript+vue-class-component实现递归组件时遇到的问题。在开发环境中,递归组件能够正常显示,但在生产环境中递归子组件不显示。问题的症结在于缺少了@Component装饰器中的'name'属性,通过添加该属性并指定为'dicomitems',成功解决了生产环境下的显示问题。
摘要由CSDN通过智能技术生成

      为了实现递归显示某种类似树形结构的数据,我调研了下vue的技术,主要是使用递归组件的方法,即在组件内部又去调用自己,查了下网上网友的代码,找到的都是传统的js写法,如下图所示:

 <template>
   <div class="dicom-items">
     <div v-if="dicomItems && dicomItems.length > 0">
         <el-row  v-if="depth ==0" class="dicomItemHeader" >
           <div class="dicomTag">Tag</div> 
           <div class="dicomName" >Name</div> 
           <div class="dicomValue">Value</div>
        </el-row>
        <div v-for="(item,i) in dicomItems" v-bind:key="'item_'+i">
           <el-row class="dicomItem" >
           <div class="dicomTag">
                <span v-if="depth>0">&gt;</span>
               <a :href="dicomDictLink(item.Tag)" target="_blank">{{item.Tag}}</a>
           </div> 
           <div class="dicomName smallscrollbar">{{item.Name}}</div> 
           <div class="dicomValue smallscrollbar">{{item.Value}}</div>
           </el-row>
           <el-row v-if="item.Sequence && item.Sequence.length > 0">
                 <dicomitems :itemList="item.Sequence" :depth="depth+1" >  </dicomitems>
           </el-row> 
        </div>
     </div>
   </div>
</template>
<script lang="ts">
export default {
   name : "dicomitems",
   props: {
     itemList : Array ,
     depth : Number
   },
   data : (): any => {
     return {
            dicomItems : []
        }
   },    
   watch: {
     itemList : function(val: any):void {
      console.log(`itemList.length=${val.length}`);
      (this as any).dicomItems = val;
     }
   },
   mounted: function():void {
      console.log(`itemList.length=${(this as any).itemList.length}`);
      (this as any).dicomItems = (this as any).itemList;
   },
   methods: {
      dicomDictLink: (tag: string):string => 
     {
      return "https://dicom.innolitics.com/ciods/";
     }
   }
}

</script>

    后来,我替换采用typescript + vue-class-component写法时发现出现问题,即第一层的数据都可以正常显示,但递归的子组件没有任何显示 (注:使用npm run serve进行调试时可以正常显示,但一旦npm run build部署到生产环境就不显示),代码如下所示

 <template>
   <div class="dicom-items">
     <div v-if="dicomItems && dicomItems.length > 0">
         <el-row  v-if="depth ==0" class="dicomItemHeader" >
           <div class="dicomTag">Tag</div> 
           <div class="dicomName" >Name</div> 
           <div class="dicomValue">Value</div>
        </el-row>
        <div v-for="(item,i) in dicomItems" v-bind:key="'item_'+i">
           <el-row class="dicomItem" >
           <div class="dicomTag">
                <span v-if="depth>0">&gt;</span>
               <a :href="dicomDictLink(item.Tag)" target="_blank">{{item.Tag}}</a>
           </div> 
           <div class="dicomName smallscrollbar">{{item.Name}}</div> 
           <div class="dicomValue smallscrollbar">{{item.Value}}</div>
           </el-row>
           <el-row v-if="item.Sequence && item.Sequence.length > 0">
                 <dicomitems :itemList="item.Sequence" :depth="depth+1" >  </dicomitems>
           </el-row> 
        </div>
     </div>
   </div>
</template>
<script lang="ts">
import { Component, Prop, Vue,Watch } from 'vue-property-decorator';

@Component
export default class DicomItems extends Vue{
 @Prop({}) itemList!:[]
 @Prop({}) depth!: number
 
dicomItems = []

@Watch("itemList")
onItemListChange(newVal:[], oldVal:[]) {
   console.log(`itemList.length=${newVal.length}`);
   (this as any).dicomItems = newVal;
 }

 mounted():void {
      //debugger;
      console.log(`itemList.length=${this.itemList.length}`);
      this.dicomItems = this.itemList;
   }

 dicomDictLink(tag: string):string { 
      return "https://dicom.innolitics.com/ciods/";
 }

}

</script>

  经过排查后,问题解决,关键点在name, 代码如下

@Component({name:"dicomitems"})
export default class DicomItems extends Vue
......

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值