您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15501|回复: 0
打印 上一主题 下一主题

[Vue.js] Vue.js 自定义指令

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

# [6 ^5 q/ f; m$ Q: E
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
4 E* f" h4 Q; H& \7 s- e& L
8 _! k' T0 B8 e& A# \7 ]$ ?
  1. <div id="app">
    3 N- B6 D! I9 H
  2.     <p>页面载入时,input 元素自动获取焦点:</p>7 G/ v/ |+ ]1 e) q0 X) [3 z, J
  3.     <input v-focus>6 F+ e2 X3 J% d- Z4 B) x
  4. </div>
      A: s2 V& U6 ~& a  j7 v0 i
  5. - `* V$ v! v: o4 S" v6 H0 `$ p
  6. <script>
      I+ R8 f- e# L! Y
  7. // 注册一个全局自定义指令 v-focus" t  ?& k1 C: h: l# F. f0 r
  8. Vue.directive('focus', {
    ) h( Z( h  D5 Z5 _$ M
  9.   // 当绑定元素插入到 DOM 中。5 L3 P3 x( E3 N7 c2 t
  10.   inserted: function (el) {3 {- F' t0 ~, \0 ~  t4 g
  11.     // 聚焦元素
    . K! |' H# p& Z& s
  12.     el.focus(). w+ H& }1 \* E5 R) a
  13.   }2 K7 a, d, X4 k  O% ?
  14. })  n$ m1 I5 {' Z$ e! A* W, G
  15. // 创建根实例* E) _  }6 D$ B1 o& ?
  16. new Vue({' ^+ f; ^+ m- J
  17.   el: '#app'
    * L" U! L: i' I3 H. g0 C/ r
  18. })
    5 ], F" g- n& i5 X
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
# t4 B0 P- P8 [; C" S( e) g  H" F- C' D+ `3 J/ T* Q
  1. <div id="app">( r5 }# [% ?. ]/ u
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    # ?  k- u( f" F* t& T
  3.   <input v-focus>
      k$ H: U: u( A' b' D# f$ ^  E
  4. </div>
    2 y+ n* a3 ^9 p( e9 o
  5. 3 A: d+ w- H' j( _" X
  6. <script>
    1 g( f6 k5 n# R1 s7 t; @0 G
  7. // 创建根实例
    ( m+ n% e; W& J6 ~( i& R; V
  8. new Vue({
    : i, c+ o7 C; n4 J6 ~
  9.   el: '#app',) F) s9 `2 }- a
  10.   directives: {/ @: G5 e8 ]7 y, {: R
  11.     // 注册一个局部的自定义指令 v-focus
    - ]. F  o. J, m0 f
  12.     focus: {! f* z: G! j- O# J8 o! _
  13.       // 指令的定义
    & M& B% d) t+ `1 ^" {1 c
  14.       inserted: function (el) {* f6 a8 p* s/ b$ z8 E' T6 ], T
  15.         // 聚焦元素$ V! e: S6 E' |7 A# y* i/ c) I
  16.         el.focus()0 z0 S6 h& u' M! Q  h
  17.       }; C/ J" J2 X+ G; C) |% L. v
  18.     }1 Y! s; z* l' X4 j% V. E  o
  19.   }! |, {% L0 j+ c, Q" l  ~
  20. })
    % m% y% g6 Z" S# v5 s
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    : ~( t. y8 L0 g  r- c
钩子函数参数
钩子函数的参数有:
  • 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 }。
      6 t/ }0 K& L$ I) B1 X
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。; N2 b8 I  z# W, `' x7 J
以下实例演示了这些参数的使用:
实例
2 I5 g/ W  j+ h: Y  v+ u' o# l7 o* P- y
  1. <div id="app"  v-runoob:hello.a.b="message">2 I5 x- ^6 r) {' V# B. e9 w/ Y3 ]8 u
  2. </div>
    4 `* I3 M6 v/ Y# d- c5 O- O! A
  3. ' Y1 _5 l0 E' q
  4. <script>1 _# r" d, j/ n) P$ q
  5. Vue.directive('runoob', {
    & M7 i1 \+ m7 b, H
  6.   bind: function (el, binding, vnode) {: ~6 B( o  S% y( T9 t! `
  7.     var s = JSON.stringify  ~1 c- {2 Z0 @. @% g3 }
  8.     el.innerHTML =8 p5 y0 P4 H; ~, N
  9.       'name: '       + s(binding.name) + '<br>' ++ Q- _' y- K) L# r
  10.       'value: '      + s(binding.value) + '<br>' +' @9 j# v1 O6 n1 k, A# _1 ?( V
  11.       'expression: ' + s(binding.expression) + '<br>' +
    4 \( O* D; L9 y$ A
  12.       'argument: '   + s(binding.arg) + '<br>' +7 P$ d+ Q9 a, o
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    ' `: C: ~& \$ _/ m6 W
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')+ P9 S1 X3 v% x3 a+ q5 r. A
  15.   }
    + z$ @& v2 {9 d: v9 r; S
  16. })
    , D' Y1 F7 ^+ A
  17. new Vue({- r; \0 V- D; E& s
  18.   el: '#app',
    : u! p2 M4 v: x  j( f
  19.   data: {& [$ L0 s# ?% P( S) `( [5 h0 X
  20.     message: '菜鸟教程!'
    ; L2 ^# g2 C0 `% h3 T- E0 p1 g
  21.   }( ^6 q4 G; r6 O, @& O
  22. })
    ' i2 D. c$ p. p9 g2 `
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
% {' [/ y0 F. Y7 I( q+ g8 I
  1. Vue.directive('runoob', function (el, binding) {
      \" {! I% }4 ]8 X- n, v" ^& z% a
  2.   // 设置指令的背景颜色
    6 C& l7 v& r" {2 F5 t5 m' Y
  3.   el.style.backgroundColor = binding.value.color8 F0 Q9 C7 M- V: w' C2 A
  4. })
复制代码
) Z& G2 X1 I+ \
9 E: w( l& ]6 j5 w  I9 \
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例  b( _7 ?: O5 \
  h1 R6 C  d9 c: N( s
  1. <div id="app">
    $ c/ B4 Z8 C* D- c, F* U
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>& l! T! o3 U, u  |+ Q3 q' A5 u% e( H
  3. </div>; X" Q  i9 }* B9 m9 y% \+ X, F

  4. $ D* A$ H8 c9 V" q( B  Y: ~
  5. <script>- o5 q% l% O: `7 S3 @
  6. Vue.directive('runoob', function (el, binding) {
    0 ]7 U! |! U6 B6 C( P& y
  7.     // 简写方式设置文本及背景颜色
    ) ?: j& z0 P$ x" S
  8.     el.innerHTML = binding.value.text7 E* }8 b0 y0 ^
  9.     el.style.backgroundColor = binding.value.color/ T8 U' J6 e5 L. E9 u
  10. })
    3 |) j; ?$ K8 I9 }
  11. new Vue({# V/ t, t$ a% o5 j
  12.   el: '#app'9 W# k0 `: @, ?9 n2 U- k, J: p9 W% }. `
  13. })  x! ~6 K: e+ V6 W& G8 D8 ^& B; t0 w
  14. </script>
复制代码
! j+ g' F- L# X+ U, `" q  r/ z

5 d0 _2 s0 `+ d, z8 M/ s; _: [& K( ?3 `/ H9 d- C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 20:18 , Processed in 0.052830 second(s), 19 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!