lottie实现vue自定义loading指令及常用指令封装详解

目录
  • 一、前言
  • 二、实现方式
    • 1.v-loading
    • 2.v-click-outside
  • 三、后记

一、前言

本文主要介绍使用lottie动画实现vue自定义loading的指令方法。另外本篇文章还会介绍其他几个常用的自定义指令实现方式(点击指定区域外监听指令)。

lottie是一款由airbnb开源的跨平台动画渲染库,支持Android,iOS,Web,Windows平台。是专门用于解析从AE(Adobe After Effects)中通过Bodymovin插件导出的JSON文件,直接渲染动画。

二、实现方式

1.v-loading

这个指令是我们在开发过程中经常遇到的场景,这里我们分两步做,第一步我们先创建一个loading的组件。

这里我们要先引入lottie插件

npm install lottie-web
// or
yarn add lottie-web

之后在loading组件中引入

// loading.vue
<template>
  <div class="loading-wrap">
    <div id="loadingImg" />
  </div>
</template>
<script>
import lottie from "lottie-web"
// 在网上下载的lottie动画,这里我是在iconfont上找的
import animationData from "./loading.json"
export default {
  mounted() {
    // 解决json动画找不到dom不渲染问题
    window.requestAnimationFrame(this.loadImg);
  },
  methods: {
    loadImg () {
      lottie.loadAnimation({
        container: document.getElementById('loadingImg'),
        renderer: "svg",
        loop: true,
        autoplay: true,
        animationData: animationData
      });
    }
  }
};
</script>
<style lang="less" scoped>
.loading-wrap {
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  background-color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1800;
}
</style>

然后去在创建一个js文件去写指令

import Vue from 'vue'
import Loading from './loading.vue'
/**
 * Vue.extend 接受参数并返回一个构造器,new 该构造器可以返回一个组件实例
 * 当我们 new Mask() 的时候,把该组件实例挂载到一个 div 上
 **/
const Mask = Vue.extend(Loading)
// 更新是否显示
const toggleLoading = (el, binding) => {
  if (binding.value) {
    Vue.nextTick(() => {
      // 获取父元素的定位信息
      const isStatic = window.getComputedStyle(el).position === 'static'
      if (isStatic) {
        el.style.position = 'relative'
      }
      // 插入到目标元素
      insertDom(el, el, binding)
    })
  } else {
    removeDom(el, el, binding)
  }
}
// 插入到目标元素
const insertDom = (parent, el) => {
  parent.appendChild(el.mask)
}
// 从目标元素中移除
const removeDom = (parent, el) => {
  parent.removeChild(el.mask)
}
export default {
  // 第一次绑定到元素时调用
  bind: function (el, binding) {
    const mask = new Mask({
      el: document.createElement('div')
    })
    // 用一个变量接住mask实例
    el.instance = mask
    el.mask = mask.$el
    el.maskStyle = {}
    binding.value && toggleLoading(el, binding)
  },
  // 所在组件的 VNode 更新时调用--比较更新前后的值
  update: function (el, binding) {
    if (binding.oldValue !== binding.value) {
      toggleLoading(el, binding)
    }
  },
  // 指令与元素解绑时调用
  unbind: function (el) {
    el.instance && el.instance.$destroy()
  }
}

然后我们再去main.js中,全局注册一下

import Directive from './directives'
Vue.use(Directive)

最后,在使用的时候,就可以这样

 // App.vue
 <template>
  <div id="app" v-loading="isLoading">
  </div>
</template>
<script>
export default {
  name: 'App',
  data () {
    return {
      isLoading: true
    }
  },
  mounted () {
    setTimeout(() => {
      this.isLoading = false
    }, 3000)
  }
}
</script>

以上 我们就封装好了一个lottie的自定义loading。

2.v-click-outside

这个指令是点击目标区域以外的地方的监听。在日常开发中,我们可能会遇到自定义的一些弹窗效果,这个时候,这个指令就派上用场了。

// clickoutside.js
export default {
  bind (el, binding, vnode) {
    function documentHandler (e) {
      if (el.contains(e.target)) {
        return false
      }
      if (binding.expression) {
        binding.value(e)
      }
    }
    el.__vueClickOutside__ = documentHandler
    document.addEventListener('click', documentHandler)
  },
  update () {
  },
  unbind (el, binding) {
    document.removeEventListener('click', el.__vueClickOutside__)
    delete el.__vueClickOutside__
  }
}

之后是使用方法, 如下

<template>
  <div id="app">
    <img  v-click-outside="handleOutSide" src="./assets/logo.png" >
  </div>
</template>
<script>
export default {
  name: 'App',
  methods: {
    handleOutSide () {
      console.log('到外面了')
    }
  }
}
</script>

最后记得在index.js中将两个指令定义一下,再去main.js中注册到全局。

import Loading from './loading'
import clickoutside from './clickoutside'
export default {
  install (Vue) {
    Vue.directive('loading', Loading),
    Vue.directive('click-outside', clickoutside)
  }
}

目录结构如图

以上我们就实现了常用指令的自定义。

三、后记

关于自定义指令有非常多,比如权限时候可能会用到、占位图、loading等。我们都可以用指令的封装,快速便捷的实现一些功能。

以上就是lottie实现vue自定义loading指令及常用指令封装的详细内容,更多关于lottie vue自定义loading指令的资料请关注我们其它相关文章!

(0)

相关推荐

  • Vue2 中自定义图片懒加载指令 v-lazy实例详解

    目录 引言 1.涉及到的主要知识讲解 1.1 Vue2 中自定义指令 1.1.1 指令对象的钩子函数 1.1.2 钩子函数参数 1.2 使用事件总线进行模块之间的通信 1.3 使用到的 Web API 1.3.1 Element.clientHeight 1.3.2 Element.getBoundingClientRect() 2.图片懒加载指令的基本介绍 2.1 最终的实现效果 2.2 图片懒加载指令的注册与使用 3. 实现图片懒加载的原理 3.1 如何监听容器的滚动条的滚动? 3.2 使用

  • vue3使用自定义指令实现el dialog拖拽功能示例详解

    目录 实现el-dialog的拖拽功能 通过自定义指令实现拖拽功能 实现拖拽功能 使用方式 实现el-dialog的拖拽功能 这里指的是 element-plus 的el-dialog组件,一开始该组件并没有实现拖拽的功能,当然现在可以通过设置属性的方式实现拖拽. 自带的拖拽功能非常严谨,拖拽时判断是否拖拽出窗口,如果出去了会阻止拖拽. 如果自带的拖拽功能可以满足需求的话,可以跳过本文. 通过自定义指令实现拖拽功能 因为要自己操作dom(设置事件),所以感觉还是使用自定义指令更直接一些,而且对原

  • Vue指令实现大屏元素分辨率适配详解

    目录 前言 1. 常见的适配方案 2. CSS3 缩放方案 3. 封装一个缩放指令 4. 后记 前言 随着前端技术的不断发展.数据中心(中台)之类的概念的不断升级.物联网设备的更新和普及,越来越多的业主(项目)喜欢在系统中添加一个或者多个可视化大屏,用来集中的展现数据变化.位置变化等等,老板们也更喜欢称之为“态势”. 当然,作为程序员一般都不关心“老板们”的想法,只要完成项目即可.但是经常会有这样的问题:我有一个大屏的模板,但是用户的浏览器分辨率不够,或者有的有书签栏有的没有书签栏,更或者是有的

  • Vue 中指令v-bind动态绑定及与v-for结合使用详解

    目录 前言: 一. v-bind动态绑定class 1. v-bind动态绑定class(对象语法) 2. v-bind动态绑定class(数组用法) 3.v-bind动态绑定style(对象语法) 4.v-bind动态绑定style(数组语法) 二.v-bind和v-for的结合使用 前言: 在昨天的文章中已经基本介绍了,v-bind的基本使用,可以参考学习,本文是更加具体的解释v-bind的使用,和v-for结合的使用. 一. v-bind动态绑定class 1. v-bind动态绑定cla

  • Vue自定义指令v-focus实例详解

    目录 前言 自定义指令 directive 项目实际使用 技术背景 实际操作 优势 setTimeout(fn, 0) 永远的神 $nextTick(callback) 小结 前言 本文直接参考vue2.0官方文档, 并演示博主项目中的使用 自定义指令 directive 除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令.注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件.然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就

  • Vue自定义指令实现点击右键弹出菜单示例详解

    目录 一.实现思路 1.使用contextmenu事件 2.点击菜单之外的任意地方关闭菜单 3.菜单置于图层的最顶层 二.源代码 一.实现思路 1.使用contextmenu事件 该需求需要拦截浏览器的右击事件,更改为自定义监听事件,可使用@contextmenu.prevent直接绑定一个监听函数,它的作用就是拦截右击事件并触发绑定的监听事件. 其次,为了在右击的位置打开菜单,我们需要获取鼠标点击的位置:一般来说,若绑定的函数没有自定义参数,则可以直接使用默认的参数e来获取:若绑定的函数具有自

  • lottie实现vue自定义loading指令及常用指令封装详解

    目录 一.前言 二.实现方式 1.v-loading 2.v-click-outside 三.后记 一.前言 本文主要介绍使用lottie动画实现vue自定义loading的指令方法.另外本篇文章还会介绍其他几个常用的自定义指令实现方式(点击指定区域外监听指令). lottie是一款由airbnb开源的跨平台动画渲染库,支持Android,iOS,Web,Windows平台.是专门用于解析从AE(Adobe After Effects)中通过Bodymovin插件导出的JSON文件,直接渲染动画

  • Vue.js学习笔记之常用模板语法详解

    本文介绍了Vue.js 常用模板语法,分享给大家,具体如下: 一.文本渲染 Vue支持动态渲染文本,即在修改属性的同时,实时渲染文本内容.同时为了提高渲染效率,也支持只渲染一次,即第一次渲染出文本后,文本内容不再跟随属性值的变化而变化. 实时渲染 <div class="row"> <h2>文本 - 实时渲染</h2> <input type="text" v-model="msg" class=&quo

  • Vue自定义组件的四种方式示例详解

    四种组件定义方式都存在以下共性(血泪史) 规则: 1.组件只能有一个根标签 2.记住两个词全局和局部 3.组件名称命名中'-小写字母'相当于大写英文字母(hello-com 相当于 helloCom) 而对于在HTML中自定义组件的时候有4种写法,不过也只是殊途同归,都是用template属性对应的只有一个根标签的HTML代码. 1.全局组件 定义方式示例: Vue.component("hello-component",{ props:["message"], t

  • Vue自定义日历小控件使用方法详解

    本文实例为大家分享了Vue自定义日历小控件的具体代码,供大家参考,具体内容如下 废话少说,先上效果图: 可以在效果图中看到,选择不同的月份的时候当月天数与星期几都是一一对应,非当月天数则是灰色显示,一目了然. 并且此日历控件支持自动确定当前时间,每次打开默认显示的就是最新的月份,用来做签到打卡的功能比较合适. 由于使用的是原生div进行制作,自定义功能非常强,可以自由的更换样式.背景.颜色.大小等等. 在与数据库的时候可以从数据库获得时间信息并填充到控件中,图中的色块就可以看出. 该控件使用了V

  • 在vue自定义组件中使用 v-model指令详情

    目录 一.前言 1.技术点提前知 二.在自定义的vue组件中使用v-model 1.效果演示图 2.自定义组件代码示例 3.在父组件使用自定义组件 三.优写时刻 一.前言 如何实现在自定义的vue组件中使用v-model,. 起先觉得挺简单,事实也挺简单,但似乎又没那么简单.因为深谈这涉及指令原理.数据绑定实现原理. 1.技术点提前知 要想在自定义组件中使用v-model,使用上其实就简单几步,这里以自定义input组件为例. 关键步骤: 1.props的使用.在自定义的vue文件中,声明父组件

  • Angular7中创建组件/自定义指令/管道的方法实例详解

    组件 使用命令创建组件 •创建组件的命令:ng generate component 组件名 •生成的组件组成: 组件名.html .组件名.ts.组件名.less.组件名.spec.ts •在组件的控制器 @Component({ selector: 'app-heroes', templateUrl: './heroes.component.html', styleUrls: ['./heroes.component.less'] }) 手动创建组件 1.创建一个组件ts文件 2.在组件中设

  • angularJs关于指令的一些冷门属性详解

    我们使用ng的时候,经常会使用到指令,大家所熟知的属性我在这里就不介绍了,讲讲大家没怎么留意的属性 1.multiElement 这是指定指令作用区间的功能,最常用的就是ng-repeat-start和ng-repeat-end了. 2.priority 指令优先级,优先级越高,指令越早执行. 3.terminal 是否允许优先级低的指令起作用,如果是true,那么只有比当前指令或跟当前指令等级相同的指令才可以执行.最典型的就是ngIf 4.templateNamespace 声明模板的格式有三

  • vue从使用到源码实现教程详解

    搭建环境 项目github地址 项目中涉及了json-server模拟get请求,用了vue-router: 关于Vue生命周期以及vue-router钩子函数详解 生命周期 1.0版本 1.哪些生命周期接口 init Created beforeCompile Compiled Ready Attatched Detached beforeDestory destoryed 2.执行顺序 1. 不具有keep-alive 进入: init->create->beforeCompile->

  • django 常用orm操作详解

    Django流程: 1 创建Django项目 : django-admin startproject projectname 2 创建应用: : python manage.py startapp appname 3 在控制器(urls.py)创建 url 与 视图函数的映射关系(一一对应) 4 创建视图函数,完成逻辑代码 5 从数据库取出集合对象 5 把数据库变量嵌入到模板进行渲染(render方法) 6 将渲染后的html页面返回给客户端 URL:协议+域名+端口+路径 协议:http 域名

  • Android 中倒计时验证两种常用方式实例详解

    Android 中倒计时验证两种常用方式实例详解 短信验证码功能,这里总结了两种常用的方式,可以直接拿来使用.看图: 说明:这里的及时从10开始,是为了演示的时间不要等太长而修改的. 1.第一种方式:Timer /** * Description:自定义Timer * <p> * Created by Mjj on 2016/12/4. */ public class TimeCount extends CountDownTimer { private Button button; //参数依

随机推荐