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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
' n& L. g: F! S/ l, i. E
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
. t+ r  x, q, F7 q/ @
! T4 o* p. M& M/ h* {9 _
  1. <div id="app">
    " @1 y* n2 v4 g5 L# V8 B
  2.     <p>页面载入时,input 元素自动获取焦点:</p>4 v+ t4 o# o8 K/ W  Q: G  `) D
  3.     <input v-focus>
    % U6 w- w" V  K% f
  4. </div>
    7 {+ w, F6 R" X2 M, L; `6 S7 `1 @

  5.   w' w. X! Z! u9 `9 d, P+ V
  6. <script>: V+ f2 E" U/ e/ Y
  7. // 注册一个全局自定义指令 v-focus) G2 x2 J0 [: y" N: U: M7 ]
  8. Vue.directive('focus', {
    3 ?: T1 g% e. b! C6 j3 l
  9.   // 当绑定元素插入到 DOM 中。9 {4 T8 s$ j% f/ o8 |5 ]  P
  10.   inserted: function (el) {
    $ |; w' o% W' t/ @! G5 L) J7 ^# E
  11.     // 聚焦元素: g( T& ]( `3 v1 G- A( ~1 w8 a( k
  12.     el.focus()
    - d9 _$ Y8 x+ R8 Q0 t- G) i" [: D
  13.   }1 B6 C2 M3 D' ?
  14. })1 U7 z! P# T' @1 k9 _
  15. // 创建根实例) \5 G/ |) j. k
  16. new Vue({
    0 h# n. @* U5 M9 S0 Y% H  l
  17.   el: '#app'7 Z0 u% n$ `. a" }; P/ W4 z7 F
  18. })$ |' [: Z* |9 {/ v( }) I$ ~4 k+ W
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例4 C4 X( ?1 v0 L, A0 e# m

0 j4 r1 e! w( a# w1 K6 A
  1. <div id="app">" }" g$ O5 i' O8 n% f+ d! V
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    1 w  A9 q8 A) e; G- D* s7 _" R6 D
  3.   <input v-focus>( o5 |5 F! {" O. O4 J
  4. </div>
    1 F$ h: b* h. {0 q# T) _& |# [2 G
  5. 0 d" O: m2 u% K" t
  6. <script>
    9 O7 l0 p4 N1 z% b' E# [$ T2 e
  7. // 创建根实例" n$ P# Y5 ~! x, h4 P: C0 F
  8. new Vue({( m9 @* a4 u" K
  9.   el: '#app',' }, j- ]4 Z# H7 h! j% W
  10.   directives: {" |. Z- d. I# }: e
  11.     // 注册一个局部的自定义指令 v-focus
    . S( T3 @* m5 ?. h$ ~, f* y$ u
  12.     focus: {# {7 B: y8 h/ m# G# `
  13.       // 指令的定义! r. }7 x; [0 W' k# V
  14.       inserted: function (el) {
    + C* _% I- e; B% j8 j/ v1 s6 \0 j
  15.         // 聚焦元素% Q  T$ Y( p$ A
  16.         el.focus()
    $ p3 l$ N) i6 w4 Z
  17.       }
    , W. k; T  F) E0 P, ?: L% ~" S
  18.     }& Z- G* G. n* L% c: r& x" [/ A9 v
  19.   }) W& P! S8 G8 m4 o3 ^7 S
  20. })( G, T7 e1 I0 H/ q: s9 z
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    * j" K% r3 \* E5 e6 F7 A% x
钩子函数参数
钩子函数的参数有:
  • 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 }。
      % E% Y2 G2 M; J$ |: L4 K
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。- K; \2 e5 z2 f1 S" f/ t& t- }! R
以下实例演示了这些参数的使用:
实例8 A& h) u# f$ f" A! I3 u
6 A( j7 d( |; _, ]- [; k
  1. <div id="app"  v-runoob:hello.a.b="message">) O! b/ @! s( U3 C* E6 T8 a
  2. </div>
    " x5 j5 X7 |! \+ {; F

  3. 6 t* r9 o/ u0 o8 g" V
  4. <script>- T/ h- ^! F, T" `& B
  5. Vue.directive('runoob', {. |  I# w8 M) j9 d4 ~. v; J
  6.   bind: function (el, binding, vnode) {, z" _3 v4 t3 s! k# K( H
  7.     var s = JSON.stringify! d2 J8 j" _( n
  8.     el.innerHTML =: [3 ~+ i0 ?5 t3 y9 C
  9.       'name: '       + s(binding.name) + '<br>' +
    # D( }# }% f7 w6 }1 A$ G6 D" a6 ]( Y
  10.       'value: '      + s(binding.value) + '<br>' +/ @* _# C, o# b, a! t
  11.       'expression: ' + s(binding.expression) + '<br>' +. [) L# g' X3 z) ~0 Z$ }$ ^8 q) D4 W: x
  12.       'argument: '   + s(binding.arg) + '<br>' +
    " n5 C- Q3 G* h6 ?# M7 r7 o; B
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    ( P9 K7 u; S) _% ~5 f2 C
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')3 B- ]& O, E$ V+ s# K; s5 ]! T
  15.   }
    % O: O- N4 i6 h4 Z5 t' f0 C
  16. })$ I- m- u/ z3 p) y$ y; b; f
  17. new Vue({
      a2 x( z5 Q' w; F1 {! z& h
  18.   el: '#app',
    + e7 x; B5 z; N; ~! {2 Q1 f
  19.   data: {' A0 z# G$ `- Z7 z9 h9 Z$ m: F
  20.     message: '菜鸟教程!', R4 f0 d! q4 ]/ ]1 t7 ?. Q2 f+ K
  21.   }
    1 Z8 s; L  S1 ^
  22. })
    - ]1 S$ K+ w6 i, y7 }% ]" h* G
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:/ E9 i' z6 z" Y
  1. Vue.directive('runoob', function (el, binding) {$ B$ ^- T3 D2 s7 p
  2.   // 设置指令的背景颜色
    6 K9 _3 |* c% {' G8 @
  3.   el.style.backgroundColor = binding.value.color& D* x8 k* n' d; N* a
  4. })
复制代码

; N- d2 n1 p* L+ \# ^9 T7 z
4 G/ ~3 h7 \0 n& d
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例1 J2 c& T5 C" f) M* N; ]8 G) L

4 p0 R( H% \2 O4 p
  1. <div id="app">0 N6 a/ g- U7 d9 L
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>" K  x$ s1 c7 m2 T8 P- N8 p
  3. </div>
    3 e& \1 {+ e. m; h! g4 E$ C- j
  4. ( G& z" \/ T$ D5 ~) e% Z
  5. <script># M0 K$ ^4 K# j3 g+ h- ]' \
  6. Vue.directive('runoob', function (el, binding) {
    ! R: Q" {4 {2 z& d; b) O5 k! }2 X
  7.     // 简写方式设置文本及背景颜色' h. a( R; M# i3 z1 X
  8.     el.innerHTML = binding.value.text
    / _( J4 J( a4 C  W7 L0 g- I" @
  9.     el.style.backgroundColor = binding.value.color
    - {6 T/ `2 \4 X
  10. })
      ^$ i" }5 o1 @' \% L0 Z5 A/ }
  11. new Vue({8 g: ?! {; Y- z+ R1 {- O
  12.   el: '#app'
    , ^8 D9 d" t' D
  13. })9 F2 [& d1 Q/ b' [2 m1 y" ]% a% W* ]
  14. </script>
复制代码
4 ?: r4 h0 Y( a' o2 R
/ o: q$ F: X( X: C! q, P9 t
, c$ D% ]* m4 d1 v5 d% x, o3 m3 p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 19:03 , Processed in 0.076219 second(s), 20 queries .

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