资讯专栏INFORMATION COLUMN

vue 自定义指令

geekzhou / 3399人阅读

摘要:添加新指令只需在中加入模块,并引入全局中通过绑定全部指令注册指令业务组件中,加入指令名我们成功完成自定义指令的模块化完整项目地址

vue 自定义指令篇
对于vue的指令,有我们熟悉的v-model、v-show等,但我们也可以自己定义我们需要的指令,如比较常用的v-lazy懒加载
官方详细文档:https://cn.vuejs.org/v2/guide...
通过directive就可以在Vue上注册指令

// 注册一个全局自定义指令 `v-focus`
Vue.directive("focus", {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

一个指令定义对象可以提供如下几个钩子函数 (均为可选):

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

inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。

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

componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。

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

指令模块化
比如我们熟悉的v-show,不看源码,我们分析v-show这个指令的功能,v-show="true || false"显示或者因此节点,但元素不占据其本来的空间。因此这可以通过我们常用的display="none"一样
我们的想法是注册一个指令,通过给钩子函数传递参数true 或 false去改变节点的display的值

stealth.js

// 元素隐藏显示指令
export default {
  // 只调用一次,指令第一次绑定到元素时调用
  bind (el, binding, vnode) {
    el.style.display = binding.value ? "block" : "none"
  },
  // 被绑定元素插入父节点时调用
  inserted (el, binding, vnode) {
    console.log("inserted")
  },
  // 所在组件的 VNode 更新时调用
  update (el, binding, vnode) {
    console.log("update")
    el.style.display = binding.value ? "block" : "none"
  },
  // 指令所在组件的 VNode 及其子 VNode 全部更新后调用
  componentUpdated (el, binding, vnode) {
    console.log("componentUpdated")
  },
  unbind (el, binding, vnode) {
    console.log("unbind")
  }
}

指令模块化,通过index.js管理自定义指令。添加新指令只需在modules中加入模块,并引入
index.js

import stealth from "./modules/stealth"
export {stealth}

全局Vue中通过directive绑定全部指令
mian.js

import * as directives from "./directives"
// 注册指令
Object.keys(directives).forEach(k => Vue.directive(k, directives[k]))

业务组件中,加入v-*(指令名)

我们成功完成自定义指令的模块化

完整项目github地址:https://github.com/hty7/vue-demo

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94231.html

相关文章

  • 每个人都能实现的vue定义指令

    摘要:指令绑定的前一个值,仅在和钩子中可用。字符串形式的指令表达式。上一个虚拟节点在上可根据需要定义一些钩子函数只调用一次,指令第一次绑定到元素时调用。指令的值可能发生了改变,也可能没有。 前文 先来bb一堆废话哈哈.. 用vue做项目也有一年多了.除了用别人的插件之外.自己也没尝试去封装指令插件之类的东西来用. 刚好最近在项目中遇到一个问题.(快速点击按钮多次触发多...

    NickZhou 评论0 收藏0
  • Vue 混合、定义指令、插件

    摘要:当组件和混合对象含有同名选项时,这些选项将以恰当的方式混合自定义指令除了默认设置的核心指令和也允许注册自定义指令。 vue的复用性与组合 混合 混合 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。混合对象可以包含任意组件选项。以组件使用混合对象时,所有混合对象的选项将被混入该组件本身的选项。 当组件和混合对象含有同名选项时,这些选项将以恰当的方式混合 ...

    whlong 评论0 收藏0
  • 使用vue定义指令开发一个表单验证插件validate.js

    摘要:今天就来介绍一下如何利用的自定义指令来开发一个表单验证插件的过程。按照这种方式就能够使用自己开发的这个表单校验插件。这段时间在进行一个新项目的前期搭建,新项目框架采用vue-cli3和typescirpt搭建。因为项目比较轻量,所以基本没有使用额外的ui组件,有时候我们需要的一些基础组件我就直接自己开发了。今天就来介绍一下如何利用vue的自定义指令directive来开发一个表单验证插件的过...

    warnerwu 评论0 收藏0
  • vue定义指令升级2.0的坑

    摘要:如今升级后,在自定义指令部分的全部变化了对于一个插件作者来说这简直是崩溃的毫无兼容可言。本文我就讲介绍下一个自定义指令从升级到所走的坑。吐槽我们知道,一个方法最重要的就是传参,所以自定义指令最需要的也是这点。 前言 从1.0.X版本就开始使用vue了,应该也是vue很早的一批用户。在我司使用vue这一年多以来(偏向移动端),我发现vue的插件真的是少之又少,这也是我当初一开始想写v-...

    jokester 评论0 收藏0
  • Vue 定义指令

    摘要:自定义指令定义直接看官网的介绍吧觉得官方文档说的很清楚了,所以我基本都是抄他的了。除了核心功能默认内置的指令和,也允许注册自定义指令。然而,有的情况下,你仍然需要对普通元素进行底层操作,这时候就会用到自定义指令。 前言 最近搞了毕设,需要实现一个场景,点击一块区域,弹出一个编辑区域,点击页面的其他地方的时候,这个编辑区域就隐藏,本想想之前写模态框一样写个方法的时候,突然showImg(...

    you_De 评论0 收藏0

发表评论

0条评论

geekzhou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<