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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
- N9 q$ P  m( n8 y  K
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例1 u4 h/ J3 w. D! ^% z; n$ l

, E$ S4 i! S7 N; p2 r) X
  1. <div id="app">- s6 Z. t: `# o. ?0 e0 B
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    7 h! Q, K6 ]& m# z% a% f6 k' _
  3.     <input v-focus>
    6 q1 ]2 W& c$ j7 Z1 L; R3 ^; l
  4. </div>
    # _, _: g# s8 [1 s* c- g" B
  5. ' S  x% F% M3 ~) W8 O6 c
  6. <script>
    / F. F7 \$ j/ Z; |, G
  7. // 注册一个全局自定义指令 v-focus8 ?+ R1 H9 y( X) o3 x
  8. Vue.directive('focus', {
    0 q# @6 e& \5 l, s, y, k
  9.   // 当绑定元素插入到 DOM 中。
      h, ]% t! Q/ b; T' J1 l% z
  10.   inserted: function (el) {
    9 [5 o: C+ Q& V' B& q5 Y
  11.     // 聚焦元素
    1 z( P5 d& i: E+ ^
  12.     el.focus(). E; S7 F/ |, @5 c' h; D3 P; c
  13.   }+ @( g4 f# h5 y8 s! X
  14. }). `( ~: f6 w( J7 F, v3 d
  15. // 创建根实例, ]0 s$ R& E% X3 ?
  16. new Vue({; v+ ^' \) C2 }  ?; x. u
  17.   el: '#app'
    / E9 G- b# S/ h/ G% }
  18. })
    4 f3 ^$ r# w5 L
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
- Q3 ]! B  r  ^0 }% n+ @& S5 I0 T
  1. <div id="app">- D0 l! f7 x  Z6 E5 b! `/ N' k
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    * _. W+ x/ t: w  ?
  3.   <input v-focus>
    $ A* q+ p, w" w8 e" A6 B
  4. </div>
    . Q" B2 _/ E, C1 v* R* {5 q+ V
  5. / Z2 G9 X6 O; ?/ j0 m
  6. <script>
    ; h) r% {) [' o+ k& b* _- D
  7. // 创建根实例
      |5 `5 U% K1 J; j" \/ `7 M
  8. new Vue({
    4 f- C* D$ t" h
  9.   el: '#app',
    , M* [7 ^4 u, o
  10.   directives: {
    2 [! f  p1 c8 ?- }5 V' o
  11.     // 注册一个局部的自定义指令 v-focus
    ; _+ g& P8 r( B9 }5 I* P
  12.     focus: {/ X% d+ D4 w+ `
  13.       // 指令的定义
    ) J$ D% k+ |) ?
  14.       inserted: function (el) {
    6 j9 s- @+ Q' d7 u7 _
  15.         // 聚焦元素. E; c4 {+ m8 M0 S+ v& K  M
  16.         el.focus()
    / B- q* @3 B5 O! C% E% ^! e3 \0 ~
  17.       }
    9 e0 g. d# V" l, k5 S: E
  18.     }
      Q* R! w8 q2 \8 j4 T9 Y7 ^3 ]
  19.   }
    . q% n/ I* P: L* u7 N- N
  20. })
    5 J3 L$ p2 f3 V- A1 v$ i( f
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    3 i8 F) S1 i+ Y% d: Q4 f
钩子函数参数
钩子函数的参数有:
  • 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 }。9 Q# I/ A3 u$ I4 A- F' U
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    4 L+ @. a, e; R1 Q
以下实例演示了这些参数的使用:
实例
+ @  M( m; G: y) p4 |
2 M. g, @6 C5 E+ ^1 u; u
  1. <div id="app"  v-runoob:hello.a.b="message">
    / A% i" y$ r9 m0 n
  2. </div>: Z7 t1 B7 ~" q: s1 {6 e  @/ r

  3. ' Q4 I- f% x8 E
  4. <script>2 i" d1 C% |$ z* V. ~9 ]
  5. Vue.directive('runoob', {
    ( g, X' ], ~  m# ^' g
  6.   bind: function (el, binding, vnode) {( {; n) m7 C, y! k' P# ~
  7.     var s = JSON.stringify1 V# p) d8 Q$ V$ ?& _* W
  8.     el.innerHTML =
    8 q* y' W. m% X  W
  9.       'name: '       + s(binding.name) + '<br>' +
    # \; z: r) \. H8 _; o
  10.       'value: '      + s(binding.value) + '<br>' +
    + y6 ]0 l/ I+ [; M
  11.       'expression: ' + s(binding.expression) + '<br>' +
    # p" ?+ K( A5 p2 e4 ~. H
  12.       'argument: '   + s(binding.arg) + '<br>' +
    * A* D5 H  J/ ?! Z
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +% W# Y6 J! Z2 n
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    4 t- L" t4 c1 n( D
  15.   }
    . [3 q: ^5 S% R1 Y; J. Z
  16. })6 Z( k- g4 `4 H* K: F$ x
  17. new Vue({* I* a' F# S  f: s6 i  L
  18.   el: '#app'," z$ ]& R& M% x7 n/ c5 K
  19.   data: {
    : c! G9 E. O" [6 X" q/ ]$ D  L
  20.     message: '菜鸟教程!'
    ) R; b* T; d( C" V
  21.   }  [2 \  v9 T& M2 l3 q# [9 w
  22. })
    ' {; y/ x! r. Y) d5 l0 ^
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:8 q7 w: s% ^& }3 n
  1. Vue.directive('runoob', function (el, binding) {
    9 z8 Q* |1 s- o# f: m6 t+ }
  2.   // 设置指令的背景颜色
    ) o' F! ], Y- A7 f: S+ t! v
  3.   el.style.backgroundColor = binding.value.color
    ' H: G: V8 ]& b6 d" h
  4. })
复制代码
8 W9 ]& ~4 J2 ?) ]  M; _" p

! E: _; _3 `. C" U
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
% N0 q" h, \6 i" o. `* A2 v/ s, m5 q! u' B: y2 g
  1. <div id="app">
    1 ?2 z; Q) E6 u8 M; U$ b3 S
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    0 i- B& A$ N+ T( P0 j
  3. </div>  |0 x( O& C! s5 ~) U

  4. * l+ k. i, c/ p
  5. <script>9 g7 Y8 W0 K/ ^9 p* |
  6. Vue.directive('runoob', function (el, binding) {
    ' v5 S8 {& r3 T$ n
  7.     // 简写方式设置文本及背景颜色; u- g6 d( h% Y4 N
  8.     el.innerHTML = binding.value.text4 D6 l0 A. i, v% g
  9.     el.style.backgroundColor = binding.value.color8 E6 N% V0 D$ p; r$ X3 V' B
  10. }), |) \' W+ U9 g* c" O9 Q: m7 ~. X2 ?
  11. new Vue({
    ) a2 s0 ?* Y/ @
  12.   el: '#app'
    1 k0 k( ~* R) |7 Z3 ?9 ?
  13. }), P2 \+ e% K% w( w
  14. </script>
复制代码
4 }. H8 ~" V6 l. T
# y, |) P: Q& M( n
% _6 A3 O6 U5 B6 C( _1 x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 15:55 , Processed in 0.103650 second(s), 19 queries .

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