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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5 a1 z/ Q& B8 A% W" Y! X8 w3 T7 @
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
  y* g" D7 o! S# @7 r) o! h7 j" T/ W& Q
  1. <div id="app">6 ]* |1 L7 S# U3 V5 a/ D+ m4 x4 j
  2.     <p>页面载入时,input 元素自动获取焦点:</p>4 W* k7 _$ j: R2 O
  3.     <input v-focus>
    2 q9 [, X1 o9 e9 W4 B8 Q$ o
  4. </div>' }0 t6 L5 D# ~. r& S+ c9 e# ^
  5. 8 _9 g# o4 W% B' K7 b
  6. <script>2 j3 H3 F  J  m. \& F4 f
  7. // 注册一个全局自定义指令 v-focus
    5 `8 D1 W0 O( y' K- R
  8. Vue.directive('focus', {+ B8 q  M4 c. d# e
  9.   // 当绑定元素插入到 DOM 中。5 E  J# v- z0 v. a5 }9 ~; I8 D
  10.   inserted: function (el) {+ b6 n4 o: g& l% X" |
  11.     // 聚焦元素( X) B9 [) t0 G' |" c& i, @3 R
  12.     el.focus()
    2 t3 l+ E, i0 e
  13.   }8 M, Q" T/ @3 b" u
  14. })
    1 d7 o, W; L( s# k6 s
  15. // 创建根实例
    ! x$ O* l+ F6 W7 y4 A
  16. new Vue({
    : }# F0 v- C$ r: f& W% L" m
  17.   el: '#app'
    9 s7 X* R4 L1 X$ m
  18. })
    3 l( z. A1 s; ?2 ]) {5 d3 t
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例: C& g7 }1 F  B6 @% x% f3 `4 F
, q5 n, `  F; n4 c! d& Z* l
  1. <div id="app">5 l! ^- S& k6 x& r- F
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    9 x9 I* ^$ w2 O, l4 Z, |$ v3 b
  3.   <input v-focus>
    * l7 M, }1 y& K" c9 R/ G& L
  4. </div>
    / H! i& d- w* ]7 S2 M( n

  5. / V/ h' j  }/ b0 g2 B/ I% W5 b
  6. <script>
    + J% n+ v1 {* F3 w6 v. |
  7. // 创建根实例
    . h* A2 Q# S5 d, Z
  8. new Vue({, S. l1 V; b4 O# m
  9.   el: '#app',
    4 z. {) L6 N$ g- e9 A; o2 r- i
  10.   directives: {2 D. V8 a; Z' u3 d4 v% |  H
  11.     // 注册一个局部的自定义指令 v-focus6 Z# d7 T. E$ Q) m" s
  12.     focus: {
    % _% P7 g$ X' }6 i
  13.       // 指令的定义& O- n% P) G9 I  H' O
  14.       inserted: function (el) {- q6 n* W( C( I' @' V
  15.         // 聚焦元素
      x9 w" E: y( C8 q, i2 ]
  16.         el.focus(). }6 a# P/ N! o& D# B* j) F+ k% U
  17.       }6 O. L$ `+ _( U- g9 r) h. _
  18.     }
    6 K+ Q/ B0 x/ h" e2 C: B
  19.   }
    ; g  y, S$ p# @. |' ^
  20. })
    # c" {# [7 Z# v4 O
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    ) ]% W( z3 ^$ S5 d6 W- d
钩子函数参数
钩子函数的参数有:
  • 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 }。2 w; j5 B% O4 w8 D1 c+ E
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。8 @; P/ Y5 G1 b
以下实例演示了这些参数的使用:
实例4 i. S# H8 b) b4 y8 ?, |4 N* A

: k3 E' i$ j% D2 m: L, y8 A' Z1 _
  1. <div id="app"  v-runoob:hello.a.b="message">
    ; E: k, }5 _6 E3 M% M, @: G
  2. </div>) Q. f% ?, z; Q& n; F! H4 ~" Y
  3. ; V0 e7 G- |9 t% s0 q* F* B
  4. <script>4 q( W( E0 x; m; {% c7 L7 ?
  5. Vue.directive('runoob', {. u/ u' ~$ b  e7 v
  6.   bind: function (el, binding, vnode) {# |9 `1 j) d( b$ P( x5 b/ D( A
  7.     var s = JSON.stringify( G* E% P, w( {
  8.     el.innerHTML =
    9 y) c( ?. v1 ?
  9.       'name: '       + s(binding.name) + '<br>' +) t# ~, ?5 q3 l# \, @' X
  10.       'value: '      + s(binding.value) + '<br>' +( D* }4 Q2 O$ D9 [. T: e: |: l4 }
  11.       'expression: ' + s(binding.expression) + '<br>' +( k; j" m) F2 c  c
  12.       'argument: '   + s(binding.arg) + '<br>' +
    - q/ K/ g% S9 b1 h6 E3 z
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    $ [: G* o) h7 |6 g! F/ q
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')* e8 F- K6 {! S% ~/ H& G
  15.   }) X7 k" \$ }  N8 t& p% D3 h. ~0 Q
  16. })2 I9 r% ^! l* Z5 ]3 q, r
  17. new Vue({+ ~0 Y  _% s+ b
  18.   el: '#app',
    $ x  \6 P2 s" f, o/ E; X3 t- C7 V
  19.   data: {! I& _% F" z" o" K' I
  20.     message: '菜鸟教程!'
    1 g; G/ C/ t6 T! p3 _( Z, c
  21.   }" w# |; s/ A1 Z0 u: O1 W; R
  22. })
    $ L# A* \8 v' e; P' {, ?( q1 L
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
7 L5 A, \5 _8 ^+ X' Z9 C
  1. Vue.directive('runoob', function (el, binding) {7 j% u7 X2 |' |/ g, i9 d  m
  2.   // 设置指令的背景颜色: P7 q3 ~9 |, K* l
  3.   el.style.backgroundColor = binding.value.color6 q/ V" B: B0 H/ s& z7 m
  4. })
复制代码
: Q- j' F; X0 [! Z$ D, N

& V2 r1 G8 h5 W) O; a
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
  [; c3 o. a+ [  q; C& H3 D6 ]1 V; ?
  1. <div id="app">5 T4 [1 t. _& I9 R) r- b. n7 ?
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    + a5 }7 Y" f3 K( z7 z
  3. </div>
    / d; F! T+ M+ M/ k+ ?+ f1 F
  4. 1 T: \  ?" Y# o7 d
  5. <script>
      i$ R  B  \" o5 |- L% K
  6. Vue.directive('runoob', function (el, binding) {7 a/ f0 B; z; }( J. x, D+ }
  7.     // 简写方式设置文本及背景颜色
    1 L/ O9 C, ]- ^
  8.     el.innerHTML = binding.value.text- e/ W' B' K: i7 o  B. t' y4 ^+ k
  9.     el.style.backgroundColor = binding.value.color  h% h. s% ?) U9 b7 C; Q
  10. })2 x/ p' X( O' o. @; V+ ^
  11. new Vue({' {) U. w  P- m3 a' b
  12.   el: '#app'- J2 J/ M- l* R0 ?! j  |! W9 v- U
  13. })
    * ?% p' O& R& h0 W' ]3 O
  14. </script>
复制代码
- n# c5 O+ T) P3 _4 b* ?% f& G, X
8 X. U* {: f8 z& Y/ [. f% _; m

% \% @" f& g" p* {- y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-11-1 09:33 , Processed in 0.129046 second(s), 22 queries .

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