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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
. s/ W, d1 A, z/ r( ^2 o) k& t% u
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例' I* F. z9 _0 }
% h/ B! U' m, Z5 X  j
  1. <div id="app">9 ^( @0 {6 p( ?. U7 ^; ^1 a% q; l# Z
  2.     <p>页面载入时,input 元素自动获取焦点:</p>9 V2 B0 W; i4 C8 K) D% V# H
  3.     <input v-focus>% a& i8 N5 x; }! `0 ?) y
  4. </div>
    ' u9 }2 U( r0 _  X  H
  5. 8 |) c" x/ i3 p9 e/ k  e7 e
  6. <script>" `, G# D3 X* e( M
  7. // 注册一个全局自定义指令 v-focus
    & |% b' G! n$ N4 R3 m* D, |) e
  8. Vue.directive('focus', {
    / z+ O4 Z( j) f7 ]& g
  9.   // 当绑定元素插入到 DOM 中。2 j7 @4 j7 h, h
  10.   inserted: function (el) {
    & w5 T; D' `9 o9 D1 I
  11.     // 聚焦元素. G. M6 j$ d1 A- W
  12.     el.focus()
    / G4 z8 q! j5 J: z( S/ {
  13.   }
    5 @% H. j9 Q5 o9 h9 T
  14. })
    # A1 @$ Q3 t/ I7 Q5 y1 M  Z$ \
  15. // 创建根实例; P1 K0 e9 H& W$ a3 w  g; u
  16. new Vue({8 Q  k9 r1 j! }2 B. C
  17.   el: '#app'
    5 ^, O/ U  h1 m5 {
  18. }); W4 M5 o% f+ r1 u$ |3 P. X
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
8 p- T9 X' V+ G" ?2 n! [
/ y6 x7 I$ b7 ?; B
  1. <div id="app">  X5 f; u; t( T) z5 i! U6 h9 A
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    - _1 ?! {9 p, i, J6 _3 b2 D! B
  3.   <input v-focus>2 L# Q- P$ h; Z5 e, H9 O( q% \# {
  4. </div>
    2 _5 _; n5 }' W5 a, t' k
  5.   _# e9 e/ m7 \" ]
  6. <script>
    3 |' v4 K) m5 }& N  ^& e- O
  7. // 创建根实例
    + a2 r- n" n* J( O
  8. new Vue({
    4 v# P) ~0 Y0 `$ C+ m  A
  9.   el: '#app',7 d$ `# N8 J0 m% d5 |3 R) O
  10.   directives: {( s7 d2 [7 U! @; u8 F0 x  v
  11.     // 注册一个局部的自定义指令 v-focus/ s- m) w+ `8 m2 T7 ]- }) f4 D
  12.     focus: {" f+ S) b" H$ i1 p
  13.       // 指令的定义; H4 t: o6 \. ^+ }) w  X
  14.       inserted: function (el) {& E4 e) E: s6 d) C, l) M
  15.         // 聚焦元素
    3 k% B. u2 x3 m- k$ |. P- r4 k) J
  16.         el.focus()/ U( _& `$ t1 `  b5 a$ v& c
  17.       }
    2 ?6 M* g, d3 @& |
  18.     }
    9 ]; b, T4 P9 q! ^4 F
  19.   }; {: V8 F* o& q6 K4 \# y
  20. })
    0 b5 e" B0 R  t6 c/ ]% a7 T. x( ]" [
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    3 L# a+ h  h) u$ U' i/ l/ G
钩子函数参数
钩子函数的参数有:
  • 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 }。
      * Q1 Q2 k5 i7 D
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
      V" N1 @# l! s, E
以下实例演示了这些参数的使用:
实例
* e( \: ~# A0 J( A8 [; V) U  z
4 |4 r6 N6 Q4 d
  1. <div id="app"  v-runoob:hello.a.b="message">
    ! J& z. C- S: m# Z. I$ S; t& k# m
  2. </div>; u8 C/ @) K: X: g- Z) Y& V, u, x
  3. 4 w6 b3 x6 C0 u4 S( B$ s
  4. <script>7 ]! T+ [( o8 R- G+ |. C
  5. Vue.directive('runoob', {$ N( m9 ^9 _: F( ~
  6.   bind: function (el, binding, vnode) {) j$ A, x* T3 B( M+ N5 b2 w
  7.     var s = JSON.stringify
    ; n, S: l) P! I) ~
  8.     el.innerHTML =
      i- M/ s4 i# u% ]- ~+ S( U. T
  9.       'name: '       + s(binding.name) + '<br>' +$ H+ ], u3 t9 h$ D7 G1 n0 {
  10.       'value: '      + s(binding.value) + '<br>' +
    6 F4 S4 T+ U* i
  11.       'expression: ' + s(binding.expression) + '<br>' +
    2 }: J9 D* N0 o: K; x; b
  12.       'argument: '   + s(binding.arg) + '<br>' +7 a, P& g8 F* W& C# ]
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +! ?7 o1 q, |$ W2 }2 C* Z
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')5 K4 ]9 D- ]! J6 }6 `
  15.   }4 G; V# H8 C# q, h/ F1 {. a# R+ i' z
  16. })3 j+ G- `2 z. v
  17. new Vue({
    " F" {3 y& c$ t  \' x5 ~. |
  18.   el: '#app',% \0 E8 \- A4 W9 ^7 c0 d
  19.   data: {
    6 w  {$ x# m) O) a& N, w$ Z
  20.     message: '菜鸟教程!') j$ X2 F" U% J+ H( l8 l1 m
  21.   }
    . q7 m( S* a+ A
  22. })
    " B! `" A/ R( G7 C+ T+ N: X
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:2 N! K. @3 K& Y7 W/ k; w* `
  1. Vue.directive('runoob', function (el, binding) {# f" u  j( w  J7 J9 ~
  2.   // 设置指令的背景颜色
    9 I9 ?9 Y$ ^7 e" R
  3.   el.style.backgroundColor = binding.value.color
    # ?! Z. q6 z3 K6 Y6 l
  4. })
复制代码

4 G1 ]# b4 f1 f" Q$ l! b( r( U# P# Q3 Y5 f. @
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
$ i! `* m; |6 N/ V( {$ f! V# K
% j6 ~2 B; E; H% Q
  1. <div id="app">
    , Q, `6 Z1 Q8 B$ l
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    5 J; F( G9 Q/ w/ a
  3. </div>
    5 j- W) _1 k( i% ?2 C' W2 O6 ~

  4. ! O/ d5 P0 j, S8 `1 X3 f
  5. <script>
    0 C! o" E% ?1 u  M, d3 J$ z
  6. Vue.directive('runoob', function (el, binding) {
      O2 T( F5 J- z# }
  7.     // 简写方式设置文本及背景颜色
    ( W9 @0 d8 ~& }; Z, _( V
  8.     el.innerHTML = binding.value.text" A& G/ r! x! g& [; |
  9.     el.style.backgroundColor = binding.value.color8 S8 w: N0 U$ s. `# e4 b; m
  10. })
    % z. v7 o. V2 G' m
  11. new Vue({3 Z. B) b: q; x. G* C8 o
  12.   el: '#app'
    % v0 A: h7 c9 I1 _9 Q( I/ o& B
  13. })! }# U% b3 a9 n* o7 r" F
  14. </script>
复制代码
) ^: A# z/ U( p* `1 v6 ?1 q
1 T  P/ h1 [+ W0 r
0 j$ Q0 \% _. _+ [  _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:02 , Processed in 0.052140 second(s), 19 queries .

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