Vue 2.x折腾记 - (4) 写一个不大靠谱的 loading 组件

简介: 有需求,就要动手丰衣足食...公司考虑兼容IE9,那么css3 animation写的loading就无缘了。因为keyframes IE10+ , 那么要实现会动且可控的(颜色,大小),好像就剩下svg大佬了;


前言


有需求,就要动手丰衣足食...公司考虑兼容IE9,那么css3 animation写的loading就无缘了。


因为keyframes IE10+ , 那么要实现会动且可控的(颜色,大小),好像就剩下svg大佬了;


效果图




先说说实现的思路


  • 一个遮罩层,一个显示loading...通用法则
  • svg动效的loading直接git上找,一搜一大堆;(会写动效svg的小伙伴赞一个,我没时间研究这个)
  • 遮罩层有两种情况下,一个是全局fixed,一个是相对relativeabsolute,所以这块抽离
  • svg要可控颜色大小,那么必须是svg代码渲染,图片引入是没法更改的


你能学到什么?


  • props的字段限制,默认值
  • computed的运用
  • 部分webpack配置的改动
  • svg一丢丢知识


大体就这样了,再来说说爬的坑


  • svg可以继承颜色和大小(css),前提哈,svg内置代码没有fill(填充的颜色),width,height ,所以要删除掉那三个属性, 上码


// 记得删除,一般用软件生成的svg导出都有带这些属性,删除后默认为黑色
<svg class="icon-loading" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" fill="red">
  <path transform="translate(-8 0)" d="M4 12 A4 4 0 0 0 4 20 A4 4 0 0 0 4 12"> 
    <animateTransform attributeName="transform" type="translate" values="-8 0; 2 0; 2 0;" dur="0.8s" repeatCount="indefinite" begin="0" keytimes="0;.25;1" keySplines="0.2 0.2 0.4 0.8;0.2 0.6 0.4 0.8" calcMode="spline"  />
  </path>
  <path transform="translate(2 0)" d="M4 12 A4 4 0 0 0 4 20 A4 4 0 0 0 4 12"> 
    <animateTransform attributeName="transform" type="translate" values="2 0; 12 0; 12 0;" dur="0.8s" repeatCount="indefinite" begin="0" keytimes="0;.35;1" keySplines="0.2 0.2 0.4 0.8;0.2 0.6 0.4 0.8" calcMode="spline"  />
  </path>
  <path transform="translate(12 0)" d="M4 12 A4 4 0 0 0 4 20 A4 4 0 0 0 4 12"> 
    <animateTransform attributeName="transform" type="translate" values="12 0; 22 0; 22 0;" dur="0.8s" repeatCount="indefinite" begin="0" keytimes="0;.45;1" keySplines="0.2 0.2 0.4 0.8;0.2 0.6 0.4 0.8" calcMode="spline"  />
  </path>
  <path transform="translate(24 0)" d="M4 12 A4 4 0 0 0 4 20 A4 4 0 0 0 4 12"> 
    <animateTransform attributeName="transform" type="translate" values="22 0; 32 0; 32 0;" dur="0.8s" repeatCount="indefinite" begin="0" keytimes="0;.55;1" keySplines="0.2 0.2 0.4 0.8;0.2 0.6 0.4 0.8" calcMode="spline"  />
  </path>
</svg>


  • webpack你若是配置url-loader , 比如vue-cli默认的配置写了会把svg转为base64, 解决方案是拆开,引入一个raw-loader,可以保证svg代码不会转化为url或者base64,上码


{
    test: /\.(png|jpe?g|gif)(\?.*)?$/,
    loader: "url-loader",
    options: {
      limit: 10000,
      name: utils.assetsPath("img/[name].[hash:7].[ext]")
    }
  },
  {
    test: /\.(svg)(\?.*)?$/,
    loader: "raw-loader",
  }


有什么特性!


  • svg大小,颜色,类型可控
  • 遮罩层的样式可控


代码


index.js -- 先把svg默认全部导出


// 引入所有svg loading
export { default as balls } from "./loading-balls.svg";
export { default as bars } from "./loading-bars.svg";
export { default as bubbles } from "./loading-bubbles.svg";
export { default as cubes } from "./loading-cubes.svg";
export { default as cylong } from "./loading-cylon.svg";
export { default as cylongred } from "./loading-cylon-red.svg";
export { default as spin } from "./loading-spin.svg";
export { default as spinning } from "./loading-spinning-bubbles.svg";
export { default as spokes } from "./loading-spokes.svg";


loading.vue


<template>
  <div class="loading-layout" :style="layoutLoadingStyle">
    <div class="loading">
      <p v-html="svgShow" :style="svgStyle"></p>
      <p class="loadingText" :style="{color:svgColor}" v-if="showText">{{loadingText}}</p>
    </div>
  </div>
</template>
<script>
  // 引入所有svg loading
  import * as allsvg from './svg';
  export default {
    name: 'loading',
    data: function () {
      return {}
    },
    props: {
      svgType: {
        type: String, // 字符串类型
        default: 'bars' // 默认的loading图形
      },
      svgColor: {
        type: String,
        default: '#20a0ff'
      },
      svgSize: {
        type: Object,  //  对象类型
        default: function () {
          return {
            width: '50px',
            height: '50px'
          }
        }
      },
      showText:{ // 是否显示loading文本
        type: Boolean,
        default:false,
      },
      loadingText: {
        type: String,
        default: '拼命加载中....'
      },
      lbgColor: { // loading包裹层的样式
        type: Object,
        default: function () {
          return {
            color: 'rgba(255,255,255,.5)'
          }
        }
      },
      lsize: {
        type: Object,  //  对象类型
        default: function () {
          return {
            width: '100%',
            height: '100%'
          }
        }
      },
      lpos: {
        type: Object,
        default: function () {
          return {  // 遮罩层初始化位置
            position: 'absolute',
            top: '0',
            left: '0'
          }
        }
      }
    },
    computed: {
      svgShow () {
        return allsvg[this.svgType];
      },
      svgStyle () {
        return { fill: this.svgColor, width: this.svgSize.width, height: this.svgSize.height }
      },
      layoutLoadingStyle () {
        return {
          position: this.lpos.position,
          top: this.lpos.top,
          left: this.lpos.left,
          width: this.lsize.width,
          height: this.lsize.height,
          'background-color': this.lbgColor.color
        }
      }
    }
  }
</script>
<style scoped lang="scss">
  .loading-layout {
    position: relative;
    height: 100%;
    width: 100%;
    z-index: 2001;
    .loading {
      position: absolute;
      top: 50%;
      left: 45%;
      transform: translate(-50%, -50%);
      text-align: center;
      p {
        margin: 0 auto;
      }
      svg {
        fill: inherit;
        height: inherit;
        width: inherit;
      }
    }
    .loadingText {
      white-space: nowrap;
    }
  }
</style>



目录
相关文章
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
164 64
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
57 8
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
2月前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
2月前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
2月前
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
3月前
|
JavaScript 前端开发 测试技术
组件化开发:创建可重用的Vue组件
【10月更文挑战第21天】组件化开发:创建可重用的Vue组件
38 1
|
JavaScript
Vue的非父子组件之间传值
全局事件总线 一种组件间通信的方式,适用于任意组件间通信
|
缓存 JavaScript 前端开发
Vue Props、Slot、v-once、非父子组件间的传值....
Vue Props、Slot、v-once、非父子组件间的传值....
97 0
|
JavaScript
Vue中父子组件传值
先在⽗组件中给⼦组件的⾃定义属性绑定⼀个⽗组件的变量