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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

; `$ O' ]6 e6 n
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
) \. V. ]% d* R2 d6 n- c6 S- {. X4 r+ ^+ N; T: P
  1. <div id="app">
    0 D- X7 ^9 @% q0 {5 s
  2.     <p>页面载入时,input 元素自动获取焦点:</p>) L/ ~7 {* c, l% }
  3.     <input v-focus>
    3 [  x! t/ a+ T; R! i) w
  4. </div>
    ; g  b3 s; ]! d$ v; D% W7 S
  5. , d5 W, ^5 h, `0 n( U
  6. <script>
    1 D: G0 q* T, y% t1 h5 i( `
  7. // 注册一个全局自定义指令 v-focus
    " t- q/ w& G& Y3 m' y' e' T& [6 ~
  8. Vue.directive('focus', {
    : K9 V. F. [+ j( w4 u$ |% y! q
  9.   // 当绑定元素插入到 DOM 中。" v$ H% E9 f- E; [* X( J
  10.   inserted: function (el) {9 m( \; u, U% X. t
  11.     // 聚焦元素8 w0 O' Y# [& A6 ^4 m, w0 `. M2 U- P
  12.     el.focus()
    4 K, H$ h* G2 H1 b
  13.   }
    " q5 h8 l) |, E, |0 T: B
  14. })
    $ V0 T% R+ h& m8 ^$ z" O+ B
  15. // 创建根实例1 T' X% O' u9 I, {. f9 ^
  16. new Vue({
    & ]& w! _& l, a+ J, f: Y5 j: z& l  m) {) f# _
  17.   el: '#app'
    ( u* Q2 ^5 ]( T+ u
  18. })
      h  @* Q3 H  d# C4 Q3 ]1 U( A
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例1 E+ B+ |1 e, b$ e

" c9 Z4 _2 Z( g; w6 K% C
  1. <div id="app">! Y; w9 l7 p2 h7 L. {: @
  2.   <p>页面载入时,input 元素自动获取焦点:</p>) @* A# K! i4 z, \( C
  3.   <input v-focus>& v; v& T: x8 c0 J- ?
  4. </div>; W% a- r9 E4 i9 Q' t& q

  5. ! K% N' Z) ~3 e5 g
  6. <script>
    ) u; t0 i$ Z, y3 n4 h6 n
  7. // 创建根实例
    ) v; a5 m: u2 ]7 `3 l% w$ L
  8. new Vue({4 p# t0 Y3 Y" X. g4 i
  9.   el: '#app',
    # m8 T2 i+ Q. T. H) v& d. x
  10.   directives: {  m) @9 U# J% {
  11.     // 注册一个局部的自定义指令 v-focus
      F3 y1 C* _5 f/ p2 a- e' Y7 k
  12.     focus: {7 h1 R) W) {1 E1 v- G' P
  13.       // 指令的定义
    1 y9 T6 D6 u# h: \- k" Y8 M9 Z& u
  14.       inserted: function (el) {
    + d: `* U0 Y1 W1 E( O- q' T
  15.         // 聚焦元素: m/ D' v- P! m% q$ r) L. ]) j
  16.         el.focus()8 y2 P4 @& I  ~2 r
  17.       }
    # p) F! O! `. b+ L5 v
  18.     }
    % g% ~& @+ F2 `- N. J! e) D
  19.   }
    / O4 M& Y5 w' |# c& U
  20. })
    " R) j/ q, u) J6 v. u
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    $ y- d& K( G4 ]' K
钩子函数参数
钩子函数的参数有:
  • 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 }。
      ( q5 K( t' v, U# r1 d
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    4 [- v5 X6 x# b9 _+ F% C8 }" s
以下实例演示了这些参数的使用:
实例. G5 A* J6 n( D' }/ C( V$ S

( W) z# A" X/ Q1 B
  1. <div id="app"  v-runoob:hello.a.b="message">
    : `8 \1 T2 S* m- f/ h& e
  2. </div>6 T' Y4 `" n8 r% P% H: e( r

  3. & \! u" D8 P1 w
  4. <script>8 @+ A$ o* B* P! A; `. p
  5. Vue.directive('runoob', {
    ; V! l1 d2 K. Y) n$ N1 K! ~
  6.   bind: function (el, binding, vnode) {4 Z' O% Y; F: _1 _& E
  7.     var s = JSON.stringify* h( w* d4 Z5 k
  8.     el.innerHTML =
    6 J% u2 w& P# h7 V; ~. \* p
  9.       'name: '       + s(binding.name) + '<br>' +4 g0 y& W' U% Z' _
  10.       'value: '      + s(binding.value) + '<br>' +
    : ?/ C" r1 T5 O( \' R3 l8 H; h
  11.       'expression: ' + s(binding.expression) + '<br>' +. A5 j$ x6 [% K6 X& P
  12.       'argument: '   + s(binding.arg) + '<br>' +' c: |4 s( o9 T7 a
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +8 s& L' w: R8 d$ g3 Y& i+ q
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')/ R9 @9 ?# Z* `- v  s' I, {
  15.   }
    7 a  P" i( V$ }+ X$ y$ k
  16. })  n: J3 C8 e( A2 \, W2 T+ |
  17. new Vue({! [  ]- Q" W" V; l
  18.   el: '#app',
    3 F, O$ N, u6 Y$ |
  19.   data: {
    1 K6 W# f- z& {
  20.     message: '菜鸟教程!'0 g( C. _" w- i7 @
  21.   }
    ' @. H" K7 ?) y0 t
  22. })
    9 R! Y! ?+ Y( i; h6 \7 ^1 p
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
' \) V; `4 t: v" ]! k) n( e, e4 s
  1. Vue.directive('runoob', function (el, binding) {/ ^& c8 p( C# b# |0 r( i$ C
  2.   // 设置指令的背景颜色
    9 d+ L9 a( x" h" V# S
  3.   el.style.backgroundColor = binding.value.color# ?. Q0 M6 ?  I, |2 ]& n
  4. })
复制代码

; r0 ~/ O& W+ G/ Z$ A: ~2 A5 U6 [) Q  c. G
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例# t* ], R! [! v: R- n8 }- w1 g" O
/ ^# X+ V4 N9 W. R: I# ]
  1. <div id="app">
      I( D2 n$ `( t5 g. V
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    1 u" q5 a6 ?7 B! q" Z0 o& V
  3. </div>
    % t2 u: F; E9 G5 ~' L
  4. 9 A. @$ B# n5 |5 D$ G+ ?
  5. <script>' y9 l: \. D; i/ h
  6. Vue.directive('runoob', function (el, binding) {
    - d* p& v+ D0 G! ^
  7.     // 简写方式设置文本及背景颜色, b& o8 `- r" `8 E% F1 }- ~
  8.     el.innerHTML = binding.value.text, m9 k( `4 }, j3 D
  9.     el.style.backgroundColor = binding.value.color) q% a' r8 F: T' x
  10. })
    5 l8 u% w+ g/ o' d  `6 k6 E
  11. new Vue({
    3 q9 w! L5 j4 b- `! C$ n9 g0 [& O
  12.   el: '#app'
    2 k! C" h* t' @- _2 \
  13. })5 \3 }, M" `) t
  14. </script>
复制代码
' Y5 @$ k/ z( {/ d# q  W. d

6 ~. S/ t/ w( h* k  ]7 R, c. ~7 \/ F( b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 01:24 , Processed in 0.053706 second(s), 21 queries .

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