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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

  C8 J. c2 c8 `, O" r  Y
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例2 Q1 u: ~* z& L5 ]: @5 D( k

) D& T6 S% V6 L7 c. S
  1. <div id="app">! M3 Z2 O3 q. z. y0 G: l
  2.     <p>页面载入时,input 元素自动获取焦点:</p>6 ?4 n! S, w' Y; S; b4 Q- a: S6 W
  3.     <input v-focus>4 D( `3 F1 I) s4 R
  4. </div>
    - Y; {, G4 m  |! f% z2 l0 d
  5. ( U: I" D( M7 t0 [
  6. <script>1 l, p) j1 }+ |: V, W
  7. // 注册一个全局自定义指令 v-focus
    & p; ]. }3 v8 U+ e+ c9 \
  8. Vue.directive('focus', {
    ' g8 @* l2 y& p: d3 Y* \# [. H
  9.   // 当绑定元素插入到 DOM 中。) _1 \% G  N' ]$ m( N) c2 E
  10.   inserted: function (el) {
    7 E6 {  j, s3 ^, k' S; w
  11.     // 聚焦元素  H1 w# B. J, E1 U
  12.     el.focus()2 `$ f0 A2 u8 D7 c& N
  13.   }- q3 O' r3 x$ B
  14. })
    & Y* _+ t  L# I- R. T2 Z
  15. // 创建根实例
    ! i1 V) O  q+ |) X
  16. new Vue({
    , ?+ i4 O* L" }8 P, p! R
  17.   el: '#app'
    ( e0 _, L3 i% c1 M5 d7 Z
  18. })4 O7 o2 q0 a1 e9 {0 h& G5 W' u; ~
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
0 q! w# i( M: V- K4 Q) ]; g& l8 `3 G& c% R- n' x; u( D
  1. <div id="app">
      j7 o) s+ W& f
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    $ n5 F( a0 D7 h) W
  3.   <input v-focus>9 ?% D1 o6 e8 B; o
  4. </div>
    , Z! n1 v+ W9 b  `* Q
  5. $ u9 q/ ?5 V9 v6 m, G% u/ F. ^
  6. <script>
    # O% ^7 y( ]* I$ k% O
  7. // 创建根实例. X- u1 j' f  W
  8. new Vue({
    4 b1 C1 u' j( i9 }. Q+ h5 V# N2 l4 Q
  9.   el: '#app',& h7 G* f. u3 d" o/ \2 H
  10.   directives: {
    3 v+ a' t9 l  |) R! E
  11.     // 注册一个局部的自定义指令 v-focus. n: T! W: k6 o: V; c1 P
  12.     focus: {- U. i& C. A7 a% Z2 }0 {8 Y, W6 E) |
  13.       // 指令的定义) u3 f% e; x( s& l% a3 o% s1 e( a5 l
  14.       inserted: function (el) {5 j4 U3 n3 O& R/ S3 k
  15.         // 聚焦元素# c; Z& B3 U# K6 _; R# R
  16.         el.focus()/ f- z5 R+ g2 q/ H$ s
  17.       }  `9 W  v' \. B
  18.     }/ o. u1 ^% X6 `! o$ ~
  19.   }+ `! \! u4 |6 q0 Q  |7 i- W1 ]; B
  20. })1 I6 a( k0 j8 s+ Z
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    / ?% F+ E$ Z: ^" Q
钩子函数参数
钩子函数的参数有:
  • 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 }。
      ( b& E6 a( L. T/ f5 d
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。3 ~  Y. k1 {& }* h' d
以下实例演示了这些参数的使用:
实例
% ^# }- G* G% n; F* t! P4 s+ g. R; S; j4 ?, h" }& @
  1. <div id="app"  v-runoob:hello.a.b="message">- l- A9 a$ d) E& Z
  2. </div>7 f& b& M7 I- s: Q( N$ A
  3. ; R7 f% ?: G+ @5 d
  4. <script>' c1 j7 K, i& }2 u/ N: `
  5. Vue.directive('runoob', {
    ) l& E. T8 Q; X# O) o6 @. |
  6.   bind: function (el, binding, vnode) {7 X+ X& Y0 Y9 M3 q$ C5 d
  7.     var s = JSON.stringify
    ; }8 |2 K) c  f& D' p) I. D5 ?$ _
  8.     el.innerHTML =
    ( {$ p9 S5 F, p* t5 G. l$ m& n
  9.       'name: '       + s(binding.name) + '<br>' +
    $ R* ~0 D" [. x
  10.       'value: '      + s(binding.value) + '<br>' +
    . q; P0 }. g2 {1 `' Y- [
  11.       'expression: ' + s(binding.expression) + '<br>' +
    ' E  E( W* L# {; \$ v
  12.       'argument: '   + s(binding.arg) + '<br>' +
    0 T1 Q$ O( \0 c2 }$ g% h
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    $ T% R5 ?2 r% a3 s/ O0 O# |
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    . Z2 K4 E5 C$ r2 J
  15.   }
    9 t' V0 n0 T; q$ l1 X
  16. })
    1 X$ B" H: [8 J5 N! Q/ D# M" N
  17. new Vue({/ G& m7 G9 u. J1 P5 t* `( v
  18.   el: '#app',
    0 G# b) K! P1 r( \, j1 F* J
  19.   data: {7 U9 T9 O$ k3 [
  20.     message: '菜鸟教程!'
    ! }. I- |  F2 e4 }: {1 Y  I
  21.   }1 w" J' W7 T4 ~" _& N. s+ c
  22. })2 n" {/ A& f0 u# _- j
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
8 C' Y, i$ P2 E: N) n9 ^3 {* [. l
  1. Vue.directive('runoob', function (el, binding) {! V  s' M/ E0 s$ [2 W0 W
  2.   // 设置指令的背景颜色
    , S3 S! j6 \/ T( F& X; z% w
  3.   el.style.backgroundColor = binding.value.color
    % J- e  F1 r6 Y- o: f9 i! B- m0 A& n
  4. })
复制代码
* I5 k: g" v0 {+ B5 u

% [( x1 r" z- n* v5 H/ @/ ?. O0 l
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
! ~4 u- u  `3 P# \
- o* o0 C+ r" N" k2 L7 b
  1. <div id="app">, M- x7 Y6 _' ^/ U- j  o& X/ J
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>- {2 s& P; V) Y7 Q; d  ^7 i1 ^) s
  3. </div>
    ) M/ c9 s! R% l  B. Z; Y

  4. 4 P5 g6 G! i# ?! r1 x" p9 M
  5. <script>- X* Y: j2 r/ B8 V, R1 m; k
  6. Vue.directive('runoob', function (el, binding) {0 x6 ~7 l7 ]& f9 Q
  7.     // 简写方式设置文本及背景颜色# ^3 V& m. _+ V6 J
  8.     el.innerHTML = binding.value.text
    5 P- v7 y, j5 Q% m
  9.     el.style.backgroundColor = binding.value.color
    ( B2 W: k2 K8 {. }, F1 t, t
  10. })
    : T/ x4 F6 n; Z- b( L2 u
  11. new Vue({
    , X) }$ R8 T" Z  d$ e6 Z
  12.   el: '#app'
    9 t% v8 y& q. a' n
  13. })- V3 b6 O& i7 F$ d
  14. </script>
复制代码
7 g$ j* [/ }5 W8 N1 ?

# A$ O4 v' U4 \; V+ H" E7 A7 w0 q! ~  _$ X  E: i
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 18:23 , Processed in 0.051452 second(s), 19 queries .

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