简介

因为 Vue 里面提供的内置指令有时无法满足我们常规开发,所以需要一些自定义的指令来帮助我们完成一些开发

基本用法

和组件类似分全局注册和局部注册,区别就是把 component 换成了 directive

钩子函数

Vue 中,自定义指令给我们提供了几个钩子函数(可选):

bind

只调用一次,作用:指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作

inserted

被绑定元素插入父节点时调用(父节点存在即可调用,就是出现在内存中就可以调用了,不必存在于 DOM 结构中)

update

被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的 绑定值,可以忽略不必要的模板更新。

componentUpdated

被绑定元素所在模板完成一次更新周期时调

unbind

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

钩子函数的参数

el

指令所绑定的元素,可以用来直接操作 DOM 。

binding

一个对象,包含以下属性:

name

指令名,不包括 v­ 前缀。

value

指令的绑定值, 例如: v­my­directive=”1 + 1”, value 的值是 2。

oldValue

指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无 论值是否改变都可用。

expression

绑定值的字符串形式。 例如 v­my­directive=”1 + 1” , expression 的值是 “1 + 1”。

arg

传给指令的参数。例如 v­my­directive:foo, arg 的值是 “foo”。

modifiers

一个包含修饰符的对象。 例如: v­my­directive.foo.bar, 修饰符对 象,,,modifiers 的值是 { foo: true, bar: true }。

vnode

Vue 编译生成的虚拟节点。

oldVnode

上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

完整代码

钩子函数

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Vue入门之自定义指令</title>
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. </head>
  8. <body>
  9. <div id="app">
  10. <div v-test="color">
  11. {{num}}
  12. </div>
  13. </div>
  14. <button onclick="unbindApp()">解绑</button>
  15. <script type="text/javascript">
  16. // 解绑
  17. function unbindApp() {
  18. app.$destroy();
  19. }
  20. // 自定义指令
  21. Vue.directive("test",{
  22. //1-被绑定
  23. bind:function (el, binding, vnode) {
  24. console.log("1-bind 被绑定");
  25. console.log("el:",el);
  26. console.log("binding:",binding);
  27. console.log("vnode:",vnode);
  28. el.style.color = binding.value;
  29. },
  30. //2-被插入
  31. inserted:function (el, binding, vnode) {
  32. console.log("2-inserted 被插入");
  33. },
  34. //3-更新
  35. update:function (el, binding, vnode) {
  36. console.log("3-update 更新");
  37. },
  38. //4-更新完成
  39. componentUpdated:function (el, binding, vnode) {
  40. console.log("4-componentUpdated 更新完成");
  41. },
  42. //5-解绑
  43. unbind:function (el, binding, vnode) {
  44. console.log("5-unbind 解绑");
  45. }
  46. });
  47. var app = new Vue({
  48. el:'#app',
  49. data:{
  50. num: 123,
  51. color:'red'
  52. }
  53. })
  54. </script>
  55. </body>
  56. </html>

binding选项

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>自定义指令</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9. 自动获取焦点:<br>
  10. 这个是含有自定义指令的:<input type="text" v-focus> <br>
  11. 这个是没有自定义指令的:<input type="text"> <br>
  12. <hr>
  13. <div v-cuihua:goudan.a.b.c="obq">
  14. </div>
  15. </div>
  16. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  17. <script>
  18. Vue.directive('focus', {
  19. inserted(el) {
  20. el.focus()
  21. }
  22. })
  23. Vue.directive('cuihua', {
  24. bind(el, binding, vnode) {
  25. let keys = [];
  26. for (let key in vnode) {
  27. keys.push(key);
  28. }
  29. el.innerHTML =
  30. 'name' + '-------------' + binding.name + '<br>' +
  31. 'value' + '-------------' + binding.value + '<br>' +
  32. 'expression' + '-------------' + binding.expression + '<br>' +
  33. 'argument' + '-------------' + binding.arg + '<br>' +
  34. 'modifiers' + '-------------' + JSON.stringify(binding.modifiers) + '<br>' +
  35. 'vnode中的keys' + '-------------' + keys.join("--") + '<br>'
  36. }
  37. })
  38. let app = new Vue({
  39. el: '#app',
  40. data: {
  41. abcd: "我是 value 值",
  42. pbq: "我是绑定的值"
  43. }
  44. })
  45. </script>
  46. </body>
  47. </html>