uni-app uni-ui插件新增骨架屏组件

发布于 1周前 作者 caililin 来自 Uni-App

uni-app uni-ui插件新增骨架屏组件

ni-ui新增骨架屏组件

1 回复

uni-app 中新增一个骨架屏组件到 uni-ui 插件库中,可以极大地提升用户体验,尤其是在数据加载较慢的情况下。以下是一个基本的骨架屏组件的实现示例,你可以根据实际需求进行调整和扩展。

首先,我们需要在 uni-ui 插件中新增一个骨架屏组件文件,例如 Skeleton.vue

<template>
  <view class="skeleton-wrapper" v-if="loading">
    <view class="skeleton-line" v-for="(item, index) in lines" :key="index" :style="getLineStyle(index)"></view>
  </view>
  <slot v-else></slot>
</template>

<script>
export default {
  name: 'UniSkeleton',
  props: {
    loading: {
      type: Boolean,
      default: true
    },
    lines: {
      type: Number,
      default: 3
    },
    lineWidth: {
      type: [String, Number],
      default: '100%'
    },
    lineHeight: {
      type: [String, Number],
      default: '20px'
    },
    animationDuration: {
      type: [String, Number],
      default: '1.5s'
    }
  },
  methods: {
    getLineStyle(index) {
      return {
        width: this.lineWidth,
        height: this.lineHeight,
        animation: `pulse ${this.animationDuration} infinite ease-in-out`
      };
    }
  }
};
</script>

<style scoped>
.skeleton-wrapper {
  position: relative;
  width: 100%;
}

.skeleton-line {
  background-color: #eee;
  margin-bottom: 8px;
  border-radius: 4px;
  opacity: 0.6;
}

@keyframes pulse {
  0% {
    opacity: 1;
  }
  50% {
    opacity: 0.4;
  }
  100% {
    opacity: 1;
  }
}
</style>

在这个组件中,我们通过 loading 属性控制骨架屏的显示与隐藏。lines 属性定义了骨架屏的行数,lineWidthlineHeight 分别定义了每行的宽度和高度。animationDuration 定义了骨架屏动画的持续时间。

接下来,你可以在你的 uni-app 项目中使用这个骨架屏组件。例如:

<template>
  <view>
    <uni-skeleton :loading="isLoading" :lines="5"></uni-skeleton>
    <view v-if="!isLoading">
      <!-- 实际内容 -->
      <text>真实数据</text>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      isLoading: true
    };
  },
  mounted() {
    setTimeout(() => {
      this.isLoading = false;
    }, 2000); // 模拟数据加载
  }
};
</script>

在这个例子中,当 isLoadingtrue 时,显示骨架屏;当数据加载完成后,将 isLoading 设置为 false,显示真实内容。你可以根据实际需求调整骨架屏的样式和行为。

回到顶部