Vue.directive的原理与日常使用

简介: Vue.directive的原理与日常使用

一、什么时候需要使用指令

       当我们的methods中存在操作DOM/BOM的逻辑的时候,就该思考是否可以抽象成一个自定义指令

二、Vue 自定义指令有全局注册和局部注册两种方式

       全局注册:在main.js中全局引入,用Vue.use()使用指令;

import DirectivesAll from '@/directives/index'
Vue.use(DirectivesAll)

      局部注册:Vue.directive 在注册局部指令时,是通过在组件 options 选项中设置 directives 属性。

directives: {
  focus: {
    // 指令的定义
    inserted: function (el) {
      el.focus()
    }
  }
}

三、指令的生命周期

        1)bind 第一次绑定到DOM元素上的时候触发;

        2)update bind完成之后立刻触发,以后每当参数更新的时候都会触发;

        3)unbind 解除和DOM元素的绑定时触发 。


四、指令原理(五个钩子函数)

       1)bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置;

       2)inserted:inserted是在DOM插入父节点之后才触发的(仅保证父节点存在,但不一定已被插入文档中),而处理inserted是在DOM插入之前,所以这里不可能直接触发,只能是先保存起来,等到节点被插入之后再触发(分为收集和执行);

       3)update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新。

       4)componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。这个钩子和 inserted 差不多,只是执行的流程不一样。componentUpdated 钩子是更新一个节点就马上执行的,更新一个节点的意思是包括其内部的子节点的。

       5)unbind:只调用一次,指令与元素解绑时调用。


注:

inserted和componentUpdated差异:

       inserted是所有节点,包括其子节点全部插入后,统一执行inserted钩子;

       componentUpdated钩子是更新一个节点就马上执行的;


五、实际使用

       实现列表懒加载:


       1)定义一个指令

Vue.directive('divLazy', {
  bind(el, binding) {
    el.handler = function() {
      const condition = this.scrollHeight - this.scrollTop <= this.clientHeight
      if (condition) {
        binding.value()
      }
    }
    el.addEventListener('scroll', el.handler)
  },
  unbind(el, binding) {
    el.removeEventListener('scroll', el.handler)
  }
})

    2)使用指令

<div v-divLazy="lazyFunc" class="scrollBox">
    <div v-for="(item, index) in groupList" :key="index" class="groupItem">
        ......
    </div>
</div>
    // 懒加载
    lazyFunc() {
      if (this.groupList?.length !== this.groupLength) {
        this.page++
        let obj = {
          page: this.page,
          page_size: this.page_size
        }
        groupManagement.getGroupList(obj).then((res) => {
          if (res?.group_infos?.length > 0) {
            const arr = JSON.parse(JSON.stringify(res.group_infos))
            this.groupList.push(...arr)
          }
        })
      }
    },


相关文章
|
5月前
|
JavaScript 前端开发 Serverless
Vue.js的介绍、原理、用法、经典案例代码以及注意事项
Vue.js的介绍、原理、用法、经典案例代码以及注意事项
159 2
|
3月前
|
JavaScript 算法 编译器
vue3 原理 实现方案
【8月更文挑战第15天】vue3 原理 实现方案
44 1
|
19天前
|
缓存 JavaScript 搜索推荐
Vue SSR(服务端渲染)预渲染的工作原理
【10月更文挑战第23天】Vue SSR 预渲染通过一系列复杂的步骤和机制,实现了在服务器端生成静态 HTML 页面的目标。它为提升 Vue 应用的性能、SEO 效果以及用户体验提供了有力的支持。随着技术的不断发展,Vue SSR 预渲染技术也将不断完善和创新,以适应不断变化的互联网环境和用户需求。
33 9
|
2月前
|
缓存 JavaScript 前端开发
「offer来了」从基础到进阶原理,从vue2到vue3,48个知识点保姆级带你巩固vuejs知识体系
该文章全面覆盖了Vue.js从基础知识到进阶原理的48个核心知识点,包括Vue CLI项目结构、组件生命周期、响应式原理、Composition API的使用等内容,并针对Vue 2与Vue 3的不同特性进行了详细对比与讲解。
「offer来了」从基础到进阶原理,从vue2到vue3,48个知识点保姆级带你巩固vuejs知识体系
|
1月前
|
JavaScript UED
Vue双向数据绑定的原理
【10月更文挑战第7天】
|
21天前
|
JavaScript 前端开发 API
vue3知识点:Vue3.0中的响应式原理和 vue2.x的响应式
vue3知识点:Vue3.0中的响应式原理和 vue2.x的响应式
24 0
|
2月前
vue2的响应式原理学“废”了吗?继续观摩vue3响应式原理Proxy
该文章对比了Vue2与Vue3在响应式原理上的不同,重点介绍了Vue3如何利用Proxy替代Object.defineProperty来实现更高效的数据响应机制,并探讨了这种方式带来的优势与挑战。
vue2的响应式原理学“废”了吗?继续观摩vue3响应式原理Proxy
|
2月前
|
开发框架 JavaScript 前端开发
手把手教你剖析vue响应式原理,监听数据不再迷茫
该文章深入剖析了Vue.js的响应式原理,特别是如何利用`Object.defineProperty()`来实现数据变化的监听,并探讨了其在异步接口数据处理中的应用。
|
2月前
|
缓存 JavaScript 容器
vue动态组件化原理
【9月更文挑战第2天】vue动态组件化原理
44 2
|
3月前
|
缓存 JavaScript 前端开发
[译] Vue.js 内部原理浅析
[译] Vue.js 内部原理浅析