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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

+ f* W7 Z) f1 K5 i* l
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例2 b  Z, j$ T& n) c5 k# h

+ I/ l8 J/ E7 F2 s. l; z& P
  1. <div id="app">/ P& [& n. K/ t! o( a/ c
  2.     <p>页面载入时,input 元素自动获取焦点:</p>$ A, P4 h# G& G% [7 P7 t$ u
  3.     <input v-focus>% G0 G8 y% t. m9 Q! ]/ a
  4. </div>* M" r& v* F4 N2 S$ S0 l

  5. + h" i. J$ e) n, ]. M; o$ d
  6. <script>5 Z! N+ @+ g! n& h/ {+ h
  7. // 注册一个全局自定义指令 v-focus/ ]1 t$ D% C. k! Y4 B
  8. Vue.directive('focus', {
    9 N. d+ l: r' u3 l* q
  9.   // 当绑定元素插入到 DOM 中。) S6 [( T" f& G1 y
  10.   inserted: function (el) {
    ) Y  ], I4 }" G: Q4 r3 R  l' I
  11.     // 聚焦元素5 c! b" {& h: S5 F8 }
  12.     el.focus()
    ' M7 N3 E* S: x! j/ d
  13.   }- q5 R8 ?$ n0 G- p
  14. })" ~7 V, w4 f5 J
  15. // 创建根实例
    ( a# S  X6 E1 Z- B4 V3 V: z
  16. new Vue({( j9 C3 G: |) v; {
  17.   el: '#app'" _0 P. p. d  z% j
  18. })
    0 \3 j2 ]+ _  a0 d1 T: ~' _/ I
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
, U) T! U" j# |. h: v' e6 n6 Y# U/ q) U. }. H$ F6 V9 f% y
  1. <div id="app">: ~! H: R1 j+ Q) u# x4 D
  2.   <p>页面载入时,input 元素自动获取焦点:</p>7 P! n% D% ~; [! |4 v
  3.   <input v-focus>4 W, X7 U+ T  ]
  4. </div>- ]5 v3 E5 s1 L2 n2 B+ L+ w

  5. + L6 I% w- h: X; K+ N- u- Q# M
  6. <script>
    ) Q) g! m( y2 ?$ b2 ^- u
  7. // 创建根实例+ [8 V: ^5 E. Z% a4 F
  8. new Vue({
    5 D( W1 d  d+ c) w+ O
  9.   el: '#app',3 G6 _/ @2 \, Y4 _
  10.   directives: {1 a& n+ v8 ^1 l
  11.     // 注册一个局部的自定义指令 v-focus
    1 i/ f; T8 ]( u% u( x; ^% q) G
  12.     focus: {
    ; E& g- y1 o$ ?1 D3 a& K" |1 e+ Q8 X
  13.       // 指令的定义9 B8 Y( \, \9 M8 u2 ?
  14.       inserted: function (el) {# \9 N( d! {) ]
  15.         // 聚焦元素/ G, n' X  L9 d
  16.         el.focus()
    6 M1 A7 [0 e" M3 h! t2 b# @
  17.       }, G6 g' P4 i* e- V3 ]- t
  18.     }
    ) z4 E8 r' o" S6 O' [, m
  19.   }
    6 ^# c- J( {* K
  20. })
    - K) K% Y3 q, |1 c/ ^% H9 _* r: p2 q
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    $ e2 v+ m, ~3 H$ J9 _' @/ d8 `
钩子函数参数
钩子函数的参数有:
  • 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 }。- n0 v' {  C* T7 k+ A& U( \; s
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。; {6 C' H6 y6 a
以下实例演示了这些参数的使用:
实例6 [# f7 W$ U5 h# X9 i7 i& [

3 u) @! q9 O6 g
  1. <div id="app"  v-runoob:hello.a.b="message">
    6 R5 R( n0 m, R% o* g
  2. </div>& x- j, {! G, _* B) z

  3. * O5 z/ C" f7 W& [3 Z7 H# J/ i
  4. <script>
    * N/ [+ x- s0 l& F! z
  5. Vue.directive('runoob', {
    % ~# ~5 N1 h: j' Q% e
  6.   bind: function (el, binding, vnode) {" e! N3 l* A5 @' p* }
  7.     var s = JSON.stringify
    2 _7 {! ?5 [) U7 }9 C" m6 D$ p
  8.     el.innerHTML =
    3 w8 b5 p* ?3 v" E% w& j" @
  9.       'name: '       + s(binding.name) + '<br>' +. O  K! X8 o+ P4 c" p; D5 }( T
  10.       'value: '      + s(binding.value) + '<br>' +* T# e# d5 P' G$ [$ \0 M
  11.       'expression: ' + s(binding.expression) + '<br>' +
    4 z4 O5 x9 D; P5 R
  12.       'argument: '   + s(binding.arg) + '<br>' +/ I. @& C( a, `# X8 u
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +  j1 T: m1 H5 `: r+ @- l! s) ^& M6 i
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
      c! P5 \& |2 A' ^8 K) }' O7 w/ _6 o
  15.   }& E8 y# m5 [4 `
  16. })4 O- T" V9 T" C4 i1 }- @
  17. new Vue({- ^) S+ o8 X( ]5 @  P. H( r2 }" q
  18.   el: '#app',
    8 w2 V4 ~( ?0 ^: b* c1 H8 ?  b( g$ ?0 k
  19.   data: {2 d  q0 S  ~7 f' J5 K
  20.     message: '菜鸟教程!'6 O" L) l0 T3 ?$ }. v+ m
  21.   }
    , N, Q, L4 H0 u, ^. d
  22. })
    2 E2 {9 S! g; j+ z$ z7 I8 y
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:, i( P. v0 w7 C: ~' W+ n6 @
  1. Vue.directive('runoob', function (el, binding) {
    ) \% v5 V. F4 }2 N* a7 ~
  2.   // 设置指令的背景颜色- w# a9 |) H8 f1 B, Z( C
  3.   el.style.backgroundColor = binding.value.color" Y4 U* E8 o8 K% p  `
  4. })
复制代码

3 y4 F' J% E1 N0 S9 [& {5 M  y. F0 \: s/ I. g$ g$ d( j1 H
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例* {3 {2 k1 Y) c* R# m
6 ^1 q( r+ b- x/ D  a5 x; O
  1. <div id="app">6 l5 l5 T  e% V' N9 ^2 o
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    " ?( f0 `$ o; Z; n7 C" S
  3. </div>2 k. p# u2 b6 G
  4. * R' |+ ^" A* v$ w* |
  5. <script>+ s1 d" t# P2 F" J5 w
  6. Vue.directive('runoob', function (el, binding) {3 e& O% e' N& W  Y3 J3 D" u: [7 y
  7.     // 简写方式设置文本及背景颜色& b  f( @; _5 i7 e* a- H
  8.     el.innerHTML = binding.value.text
    & `: r% @7 L6 E. {5 M$ w( y9 A
  9.     el.style.backgroundColor = binding.value.color$ S8 f! l: f) l  J
  10. })
    & y7 ?& a- A- G, r# W0 k( c  p; T
  11. new Vue({
    0 j+ o3 h" I+ s: V- T1 v2 g
  12.   el: '#app'
    % D$ r7 A! u* w2 H  L  [
  13. })
    / q+ r9 U% P! t: [: W* q; q* X+ H
  14. </script>
复制代码
- o# p+ b* S, _5 _' S0 L
  `" c7 m( f3 W

0 |$ e; o+ z# O" X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 15:04 , Processed in 0.063584 second(s), 19 queries .

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