基于 vue-skeleton-webpack-plugin 的骨架屏实战

yizhihongxing

让我来详细讲解“基于 vue-skeleton-webpack-plugin 的骨架屏实战”的完整攻略。

简介

随着客户端应用的普及以及前端性能要求的不断提高,页面骨架屏方案得到了广泛的应用。Vue.js 作为目前最受欢迎的前端框架之一,也有很多骨架屏方案可供选择。在这里,我们以 vue-skeleton-webpack-plugin 为例,介绍使用骨架屏实现页面渲染优化的方法。

基本使用方法

  1. 安装插件

bash
npm i vue-skeleton-webpack-plugin --save-dev

  1. 修改 webpack 配置:

```js
const VueSkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin');

module.exports = {
// ...
plugins: [
new VueSkeletonWebpackPlugin({
webpackConfig: {
entry: {...}, // 指定骨架屏组件的入口文件
},
minimize: true, // 是否压缩 HTML 模板,默认为 true
quiet: true, // 是否开启日志输出,默认为 true
}),
],
// ...
}
```

  1. 编写骨架屏组件

在指定的骨架屏组件入口文件中,按照 vue 组件的方式编写骨架屏代码。例如:

```html

```

  1. 在需要使用骨架屏的页面中,通过 Skeleton 组件引入骨架屏组件:

```html

```

通过 Skeleton 包裹实际渲染组件,即可在组件渲染完成前显示出骨架屏,从而提升页面渲染体验。注意,在以上示例代码中我们需要将 Skeleton 和实际组件 MyComponent 都注册为 Vue 组件。

示例一

下面我们通过一个开源项目VueCnodeJS来演示如何使用vue-skeleton-webpack-plugin插件实现骨架屏效果。在这个项目中,我们将其首页(即话题列表页)作为实际页面,在这个页面中应用骨架屏。

安装 vue-skeleton-webpack-plugin

npm i vue-skeleton-webpack-plugin --save-dev

修改 webpack 配置

由于 VueCnodeJS 项目使用的是 vue-cli搭建的,因此我们可以通过在 package.json 中配置 vue 的 webpack 配置来修改 webpack 配置。具体操作如下:

  1. package.jsonvue 字段中添加 chainWebpack 函数,并在其中使用 vue-skeleton-webpack-plugin

```json
{
"vue": {
"chainWebpack": config => {
const VueSkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin');

     // 添加骨架屏 webpack 插件
     config.plugin('vue-skeleton-webpack-plugin').use(VueSkeletonWebpackPlugin, [
       {
         webpackConfig: {
           entry: require('path').resolve(__dirname, './src/skeleton/index.js'),
         },
         minimize: true,
         quiet: true,
       },
     ]);
   }
 }

}
```

webpackConfig.entry 表示使用骨架屏的组件所在的 JS 文件的路径。

  1. package.jsonscripts 字段中添加一个脚本命令,用于运行 VueCnodeJS 项目。

json
{
"scripts": {
"start": "vue-cli-service serve --open"
}
}

编写骨架屏组件

按照我们在“基本使用方法”章节中介绍的规范编写骨架屏组件,这里就不再赘述。

示例代码如下:

<template>
  <div class="skeleton">
    <div class="header">
      <div class="title"></div>
      <div class="switch">
        <div class="tab"></div>
        <div class="tab"></div>
      </div>
    </div>
    <div class="list">
      <div class="item" v-for="index in 10" :key="index">
        <div class="title"></div>
        <div class="info"></div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {};
  },
};
</script>

<style scoped>
/* 定义骨架屏样式 */
.header,
.list {
  background-color: #f0f0f0;
}

.title {
  height: 20px;
  margin-bottom: 20px;
  background-color: #f0f0f0;
}

.switch {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.tab {
  height: 36px;
  width: 48px;
  background-color: #f0f0f0;
}

.item {
  display: flex;
  align-items: center;
  margin-bottom: 10px;
  padding: 10px 0;
}

.info {
  height: 18px;
  width: 80%;
  margin-left: 10px;
  background-color: #f0f0f0;
}
</style>

引入骨架屏

我们在项目的 src/views/Home.vue 文件中引入骨架屏。具体操作如下:

  1. src/views/Home.vue 文件的顶部引入 Skeleton 组件和骨架屏组件。

```html

```

  1. src 目录下创建 skeleton 目录,并在其中创建 index.js 文件,作为骨架屏组件的入口文件。

```js
import Vue from 'vue';
import SkeletonComponent from './Skeleton.vue';

export default new Vue({
components: {
Skeleton: SkeletonComponent,
},
template: '',
});
```

运行项目

通过运行以下命令来启动 VueCnodeJS 项目:

npm run start

http://localhost:8080 查看效果。

示例二

下面我们再介绍一个场景,即当页面内有多个骨架屏时,如何处理骨架屏的数据传递问题。

在这个场景下,我们使用一个简单的例子来演示。假设我们有一个车辆列表页面,包含多个车辆信息项,每个车辆信息项的数据都需要异步加载。这时,我们可以使用骨架屏来优化页面的渲染效果。

实现思路

要实现这个效果,我们需要:

  1. 编写骨架屏组件;
  2. 在骨架屏组件内部,使用 props 传递异步加载数据的状态;
  3. 在组件渲染的时候,通过 v-ifv-show 控制骨架屏的显示和隐藏。

编写代码

编写父组件

假设我们在父组件中动态渲染了多个子组件,并异步加载了每个子组件的数据。我们需要在父组件中为每个子组件准备一个对应的骨架屏,以实现优化页面渲染效果的效果。

<template>
  <div>
    <CarItem v-for="(car, index) in carList" :key="index" :car="car" />
  </div>
</template>

<script>
import CarItem from '@/components/CarItem.vue';

export default {
  components: {
    CarItem,
  },
  data() {
    return {
      carList: [],
    };
  },
  created() {
    // 异步加载数据
  },
};
</script>

编写子组件

我们在子组件中使用 props 接收父组件传来的异步加载数据的状态,并使用 v-ifv-show 控制骨架屏和子组件的显示和隐藏。

<template>
  <div>
    <Skeleton v-if="!loaded" />
    <div v-show="loaded">
      <div class="car-name">{{ car.name }}</div>
      <div class="car-info">{{ car.info }}</div>
    </div>
  </div>
</template>

<script>
import Skeleton from './Skeleton.vue';

export default {
  props: {
    car: Object,
  },
  data() {
    return {
      loaded: false,
    };
  },
  mounted() {
    // 异步加载数据
  },
  methods: {
    // 异步加载数据
  },
  components: {
    Skeleton,
  },
};
</script>

编写骨架屏组件

骨架屏组件的编写方法与前面介绍的相似,这里就不再赘述了。

小结

通过前面的操作,我们将每个子组件和骨架屏进行关联,从而在同时优化页面渲染效果的情况下,实现异步加载数据的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于 vue-skeleton-webpack-plugin 的骨架屏实战 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue自定义指令用法经典实例小结

    下面是“vue自定义指令用法经典实例小结”的完整攻略: 什么是Vue自定义指令 Vue自定义指令是指Vue.js提供的一种扩展语法,通过它可以自定义具有特定功能的指令,例如自定义一个v-focus指令,用来设置DOM元素获得焦点,而不需要在Vue组件的methods中定义一堆逻辑代码。 Vue自定义指令的两种类型 Vue自定义指令分为两种类型: 全局指令:作…

    Vue 2023年5月27日
    00
  • 基于vue实现图片验证码倒计时60s功能

    要实现基于vue的图片验证码倒计时功能,我们可以按照以下步骤进行操作: 安装必要的依赖 首先,我们需要安装以下依赖: vue:用于构建用户界面的渐进式框架 vue-resource:用于发送http请求 vue-countdown:用于实现倒计时功能 可以使用以下命令进行依赖安装: npm install vue vue-resource vue-count…

    Vue 2023年5月29日
    00
  • 详解vue2.0的Element UI的表格table列时间戳格式化

    下面是详解vue2.0的Element UI的表格table列时间戳格式化的完整攻略。 1. 前言 Element UI是一款基于Vue.js 2.0的框架,它提供了丰富、灵活、高效的前端组件,其中表格(table)组件是应用非常广泛的一个组件,但是默认情况下,它的时间戳列(指Unix时间戳)显示的是毫秒数,不太友好。那么,我们该如何对Element UI的…

    Vue 2023年5月29日
    00
  • 分分钟玩转Vue.js组件(二)

    让我来详细讲解一下“分分钟玩转Vue.js组件(二)”的完整攻略。 简介 Vue.js 是一款非常流行的 JavaScript 库,用于构建用户界面。Vue.js 具有简单易学、轻量灵活、响应式渲染及组件化等特点, 非常适合构建现代化的 Web 应用程序。 本篇文章将带大家深入了解 Vue.js 中的组件化,在掌握基本概念后,教你如何使用 Vue.js 构建…

    Vue 2023年5月27日
    00
  • vue跳转页面打开新窗口,并携带与接收参数方式

    在Vue中,我们可以通过router实例和router-link标签来实现页面跳转。当需要在新窗口中打开一个页面并携带参数时,可以使用window.open方法和URLSearchParams对象来实现。 以下是其中一种实现方式的代码: <template> <!–使用router-link标签指定跳转到新页面的路径–> <…

    Vue 2023年5月27日
    00
  • Vue.js实现的购物车功能详解

    下面是“Vue.js实现的购物车功能详解”的完整攻略。 确定需求 在开始Vue.js实现购物车功能之前,我们需要先明确我们的需求,包括: 需要展示商品列表; 需要将商品添加到购物车中; 需要展示购物车中的商品列表; 需要对购物车中的商品进行增删操作; 需要实时展示购物车总价。 准备工作 实现此功能需要准备以下工作: 安装Vue.js的开发环境; 准备好商品数…

    Vue 2023年5月27日
    00
  • vue中v-for数据状态值变了,但是视图没改变的解决方案

    当 Vue 中使用 v-for 指令循环渲染数据时,有些情况下会出现数据状态值变了,但是视图没有更新的情况。这通常是由于 Vue 的响应式数据机制以及 JavaScript 原始类型和引用类型的特性所致。 以下是两个示例: 示例一 当循环渲染一个父子组件的情况下,子组件中的数据状态值变化导致父组件视图没有更新。 解决方法: 将父组件的数据状态复制一份到子组件…

    Vue 2023年5月29日
    00
  • Vue3搭建组件库开发环境的示例详解

    为了搭建Vue3组件库开发环境,我们可以按照以下步骤进行: 安装vue-cli并初始化项目 首先我们需要在本地安装vue-cli,使用npm安装即可: npm install -g @vue/cli 安装完成后,我们可以使用下面的命令初始化一个新的vue项目: vue create my-project 安装必要依赖 在项目根目录下执行以下命令安装必要的依赖…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部