08335 / hivui-platform-template
hivui平台项目模板
Newer
Older
hivui-platform-template / project / hivuiMain / views / layout / components / tabpanel / panel.vue
<template>
  <div class="pl-tabs-panel" :title="title" v-show="active" >
      <div class="pl-loading pl-loading-fixed" v-show="url&&!loaded" ref="dom-loader">
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
      </div>
      <iframe v-if="!hasUrl" :src="url" @load="handleIframeLoad" :name="'iframe'+name" ref="iframe"></iframe>
      <slot v-if="hasUrl"></slot>
  </div>
</template>

<script>
export default {
    name:'PTabpanel',
    props:{
        close:[String,Number,Boolean],
        itemData:Object,
        title:{
            type:String,
            default:""
        },
        name:{
            type:[String,Number],
            default:""
        },
        url:{
            type:[String],
            default:""
        },
        index:[String,Number]
    },
    data(){
        return {
            loaded: false,
            loadTimer: null
        }
    },
    computed:{
        active(){
            const active = this.$parent.currentName === this.name;
            return active;
        },
        // ✅ hasUrl改为计算属性
        hasUrl(){
            return this.url == null || this.url == ''
        }
    },
    watch:{
        active(val){
            if(val && this.url){
                this.loaded = false;
                this.resetLoadTimer();
            }
        },
        // url发生变化,重置加载状态
        url(){
            if(this.active){
                this.loaded = false;
                this.resetLoadTimer();
            }
        }
    },
    updated() {
        this.$parent.$emit('tab-nav-update');
    },
    beforeDestroy(){
        this.clearTimer();
    },
    methods:{
        clearTimer(){
            if(this.loadTimer){
                clearTimeout(this.loadTimer);
                this.loadTimer = null;
            }
        },
        resetLoadTimer(){
            this.clearTimer();
            this.loadTimer = setTimeout(()=>{
                this.loaded = true;
            },12000)
        },
        handleIframeLoad(evt){
            // iframe正常触发load,清除定时器,结束loading
            this.clearTimer();
            this.loaded=true;
            this.$emit('onIframeLoad',this,evt);
        }
    }
}
</script>