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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

; ?+ g) T  ?  ^8 H6 I0 x( t; N
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例* o7 f9 O! }* T# H/ Q, L: i& l

% J. `' J5 D5 D! R1 ]' |6 S1 m+ e
  1. <div id="app">
    ; j6 \% t5 @1 m! ~9 M  M: \
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    . ~7 H. i! O, c% e9 |, H
  3.     <input v-focus>
    ! c# Y* c$ B* j: @; g& t
  4. </div>; \# Y$ k- a! [/ X5 U7 L
  5. 2 d+ E% E3 J. F# r
  6. <script>
    7 [6 l$ d! T2 p3 {
  7. // 注册一个全局自定义指令 v-focus
    + n: h2 q) L+ l$ [- a" u5 {% R
  8. Vue.directive('focus', {! u5 w+ P5 D- h3 y
  9.   // 当绑定元素插入到 DOM 中。
    ; }( J& v& Y# q+ Q6 T; a4 e
  10.   inserted: function (el) {" ?0 D1 e6 t* T
  11.     // 聚焦元素
    / e- z) `" R5 j% Y6 S4 \3 L
  12.     el.focus()
    4 Y3 g! N( \1 C6 {# `/ n& R$ p2 @( H! z
  13.   }
    5 g5 n- v8 b$ @
  14. })
    4 u5 l- o/ f7 y2 F
  15. // 创建根实例0 H  ]: r8 W' G
  16. new Vue({% T3 s  I4 j! o' T
  17.   el: '#app'0 u! b+ I4 s8 \
  18. })9 o, C5 f" E' s2 G/ ?' J
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例/ G4 e% L3 v  x$ Q

  t" o8 X2 R  p$ m3 j3 B8 Z
  1. <div id="app">/ {+ G/ h5 g5 d) Z4 n( ?
  2.   <p>页面载入时,input 元素自动获取焦点:</p>8 r1 o- ^1 C( s) t9 u7 A
  3.   <input v-focus>
    ' w6 S# h0 o( U2 N
  4. </div>
    ! Q& g, y2 g5 `5 \8 _1 b! G' \- Z
  5. + ]5 \: @3 j& O0 |8 a
  6. <script>. u' m! N* G/ t3 K; W
  7. // 创建根实例  D* F5 D" P9 t/ Y0 R% e
  8. new Vue({9 J/ |$ a% u; h7 D; [" O
  9.   el: '#app',
    " u/ I' G6 W0 e6 E: k1 z
  10.   directives: {3 ~" D) O! g7 n
  11.     // 注册一个局部的自定义指令 v-focus- A$ H3 w1 ?7 b' t, }# L
  12.     focus: {
    1 U! K4 d. m7 s# ]9 v! D
  13.       // 指令的定义
    # W. a+ @$ B( s* v6 b' _) A4 ]0 S8 {3 y
  14.       inserted: function (el) {8 C, o* G! |! K  c  m4 a: S
  15.         // 聚焦元素
    $ b4 _+ @" l! a: Y. L; d
  16.         el.focus()' N# L/ K# t0 E& t
  17.       }
    # K% O6 Y- R8 j
  18.     }
    + I# Q+ }. E& X; F% U8 b3 V0 ~8 n
  19.   }6 M  @9 i( l4 ^. h
  20. }). S0 z( X8 a5 d3 X! X
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    2 o: H; ~" ^( H. E- R6 E4 p& 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 }。! w% m* s, f1 j. U! t2 c
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    , r; G5 }. V$ y- l4 V
以下实例演示了这些参数的使用:
实例
: M7 C" M- q: v2 E0 w- h5 Z# g* x0 A* i5 t' o. B  t% K: g' A( C- o
  1. <div id="app"  v-runoob:hello.a.b="message">
    3 b: P5 b$ E2 M: Q8 y" o* S, D/ g
  2. </div>
    + d' u4 P$ M$ x. R& U5 O9 n  {
  3. 3 i/ f# g( ~" D( q% w, |1 P2 y; P
  4. <script>% {5 T  Q, ^+ s) }/ B
  5. Vue.directive('runoob', {
    ) R8 S" L# M" w! ^
  6.   bind: function (el, binding, vnode) {
    ! ]# \% @2 C! x: }6 e8 W0 s: e
  7.     var s = JSON.stringify' ^8 O& _0 ]+ S8 r& C; C
  8.     el.innerHTML =' D1 n- Y+ y: q* O/ n. v; t
  9.       'name: '       + s(binding.name) + '<br>' +. i# N$ K! k2 L5 [& S/ Y
  10.       'value: '      + s(binding.value) + '<br>' +1 F! d7 r  R% z* Y' k* x
  11.       'expression: ' + s(binding.expression) + '<br>' +1 H* F. Q0 C  d$ Z0 {
  12.       'argument: '   + s(binding.arg) + '<br>' +/ O4 @6 L0 I% z: I' J. r
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    9 }' ?0 P8 l5 W3 R; M
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')& U% z  |1 J3 R0 g, E
  15.   }" ~; C* k& G) a0 ]4 Y8 s
  16. })% l; O7 e# C* @# t2 Y
  17. new Vue({! k# Z) w7 `. G1 o
  18.   el: '#app',; I  _& n2 B9 g0 j5 Q4 i& {6 E
  19.   data: {
    8 k; Z; _( k( }5 p0 Q
  20.     message: '菜鸟教程!'
    , s9 l- d( z/ }7 W: ^) R
  21.   }
    ' _) U$ v4 z  r% G/ ^
  22. })$ p( [% U! t* b$ f2 j4 l
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
. N/ C0 o2 _: S) K. b/ L( t5 Q# a
  1. Vue.directive('runoob', function (el, binding) {
    # b7 I6 V& P1 r$ a! w- B$ s4 X
  2.   // 设置指令的背景颜色2 F# V' O3 Z9 I5 V+ s
  3.   el.style.backgroundColor = binding.value.color
    ! [& H; [8 ?1 {/ c; ^
  4. })
复制代码

, u( E1 M3 w  p# {( k, Z; s
( |* o/ F) I$ u2 I  Z% y4 b
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
) K( G  r& B  f( c# ^+ ~, l5 k! D* s" U" I2 p. F9 L5 ?& G
  1. <div id="app">0 L0 a0 T9 i" g' g8 {( ]5 m
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    , T* E6 Y/ i% W; l
  3. </div>
    9 m' S- D* `- f. F
  4. $ }- k2 t2 r6 s6 X5 j$ ^$ [
  5. <script>4 c. l& `2 t/ X+ T
  6. Vue.directive('runoob', function (el, binding) {
    * x0 }- M9 k7 ~! `* @7 j
  7.     // 简写方式设置文本及背景颜色
    ( U' x) M1 F# q2 z" j- o
  8.     el.innerHTML = binding.value.text" }  S/ V, [7 E1 ~+ L% k% [/ j
  9.     el.style.backgroundColor = binding.value.color( Q* w# k# }# p  p
  10. })
    & F5 c) d+ d8 F' G
  11. new Vue({
    ) f) b2 s  e6 H' [
  12.   el: '#app'  U8 S& H! m# ]
  13. })* i$ h  i, [, [6 \
  14. </script>
复制代码
; s6 w' x( n- L: L
) V  e: D1 l! ~7 `1 v% W
1 t7 w% P4 ?9 T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 16:06 , Processed in 0.110282 second(s), 20 queries .

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