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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

9 T% {8 Q+ D2 k9 m: N* b% x
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例5 G% M* b1 l; P$ w; e
" x7 _: Z" |. s8 ]4 ~- J
  1. <div id="app">% x/ k3 J, R4 ?& X& ?
  2.     <p>页面载入时,input 元素自动获取焦点:</p>! \4 E2 d2 ]! p' Q* L( x! R
  3.     <input v-focus>; Z9 U. C: G+ G! [# f! h
  4. </div>
    0 u! t- p$ l$ Z( l* d8 b# D

  5. 9 w) ~4 u* U% `0 R1 F
  6. <script>
    # d* y( y. d, W7 r& E
  7. // 注册一个全局自定义指令 v-focus/ [+ Q) h' @/ a. Z8 B* A
  8. Vue.directive('focus', {
    1 |0 O/ f0 H. `6 C8 i6 g9 e
  9.   // 当绑定元素插入到 DOM 中。
    ' x/ Y1 @5 O6 |9 L
  10.   inserted: function (el) {
    $ K! q- [. n. ]& c8 Q, C! d
  11.     // 聚焦元素8 s, V7 b2 z, r+ ^2 B0 |: P
  12.     el.focus()$ _) h! j" q! @( o( S$ z# @
  13.   }, N8 A0 u6 d0 J
  14. })- U3 n" H' s, Q4 V- g
  15. // 创建根实例
    7 Y. H* _4 j% d
  16. new Vue({% F  r/ ?8 X2 n- Z
  17.   el: '#app'& b. T- B1 b! H7 Q6 E) R6 M4 Z/ i0 O9 t
  18. })  a- `: _: i$ @0 M" Q* }, Z6 y
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
) r' |! M* j% h- @. \' S! Z; k7 W1 ]9 `, T
  1. <div id="app">  O$ |4 _: U4 a7 h- l4 x( N
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    # v8 }& J, D4 J$ C
  3.   <input v-focus>/ a# ]0 R8 Z1 R3 J1 p/ A% k
  4. </div>
    , h: m2 e. P3 E$ H
  5. ( r. A0 V! q( ~- S8 X1 u
  6. <script>
    5 L1 y# C  Y$ h- b! t" h
  7. // 创建根实例! C  h! C. \) z) N8 g# A
  8. new Vue({& D& j6 j3 x7 K& j1 ~) O
  9.   el: '#app',6 C1 O8 _8 Y) o: m6 R2 L, c6 y
  10.   directives: {
    8 T) S, l8 }! K# g
  11.     // 注册一个局部的自定义指令 v-focus
    " F' E$ v7 k6 |# ~# H
  12.     focus: {
    8 {) p- j) Q8 v0 C
  13.       // 指令的定义
    3 N8 r# b- O) G- t3 s) U
  14.       inserted: function (el) {
    / I9 e/ d3 F% ]  j
  15.         // 聚焦元素
    ' z& D7 B) X. B3 D
  16.         el.focus(). j: Z8 ?4 z- E7 _* W5 r: h; Z
  17.       }
    ' ]- r. F3 C4 a6 u! t
  18.     }
    * s" n8 f$ O/ q9 Q0 k4 Q
  19.   }
    6 ?# ]/ v% g) T' r8 A! S0 R& c
  20. }), W( C0 H- Y2 [: q/ g
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    0 H) w) L5 _: j! z2 i
钩子函数参数
钩子函数的参数有:
  • 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 }。% P. X& Y, O' ?! @1 h0 C, @
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。5 b: w5 d8 A$ J. l9 r: i# _+ ^$ Z
以下实例演示了这些参数的使用:
实例
. T" J/ A! u- a: B; p/ e- U; d# f9 B' J9 a5 @- H
  1. <div id="app"  v-runoob:hello.a.b="message">
    & A3 o/ q7 w; A2 b/ p& A# A' g0 c
  2. </div>
    3 l: G9 I' g5 o" i
  3. : R# k7 z# n8 [
  4. <script>
    # I% e1 ?6 m1 x( r5 S
  5. Vue.directive('runoob', {
    ' l* Y2 a( f) s
  6.   bind: function (el, binding, vnode) {
    . K4 r; k/ X3 D$ [$ c4 ~* s
  7.     var s = JSON.stringify$ P, l/ L+ [+ B- y
  8.     el.innerHTML =
    ) ?5 W1 l! p7 ?% U* T. M' I
  9.       'name: '       + s(binding.name) + '<br>' +6 l7 f9 ^- E6 M% Q
  10.       'value: '      + s(binding.value) + '<br>' +
    2 h0 h1 o8 Y1 j! g8 ?/ j+ @% H
  11.       'expression: ' + s(binding.expression) + '<br>' +$ f( H* n6 p" C
  12.       'argument: '   + s(binding.arg) + '<br>' +* A4 D1 M# l) l9 d8 `
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +; E/ F( e+ F2 W
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    & I5 q7 I4 i$ N" t4 H# u( V6 `
  15.   }/ m. C) }; L( u
  16. })& ]; f7 m! g# w8 Z+ D( G% `
  17. new Vue({
    $ `8 ^; a7 ]: {) P  H! K, |4 a0 i
  18.   el: '#app',
    : d5 J( F3 n" j% |6 P
  19.   data: {2 h2 O4 }( L4 e' s% V. X1 _8 ^  C+ v
  20.     message: '菜鸟教程!'
    " g& U/ L& U1 X5 h$ j  q9 S# u5 o$ V
  21.   }7 o  w: v# D/ g7 {
  22. })
    # r) @# S- F4 B1 Z. L9 t0 G
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
( P) C% ~) h" i) M1 G
  1. Vue.directive('runoob', function (el, binding) {6 U  X7 V  [8 W" w2 @/ J
  2.   // 设置指令的背景颜色
    0 z2 P$ m$ p7 s9 U9 m) H
  3.   el.style.backgroundColor = binding.value.color5 [9 A4 o8 F0 ~' h, X7 n
  4. })
复制代码

: B2 o' |9 j. \) p2 ]( l# x& x9 v9 W# ]; x) e0 `* U( x
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
* ~! L" {/ l0 j* p+ y( Y2 Z; W* a; i4 a9 M- i% Z
  1. <div id="app">; c2 i8 Y& E7 R. \2 }' z8 R
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>. k+ B+ U+ P" B* M) [4 `6 E$ U
  3. </div>. c& t0 d. F& w! p/ |' _0 r. Q

  4. % s3 q+ G& l1 F/ f& F; ^/ w
  5. <script>. [( `2 R) H: E( S  [6 Z3 f
  6. Vue.directive('runoob', function (el, binding) {
    : s9 V) `# w5 N! ^
  7.     // 简写方式设置文本及背景颜色
    9 w5 o& ~7 k6 `9 q* Q3 Z5 s
  8.     el.innerHTML = binding.value.text
    8 H& k: l- M4 J9 X- H' u3 I+ M0 S
  9.     el.style.backgroundColor = binding.value.color5 z+ e4 [: d* ?& [# _
  10. })1 M6 \1 J% l. F7 M* F% n7 h% v
  11. new Vue({4 n4 d& ?8 ?% ?1 K/ J
  12.   el: '#app'9 O& h2 f( C- ?5 ]
  13. })
    * J; M1 F+ ]+ }: _4 {0 k+ P
  14. </script>
复制代码

* d1 a7 j3 r! F+ }0 [( K
% m; O! W3 B# ?" ]
- M0 Y: C% F% Y2 Y$ j6 b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:57 , Processed in 0.061716 second(s), 20 queries .

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