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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

* _! L4 O1 |( f# }& K3 G
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
! T) I& u2 ^! W0 r; ?* P  E) U) j& \. ?/ O/ `( r
  1. <div id="app">
    " e8 H$ T, d7 w1 B
  2.     <p>页面载入时,input 元素自动获取焦点:</p>3 ?, c$ B- P  o3 S, {) L3 a
  3.     <input v-focus>' w1 q7 w9 G, t" @# A
  4. </div>
    5 j2 P& q; C; M6 j7 p- W9 B. b

  5. 1 y  T4 e& }  a
  6. <script>
    - k, e/ x$ }, w
  7. // 注册一个全局自定义指令 v-focus
    1 B) n1 C6 \7 A# r7 E6 `- b
  8. Vue.directive('focus', {
    ! F! K/ \$ U. q" r3 y. _
  9.   // 当绑定元素插入到 DOM 中。
    : D# R  _- x5 @' i$ T/ V9 ]; d
  10.   inserted: function (el) {; i# q  w9 ~3 a/ {$ H
  11.     // 聚焦元素+ F" L! l% s  J* L
  12.     el.focus()# N; F" ?0 Y. k. O5 g
  13.   }
    + m$ w- \( s. _$ I) T* g/ S- ~
  14. })( E" i# T6 @8 A4 ]$ A5 b6 K
  15. // 创建根实例8 w9 }; z" N" w* L" H9 \- W7 i! x
  16. new Vue({. s8 q! [: E6 Y2 k( @8 _3 L6 U9 W
  17.   el: '#app'5 K6 a6 Y, K* V4 |8 V) ^7 l, T
  18. })
    . c7 d6 b) u1 z: X) p: G6 M* z
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
' h) b6 u( X! y% V
' _4 T) w; E  v% @
  1. <div id="app">
    ) p8 e' L% h) a
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    # b$ K! S$ }" w/ t/ c5 O
  3.   <input v-focus>2 Q! T+ Q" ~- {  Y1 x0 W; R( `
  4. </div>
    / a" m2 i6 ^8 w  l- W& a

  5. : H5 h# g" Y* l* n6 [/ T4 w
  6. <script>8 W' v" I6 l9 \
  7. // 创建根实例: ~9 j! s2 A; W, X' ]. Z; M
  8. new Vue({
    " _! x( n/ |; v# o' f. _# z- d
  9.   el: '#app',
    ) d! F% J- ]- s2 S
  10.   directives: {
    : {$ n% h/ S1 }8 a  K+ }5 h7 R0 @
  11.     // 注册一个局部的自定义指令 v-focus
    + w1 L8 ^+ H' C" I, x3 \
  12.     focus: {
    : O1 L- h/ Y9 a$ e8 V" c
  13.       // 指令的定义
    + O& [0 a: J) V1 h3 s- |! y: i
  14.       inserted: function (el) {
    ; Y' v( d1 A: n$ w# ?* l& F
  15.         // 聚焦元素  s( C  ]8 {" z, x8 s9 j+ Q1 W9 z
  16.         el.focus()6 Y2 K$ F4 j8 d6 ?1 o0 k
  17.       }
    & v, W1 G/ E2 \0 X) l" x5 R
  18.     }, c$ ?, r4 W1 Z, [' {2 Q0 |
  19.   }5 h3 c- i8 Q7 |  L0 h
  20. })7 X5 k- c/ A5 Q7 l0 o/ L: n5 m' e' ^. n
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    " a5 Y' z4 k: L% [7 U6 o# X+ V$ R
钩子函数参数
钩子函数的参数有:
  • 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 }。
      # M& K) o$ z/ K+ ~# g1 Q
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。) J/ T$ r1 v* ~; |0 l7 v
以下实例演示了这些参数的使用:
实例0 w: {% R7 Q0 n, ^
! b# h9 U' O, z9 P* E* h
  1. <div id="app"  v-runoob:hello.a.b="message">
    7 T8 w) }  g" t7 Y; F7 r) D
  2. </div># |. k+ p, [* p- D

  3. 3 k/ E$ Q) _7 e! C: S* H
  4. <script>
    2 F6 N- r6 }& {1 ?$ ?
  5. Vue.directive('runoob', {
    ( a# f# N0 E' x
  6.   bind: function (el, binding, vnode) {
    + c, E5 Q- t+ [- X, m' {7 W) A
  7.     var s = JSON.stringify2 N5 d2 X' r: ?9 q) U. u% S, }
  8.     el.innerHTML =
    . S& I% x. m' I2 n" Q& _$ M/ D
  9.       'name: '       + s(binding.name) + '<br>' +0 O2 z# y! R) i8 d+ P
  10.       'value: '      + s(binding.value) + '<br>' +
    * `9 U, l7 x2 p# `1 r+ I9 e/ G/ _
  11.       'expression: ' + s(binding.expression) + '<br>' +
    ) t0 F# p  [6 w" v
  12.       'argument: '   + s(binding.arg) + '<br>' +8 I7 A$ w( h5 v
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +3 q8 [0 r0 B6 Z& G
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')+ H0 l3 C3 O! V/ q- S
  15.   }
    7 q' b" F. t7 {& V
  16. })
    0 A9 @/ Y; D1 r$ r3 Y" R
  17. new Vue({" B( w3 A& D* F6 A/ r: v' N
  18.   el: '#app',( t/ S- p" P* P$ W) K$ r7 S$ \
  19.   data: {
    / f/ g& Z% w4 }$ B* S; @3 z( r
  20.     message: '菜鸟教程!'9 x5 r# X( o9 }9 j7 ]. A* d
  21.   }+ k9 ], n$ T% f/ u
  22. })( S9 B  Z- O0 u- F
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
. ~7 o: l% \0 U4 p6 C% @
  1. Vue.directive('runoob', function (el, binding) {
    , f" _$ S2 }7 E) B; L
  2.   // 设置指令的背景颜色% Z/ |  U: Z& Q
  3.   el.style.backgroundColor = binding.value.color+ _/ R7 |# _. k1 d, R- F* R% `
  4. })
复制代码

; U+ N% B4 {( A1 l. p; M+ p0 t  U
/ C5 j/ P; y$ N
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
+ a; f3 R2 j& `1 N* E4 l+ c# t* P/ ^# T/ P  c9 P
  1. <div id="app">" f) E- y5 i5 s* A8 r; v- {
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    9 g, M; D( A5 k- P- D
  3. </div>
    / Y5 L2 G' J6 f8 A3 ?: E. v, M$ R  M, m: }: Z

  4. ( q" V9 X! P' t. i7 q: w7 w0 ^
  5. <script>
    : i7 u$ }8 K* k5 m2 a7 C
  6. Vue.directive('runoob', function (el, binding) {
    , k/ m& ^( O/ f: i# y2 X, \
  7.     // 简写方式设置文本及背景颜色$ z, k8 x* q8 ]- y
  8.     el.innerHTML = binding.value.text, K6 M; E+ Y( |. i
  9.     el.style.backgroundColor = binding.value.color
    8 S" ]+ c9 e8 @, |, z0 ^
  10. })
    * `1 l% a/ m; F- i
  11. new Vue({
    ( ]5 b9 |& ~& Z
  12.   el: '#app'+ k+ {) r6 W. G0 _
  13. })
    9 Q8 S7 s* Q6 G; o$ V6 S
  14. </script>
复制代码

' G0 w" A/ m0 w' |5 j7 M
1 T' |5 Y# H: g$ E, W
% R0 `8 R4 T% _9 g" O, ^# ?% _* ~1 u- a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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