前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue 中「自定义指令」的强大之处

Vue 中「自定义指令」的强大之处

作者头像
六小登登
发布2019-03-22 15:44:35
9530
发布2019-03-22 15:44:35
举报
文章被收录于专栏:Modeng的专栏Modeng的专栏

Vue 中有许多的指令提供我们使用。它可以让你进行一些模版的操作。

但是内置指令,在实际的开发过程中可能这些并不能满足所有的需求。所以 Vue 给我们提供来一个灵活的方法「自定义指令」。

说自定义指令之前,先看看什么叫「指令」。

指令的概念

指令是指可以控制操作 DOM 的一些小命令,通常以 v-前缀出现的特殊特性。

例如我们经常使用的v-ifv-showv-bindv-onv-html等。

使用指令时,你可以传递值,字符串,也可以给指令添加参数,修饰符等等。比如:

1.传递值

代码语言:javascript
复制
<p v-if="isShow">你好,我是六哥</p>
let vm = new Vue({
  el: "#app",
  data: {
    isShow: true
  }
});

2.字符串

代码语言:javascript
复制
<p v-text="'hello world'"></p>

3.添加参数

代码语言:javascript
复制
// class,style 就是传给指令的参数

<div v-bind:class="classObj"></div>
<div v-bind:style="classObj"></div>

4.修饰符

代码语言:javascript
复制
// prevent 指令的修饰符

<button v-on:submit.prevent="onSubmit"></button>

以上是你经常使用指令的方式,了解这些之后,它可以帮助我们更好的认识自定义指令的 一些参数问题。下面就来看看自定义指令。

自定义指令

指令的注册方式和「过滤器」、「混入」、「组件」注册的方式一样都分为两种:一是全局注册,二是局部注册。

1.全局注册

代码语言:javascript
复制
Vue.directive('name', {})

2.局部注册

代码语言:javascript
复制
directives: {
    name: {}
}

然后在模版中直接使用即可。

代码语言:javascript
复制
<p v-name>你好,六哥在这</p>

我个人更倾向于使用全局注册的方式,因为既然已经使用了自定义指令,应该是通用,可复用的。

所以提供整个项目使用的指令才更有价值,而不仅仅只限于某个组件内部。如果单一地方使用直接把功能搂出就行了,何必费这力气。

继续来看具体的实现方式。

Vue 提供了自定义指令的几个钩子函数:

  • bind:指令第一次绑定到元素时调用,只执行一次。
  • inserted:被绑定的元素,插入到父节点的 DOM 中时调用。
  • update:组件更新时调用。
  • componentUpdated:组件与子组件更新时调用。
  • unbind:指令与元素解绑时调用,只执行一次。

除update 与 componentUpdated 钩子函数之外,每个钩子函数都含有 elbindingvnode这三个参数。

oldVnode只有在 update 与 componentUpdated 钩子中生效。

参数el就是指令绑定的 DOM 元素,而binding是一个对象,它包含一下属性:namevalueoldValueexpressionargmodifiers

另外值得注意的一点是,除了 el之外,bindingvnode属性都是只读的。

熟悉指令的创建方式与参数之后,我们就用它来创建一个案例。

创建自定义指令

Loading 是项目中最常见的一个小功能,别看它功能小,但是起到的作用却很大,手动创建一个 Loading 指令。

代码语言:javascript
复制
Vue.directive("loading", {
  bind(el, binding) {
    if (binding.value) {
      let div = document.createElement("div");
      div.className = "loading-parent";
      div.innerHTML = `
        <div class="loading-spinner"><i class='el-icon-loading'></i></div>
      `;
      el.appendChild(div);
    }
  },
  update(el, binding) {
    if (binding.value) {
      let div = document.createElement("div");
      div.className = "loading-parent";
      div.innerHTML = `
        <div class="loading-spinner"><i class='el-icon-loading'></i></div>
      `;
      el.appendChild(div);
      el.load = div;
    } else {
      el.load && el.load.parentNode && el.load.parentNode.removeChild(el.load);
    }
  }
});

然后我们直接就可以在模版中使用了。

代码语言:javascript
复制
<div v-loading="loading" class="box"></div>

你也看出来了很多代码是重复的,怎么办呢?

Vue 中给我们提供了简写方式。当只有这两个钩子函数时bindupdate,我们可以简写如下。

代码语言:javascript
复制
Vue.directive("loading", function(el, binding) {
  if (binding.value) {
    let div = document.createElement("div");
    div.className = "loading-parent";
    div.innerHTML = `
        <div class="loading-spinner"><i class='el-icon-loading'></i></div>
      `;
    el.appendChild(div);
    el.load = div;
  } else {
    el.load && el.load.parentNode && el.load.parentNode.removeChild(el.load);
  }
});

我们实现了一个非常简单的指令,但还不够灵活,比如我想添加 loading 的背景色,修改图标的颜色怎么办呢?

这时候就需要给指令传入多个值,改造下实现背景与图标颜色。

代码语言:javascript
复制
Vue.directive("loading", function(el, binding) {
  if (binding.value) {
    let div = document.createElement("div");
    div.className = "loading-parent";
    div.style.backgroundColor = binding.value.background;
    div.style.color = binding.value.color;
    div.innerHTML = `
        <div class="loading-spinner"><i class='el-icon-loading'></i></div>
      `;
    el.appendChild(div);
    el.load = div;
  } else {
    el.load && el.load.parentNode && el.load.parentNode.removeChild(el.load);
  }
});

直接使用

代码语言:javascript
复制
<div v-loading="{color: 'white', background: '#000'}">我可以拥有更多属性</div>

在文章开始我们介绍指令时,还说到指令的「参数」与「修饰符」这里我就不多介绍了,大家不妨自己去尝试一下吧。体验下自定义指令的魅力。

如果文章对你有启发,记得给个赞哦。

公众号:六小登登,更多干货文章。

人人都可以成为高手。一个爱写作的技术人。欢迎交流。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年03月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 指令的概念
  • 自定义指令
  • 创建自定义指令
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档