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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

- d: u/ Y: M' j/ l. z
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
; |% J: t/ u! g8 k& a+ r/ K  h' e; \$ @5 d- J% J+ v
  1. <div id="app">& r# p6 D' e2 j
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    0 F6 Y& h( m7 z/ c$ K
  3.     <input v-focus>
    : x" \, R: w- X4 o9 _
  4. </div>
    : y' O5 E' h/ F) X4 y4 x+ ~7 J& K+ N' z

  5. ; |2 U7 W( q$ j4 Y$ v: V6 Y9 A
  6. <script>
    , V4 J, i2 O" p2 P  E' u
  7. // 注册一个全局自定义指令 v-focus2 Y- N" q; n5 _- B9 S2 l+ d
  8. Vue.directive('focus', {
    1 I6 A* m/ d0 S; p. W
  9.   // 当绑定元素插入到 DOM 中。
    , c2 o+ u0 f' {3 B
  10.   inserted: function (el) {
    7 n* N3 s; ~# q
  11.     // 聚焦元素% Z& l! k5 V4 R' ~9 q( `
  12.     el.focus()
    : H. M9 ^( `: }) t0 v
  13.   }1 j$ c, |; |$ l2 i
  14. })
    " x  p* W# K& S. j; V, o! Z% I
  15. // 创建根实例$ ], A9 q% V6 @6 E# d+ q1 R
  16. new Vue({
    1 {* h" ^0 V+ _. L
  17.   el: '#app'
    ' G0 [9 y7 W2 T5 ~7 A( C
  18. })
    4 D- h& e5 S+ v* l  l* n
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
7 P" [0 w, q) q$ U! p5 N* U
5 m' b2 d7 ?/ m9 B
  1. <div id="app">
    , U6 R3 Q5 Q  B; B
  2.   <p>页面载入时,input 元素自动获取焦点:</p>5 d/ s) F% ^$ h6 @% v# i
  3.   <input v-focus>  Z! g/ `8 ?- j" T0 h/ P
  4. </div>6 A: B  [! W+ f' m
  5. ; x( v) h& ^$ I' n! _) D- D: Y8 F. k
  6. <script>/ f5 d! i1 u- O5 q5 h
  7. // 创建根实例0 `/ l# N( r5 t- U- r4 T+ Q
  8. new Vue({. G% W- z: O6 X3 u) {7 |  Q
  9.   el: '#app',
      \( q* K# S/ u- C
  10.   directives: {+ w2 I$ ^' e6 I) ^' s
  11.     // 注册一个局部的自定义指令 v-focus0 h" v: A& `, X2 T7 O. M
  12.     focus: {
    & G; M7 ~, {. {" U
  13.       // 指令的定义
    - W' n- [2 Q- i' g/ H
  14.       inserted: function (el) {
    9 M- S$ H* B) k1 V
  15.         // 聚焦元素- W+ A7 h( U( _0 u
  16.         el.focus()
    ) A; _- c, v3 n
  17.       }
      e9 V& m+ n$ h/ i2 I: _& d) [2 Z
  18.     }
    3 Z. E" Q+ V5 Z$ k
  19.   }
    . |! a# p! P- N# W8 s  h
  20. }). ~, y% {) I1 O( g) b( P" q. c4 b
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    4 f1 r4 f9 z0 |. L
钩子函数参数
钩子函数的参数有:
  • 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 }。6 I: E1 r" b' U5 ^
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。7 L, V4 i2 Y/ a6 e
以下实例演示了这些参数的使用:
实例
! l% b( A( I) P. W4 K
  s( `( ?# n& l* \
  1. <div id="app"  v-runoob:hello.a.b="message">
    8 n/ \) F) h) }) d6 E& B& w5 l2 w
  2. </div>2 s$ }4 D4 x+ `5 x
  3. ( R' i; ]/ {/ H; @/ R' I- O% L
  4. <script>, X* \; L: V( T8 O6 ?  C. j
  5. Vue.directive('runoob', {2 k5 L9 A: l  q3 k/ P7 z. J
  6.   bind: function (el, binding, vnode) {
    " c4 H/ q. f+ A6 y$ V2 D* {
  7.     var s = JSON.stringify7 T9 n4 o, V% U0 x: H6 i
  8.     el.innerHTML =
    1 X, B1 M$ Y. s5 F: r/ y+ Z
  9.       'name: '       + s(binding.name) + '<br>' +" [2 A# L* W7 k- l5 v4 r& @3 F
  10.       'value: '      + s(binding.value) + '<br>' +
    7 I5 @  H/ w+ X& F4 N5 b
  11.       'expression: ' + s(binding.expression) + '<br>' ++ g# |4 e2 N* P6 ]' l
  12.       'argument: '   + s(binding.arg) + '<br>' +' B, ~9 c8 P8 _: n( u- U9 g( Y
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    / m+ L; u! K- Y9 B0 L  T
  14.       'vnode keys: ' + Object.keys(vnode).join(', '): G; @# J# k) h$ h- i5 [" K' H
  15.   }$ I4 {5 O9 F" ]
  16. })
    : B2 I4 [( v8 p. A
  17. new Vue({' a$ S- R5 j0 `3 R; J
  18.   el: '#app',
    * f6 @- e% L' n  V' n) t
  19.   data: {6 D' n0 _; z3 k- A8 D* P- O+ G/ v
  20.     message: '菜鸟教程!'1 [* Y& [1 ^+ R2 _. B
  21.   }: M- t* O& {$ o0 w
  22. })# G, r0 S% ^3 W; w: `' @) t+ Q
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
& Y2 }+ k. a$ g# |: J
  1. Vue.directive('runoob', function (el, binding) {2 W% R* I1 G. ]) m7 ~! v% {+ G
  2.   // 设置指令的背景颜色
    + [+ a+ T  g2 S3 ?; `
  3.   el.style.backgroundColor = binding.value.color; Z: |& r! H* b$ }6 c
  4. })
复制代码
, m" k( F. Z/ ?+ q5 [
* l3 h4 [. ?5 J9 t5 H- C6 H
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
8 D& i/ R  Q- R7 F! l' E: p. b* ]* h" j0 Z: f4 ]- x
  1. <div id="app">
    + r/ g% E6 f. a9 m
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>! U9 z( \0 \- {- X
  3. </div>; J$ r9 {. k0 L
  4. ; j* F' G- z  f- X: [! X
  5. <script>& v/ F  \: A8 g: U- ?! n' r1 H
  6. Vue.directive('runoob', function (el, binding) {/ |) e2 Z7 v9 `+ k! x9 w4 a3 v
  7.     // 简写方式设置文本及背景颜色1 O% w% x" V) ~( M7 C1 [7 H
  8.     el.innerHTML = binding.value.text: s4 c5 A8 x/ K# K) e
  9.     el.style.backgroundColor = binding.value.color! m. v! ^1 ^: p. t9 H
  10. })8 h8 c9 m4 o, c  N1 j
  11. new Vue({
    + c% S3 \+ l' ~7 {6 d+ e. B" b
  12.   el: '#app'* [! G. d; u( Y, B8 t
  13. })3 P: w# y) D1 x. j  l3 Q' N% Y
  14. </script>
复制代码
9 d# [: Y& e6 A) v+ u! g
% [& U" v6 U( T* k/ U
, `* h% Q1 T$ I/ j- C/ {; a- h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 23:59 , Processed in 0.062556 second(s), 19 queries .

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