vue vue3 手写 动态加载组件

效果展示

一、需求背景:

# vue3 项目涉及很多图表加载、表格加载 #考虑手写一个动态加载组件

二、实现思路

通过一个加载状态变量,通过v-if判断,加载状态的变量等于哪一个,动态加载组件内部就显示的哪一块组件。

三、实现效果

四、代码

(一)、封装组件

<template>
  <view class="loadding_contaniers" v-if="loadState == 1">
    <view class="loading_img">
      <image src="@/static/images/smartCabin/loadingImg/isLoading_bg.png" />
    </view>
    <view class="imgTitle">加载中<text id="dot">...</text></view>
  </view>
  <view class="loadding_contaniers" v-else-if="loadState == 2">
    <view class="loading_img">
      <image src="@/static/images/smartCabin/loadingImg/isErr_bg.png" />
    </view>
    <view class="imgTitle">请求失败,请重新加载!</view>
  </view>
  <view class="loadding_contaniers" v-else-if="loadState == 3">
    <view class="loading_img">
      <image src="@/static/images/smartCabin/loadingImg/isNone_bg.png" />
      <!-- <image
        :src="
          getAssetsFile(
            props.noticeTip == '暂无数据'
              ? `smartCabin/loadingImg/isNone_bg.png`
              : `smartCabin/loadingImg/isErr_bg2.png`
          )
        "
      /> -->
    </view>
    <view class="imgTitle">{{ noticeTip }}</view>
  </view>
  <view class="loadding_sucess" v-else>
    <slot> </slot>
  </view>
</template>

<script>
export default {
  props: {
    // 1:加载中 2:加载失败 3:暂无数据 4:加载成功
    loadState: Number,
    noticeTip: {
      type: String,
      default: "暂无数据",
    },
  },
};
</script>

<style lang="scss">
.loadding_contaniers {
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  .loading_img {
    image {
      width: 260rpx;
      height: 260rpx;
    }
  }
  .imgTitle {
    flex: 1;
    height: 0;
    color: #757575;
    #dot {
      display: inline-block;
      width: 1.5em;
      vertical-align: bottom;
      overflow: hidden;
      animation: dotting 0.5s infinite step-start;
    }
    @keyframes dotting {
      0% {
        width: 0;
        margin-right: 1.5em;
      }
      33% {
        width: 0.5em;
        margin-right: 1em;
      }
      66% {
        width: 1em;
        margin-right: 0.5em;
      }
      100% {
        width: 1.5em;
        margin-right: 0;
      }
    }
  }
}
.loadding_sucess {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}
</style>

 (二)、组件传参

h5使用

<LoaddING :loadState="4" :noticeTip="'当loadState是成功的时候'">
   <view class="myContent">
      <image
        src="@/static/images/energy/elePower/receiving_power.png"
      />
   </view>
</LoaddING>

web端使用 

<LoaddING :loadState="data.isFinish" :noticeTip="data.isTips">
              <!-- 插槽组件 -->
              <ewClickLine
                :yAxisUnit="echartData2.unit"
                :seriesColor="echartData2.color"
                :legend="{ show: true, x: '80%' }"
                :seriesName="echartData2.name"
                :seriesType="echartData2.chartSeriesType"
                :xAxisValue="echartData2.lineXAxisValue"
                :nums="echartData2.lineNums"
              ></ewClickLine>
</LoaddING>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值