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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

' d- \% o' ~7 F% F8 s' {
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例+ O' O+ v. B8 }- j! t; v# F

) \  Q! A, ^/ A. {, U! G+ @
  1. <div id="app">- ]. F; o& H( k/ L2 Q) C9 I* A$ o
  2.     <p>页面载入时,input 元素自动获取焦点:</p>1 Z) L1 }1 u; N0 ^4 u  \
  3.     <input v-focus>
    ) ]% F" g# o% W8 A7 l: H2 T
  4. </div>
    " |& T. Z% ?. k( t

  5. 5 F' U% Y/ i7 X' d) y9 m9 c
  6. <script>
    9 F1 `2 b5 |4 L! K7 g
  7. // 注册一个全局自定义指令 v-focus! L$ g# p- r& a, J' m
  8. Vue.directive('focus', {
    ( \' O/ C+ g6 H" k& A
  9.   // 当绑定元素插入到 DOM 中。
    2 K) q$ q' \3 X. Z1 l- L
  10.   inserted: function (el) {
    ! I8 R8 T) `  n; M& f$ [3 @
  11.     // 聚焦元素, z# S( ]- y  z! E
  12.     el.focus()
      k7 z( Q# F+ L" }0 Q/ I
  13.   }
    6 i" j, Q% g$ M3 I. P
  14. })
    0 u- D6 c# H* }" T1 K' e7 M
  15. // 创建根实例5 c+ ~7 Z) F, B. x4 I
  16. new Vue({& m' n# b% O$ E
  17.   el: '#app'
    3 l4 w) \! P2 s/ |8 S1 m4 z
  18. })
    + D5 y$ `/ F6 C
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
$ v  h) ^; f9 U: E4 _- h" s6 W' @8 G9 M' x( O4 M- c' s
  1. <div id="app">
    % L/ U, ]# Z' _0 D0 ]
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    : M3 e" p( W! d
  3.   <input v-focus>
    $ j8 ?7 P# a* ?/ d5 U8 }) O1 {
  4. </div>! J+ p8 c; |7 L5 c, E/ G/ s
  5. % |* e* H, E; x; d( ~# ?
  6. <script>
    . R5 j0 T9 W! ~( c( S1 J) z5 _
  7. // 创建根实例
    ' b4 D; p% M" l' ~3 i. l4 L
  8. new Vue({
    5 _, |" D  F4 u- D2 o* R
  9.   el: '#app',
    ; n$ R* w8 N5 i, s" i! a
  10.   directives: {3 C; j  K+ |& |& {: p
  11.     // 注册一个局部的自定义指令 v-focus
    ! K+ I9 [! M6 u; ]
  12.     focus: {
    : Z% H! k. D7 J- x* T" S/ N
  13.       // 指令的定义
    & _  t1 Y0 U0 y
  14.       inserted: function (el) {3 B- b7 p; h( Q: B- b+ N
  15.         // 聚焦元素5 z5 J+ i0 e6 ~2 ^8 G" ]
  16.         el.focus()
    / b% }* s/ E2 j' F, G
  17.       }
    $ @4 R$ t, W/ u7 b5 i; V8 i
  18.     }4 \- [, s( H# S+ j
  19.   }' S" q0 u0 x( i
  20. })5 ?: w  ?9 h6 b0 I/ A5 H; \2 u2 B
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    4 F0 o9 }, H6 W& b/ U% o
钩子函数参数
钩子函数的参数有:
  • 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 }。# J! t( k- r# A) N/ \
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    , L+ @% i) @0 P) {: q2 |
以下实例演示了这些参数的使用:
实例3 I- N- F- i+ V3 o- `
7 m) ?4 A1 S" }& e: p
  1. <div id="app"  v-runoob:hello.a.b="message">4 X, w" o4 L; {" X
  2. </div>
    1 T. u0 s# t( C6 p( [" p

  3. 9 b: o8 s, B1 j3 H- n$ T: ^4 N/ T2 T# E
  4. <script>6 {4 Q/ j- R& y6 ~9 \; @6 u
  5. Vue.directive('runoob', {: H# y4 ^. u4 e; \. n
  6.   bind: function (el, binding, vnode) {8 K7 K6 C4 i- F! L# M" e
  7.     var s = JSON.stringify
    ) A) _1 F9 s, @
  8.     el.innerHTML =
    4 F, J0 v; j7 J
  9.       'name: '       + s(binding.name) + '<br>' +
    , s# L! f+ [6 A: j0 O
  10.       'value: '      + s(binding.value) + '<br>' +* V+ A: ~. N) u% n7 |
  11.       'expression: ' + s(binding.expression) + '<br>' +! r; G9 R1 p$ T- D$ W( q
  12.       'argument: '   + s(binding.arg) + '<br>' +
    . u! T& t" \6 Y& o$ z
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +# N% }! F( S5 l5 T9 l' K0 V
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')( i" o% j' j. [" \& C# g
  15.   }
    ( j7 L2 y" T6 H1 {; Z
  16. })
    / `) }( n9 Z1 O+ V! j' |$ W! H3 o
  17. new Vue({
    . U  z* H+ Y' h4 E- K6 x
  18.   el: '#app',
    : g7 Y. u7 T* K' m- Q
  19.   data: {
    6 j# b, I! D  I( j
  20.     message: '菜鸟教程!'
    9 m5 {" e; g" x9 K5 R- J% p
  21.   }  q) x+ O1 L/ {9 ~
  22. })
    + O! n+ n( i  S
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:/ F0 F3 g3 u! C) D1 m$ I
  1. Vue.directive('runoob', function (el, binding) {
    3 P: P) \( Q/ g" P$ p9 @2 M
  2.   // 设置指令的背景颜色
    7 V$ W2 j4 M4 U: Q
  3.   el.style.backgroundColor = binding.value.color
    - F; Q/ f+ w$ `# m1 U7 e, W$ f
  4. })
复制代码

) A( U; ~0 b# T  |3 a0 X
0 g1 C+ H& f" e% u; c1 N
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
$ d2 n- c) X7 m  E4 g
* @! c6 H: ]. K* M  I5 i2 K8 @
  1. <div id="app">& y( ?9 v5 W& C5 \. L
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div># c8 O- c  q4 }8 ]7 n- @4 E. L
  3. </div>
    5 v+ u1 _" \* [

  4. % [! }  O! f& i8 A* {2 i) b0 E
  5. <script>
    $ |; B3 f3 s8 F3 V" ~/ N( W
  6. Vue.directive('runoob', function (el, binding) {! N0 {( V: s+ p* H% I
  7.     // 简写方式设置文本及背景颜色0 c& B* D1 N% d8 `8 g; M
  8.     el.innerHTML = binding.value.text
    . J1 P: j+ e/ i6 }' {0 S+ }
  9.     el.style.backgroundColor = binding.value.color: {( Y! M  e0 N) M% e- w- ]
  10. }), O5 B" ~5 U% p7 J2 t$ u  s
  11. new Vue({
    , `/ m$ r2 v0 X; E6 C9 u5 F7 C, r
  12.   el: '#app'" ~1 ]( g& e& Y7 S( g# p( G2 f
  13. })- H$ g3 ?1 \5 c: K& Y
  14. </script>
复制代码
& |8 h, u8 H1 U' P7 P, A  ]
4 K# A- S2 O* [: x+ J( I9 L
5 {, o+ h0 U! O) M% J) |' K9 D
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 12:22 , Processed in 0.108613 second(s), 19 queries .

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