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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
- d" t% J9 G( S7 i# q4 a! ~/ v
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
4 j4 `! L1 x  F$ r' h5 I( O
4 s; n4 l& O; z5 `; \# |" m, w
  1. <div id="app">8 a3 I+ j: \$ E
  2.     <p>页面载入时,input 元素自动获取焦点:</p>: A4 n$ f4 K2 {# P" n% `
  3.     <input v-focus>
    $ y/ Y9 ~- C& J& T6 y& F' R! F4 L
  4. </div>$ j- t! R! S) C0 V5 v/ R6 Y3 J
  5. ! Q' _8 c, f1 N+ h' [
  6. <script>2 J3 z7 @( `& a# l/ R% m
  7. // 注册一个全局自定义指令 v-focus0 X, \4 ?( h- ~$ C5 Z1 Y, k' G9 A0 o
  8. Vue.directive('focus', {
    / ]" M9 c9 `, q; q1 L0 u' j
  9.   // 当绑定元素插入到 DOM 中。
    $ d, _, }$ y- B/ Q3 ~* E& w7 _4 @
  10.   inserted: function (el) {
    . h" Q" W0 p: s7 I
  11.     // 聚焦元素
    % b9 w8 g+ q+ x( ]7 G) g
  12.     el.focus()8 u% A6 V4 L4 A+ _, Z4 D/ t
  13.   }
    / s% _& o: L  w& j6 l8 G* Q
  14. })5 X# n  D# s- j7 g9 N$ ^! b
  15. // 创建根实例1 X2 \( J1 q- w3 ?
  16. new Vue({4 N4 e7 C* P7 x: c
  17.   el: '#app'
    % W6 R: o; G$ k4 A$ ~
  18. })
    1 u/ S0 l. V. H+ b8 n4 r
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例5 S5 I9 @# A/ t8 W0 k0 U  U

# z6 ]5 h+ d8 Y* ]+ e( D# u7 F1 U
  1. <div id="app">! M9 w  |; J1 X0 A3 e, h
  2.   <p>页面载入时,input 元素自动获取焦点:</p>& ?! K% s$ [6 m+ x6 J  o. @
  3.   <input v-focus>
    , a# h" @# v5 }( x" X  j7 N7 a
  4. </div>
    3 ]  f4 S3 z6 l, q0 w% c

  5.   t+ d& M, ]4 o6 N+ f+ E# F3 j$ b
  6. <script>
    + k8 V6 v3 B0 k/ n1 e+ E
  7. // 创建根实例' V0 Z6 D8 V4 r2 T
  8. new Vue({
    ' s4 F+ F/ Q( `8 f( _8 U
  9.   el: '#app',
    # ]$ ~+ z. q- Q$ ?8 e7 ], n+ Q  d
  10.   directives: {- C6 q9 q9 C+ |2 r4 l. Z% u( p0 y: w
  11.     // 注册一个局部的自定义指令 v-focus" T8 p' G* U6 M2 N1 J
  12.     focus: {
    ( l' ]; K% O( y9 \: H: h
  13.       // 指令的定义  T8 o4 S0 _' |6 k
  14.       inserted: function (el) {
    3 K9 d  {- G) i3 v0 `
  15.         // 聚焦元素
    4 g8 o9 l0 m: R8 f! P5 D0 n
  16.         el.focus(): o" L2 e  l( x# T) W
  17.       }: O8 Z  ]& p1 c4 v
  18.     }/ b( a. G, b" H8 _
  19.   }
    3 Y% }$ h) b1 H6 q7 D
  20. })5 T- g) x5 Q# v) R0 J% ^- u
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    . q& F7 ?+ {4 K$ 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 }。
      - G* m6 T+ D4 ]; r) z/ O
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    % r( \4 J5 m! L: o4 T6 @2 q
以下实例演示了这些参数的使用:
实例
6 r/ l6 D3 s" Y' t$ L/ ]+ O6 \  _% T$ N+ W  ^
  1. <div id="app"  v-runoob:hello.a.b="message">0 C2 C7 M, F6 i: y
  2. </div>
    9 r. q# o5 }% {4 Q* R" R
  3. ) T4 g9 k7 Z# [% E$ k4 p* ], i! Y
  4. <script># z: J& |. O* T! D/ i  y
  5. Vue.directive('runoob', {* _( u+ ?, l0 x2 q5 A6 R/ X/ q5 ]; r
  6.   bind: function (el, binding, vnode) {, m% R, Z0 a0 g0 l+ |
  7.     var s = JSON.stringify; m$ G5 `, u# w/ B0 x9 U+ A4 D$ _
  8.     el.innerHTML =/ G; h- Z7 S0 K9 ^
  9.       'name: '       + s(binding.name) + '<br>' +
    , {* V  @; y& r( w  z  u. w0 y
  10.       'value: '      + s(binding.value) + '<br>' +
    + }# P2 F+ c3 w
  11.       'expression: ' + s(binding.expression) + '<br>' +6 |. k) H" g: T+ X1 v  ^
  12.       'argument: '   + s(binding.arg) + '<br>' +
    $ x7 F' V: y6 m4 R7 Y: t3 B0 ^
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +; e. P, G& Q  O: ?/ e* h
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')% l4 v& Y* a( ]! x' b- |" J. N$ Q0 t, f& |
  15.   }
    * y3 Z: g% M  ~2 |) I+ l
  16. })
    / J" P3 V  Q6 i& S0 p) f7 ?* @
  17. new Vue({& t3 w6 w1 i7 C2 w9 y" K
  18.   el: '#app',
    0 ^. V6 N0 M) `
  19.   data: {6 h8 Y" s6 X! I/ `; ^
  20.     message: '菜鸟教程!'
    5 C  c! p  U0 q+ Y, d/ Z4 ~+ b0 M
  21.   }* @9 [' ~- ~9 F4 r* R
  22. })
    * y8 i6 a* i8 {4 W3 b+ S0 f
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:4 Z/ c8 t; y, v  n
  1. Vue.directive('runoob', function (el, binding) {% ~. }, E1 ~, x' m6 x7 a, n3 {
  2.   // 设置指令的背景颜色
    1 S% s  U4 ?" X% ^3 U* l! t
  3.   el.style.backgroundColor = binding.value.color
    ( g0 }' R1 ~+ n5 z2 c5 x' u/ r0 L
  4. })
复制代码

/ _' b) J3 }4 B) J
" q, Y# B  {) U. Z2 z, d
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例) m; {, J( j9 i3 e% o
6 O0 M5 F4 I) \( W' B6 ~8 s
  1. <div id="app">1 [0 n, B* c8 T9 P
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>5 n4 u% }3 Y1 k( n5 N9 K" B
  3. </div>
    ; z4 S  C2 W" M7 {5 x  S; X

  4. 7 _7 X9 @! O+ s
  5. <script>( _- ?& I( Q# {# ]
  6. Vue.directive('runoob', function (el, binding) {% \$ W, X# e, T* D
  7.     // 简写方式设置文本及背景颜色$ Q* z2 R" |; u; V3 A$ S
  8.     el.innerHTML = binding.value.text4 |! Q0 y7 N# O  Q' h+ v2 x7 Z
  9.     el.style.backgroundColor = binding.value.color
    # g* s9 t: [! S
  10. })/ @/ p! |1 R  g4 W
  11. new Vue({, @  P0 z' ~0 `. Z9 Y4 P0 x# \
  12.   el: '#app'
    ( b0 U/ u, H- N9 h) A/ l
  13. })$ f7 \1 ~; B' e% }0 G2 J! b" R
  14. </script>
复制代码

9 _0 V( @) v+ m( F
  G4 V7 \" a7 c( z5 O1 H
1 ]7 _3 V$ {; s. E4 V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:40 , Processed in 0.055891 second(s), 19 queries .

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