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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

( E" V) F- h( S3 Q- t
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
& g3 @% y4 a- X  E# K% y4 e* @! Q* A' N
  1. <div id="app">3 L) M2 N/ `* N: ?. I% ^- o
  2.     <p>页面载入时,input 元素自动获取焦点:</p>' a4 B; ]  I4 g$ F6 ^) Y# W8 d4 Q
  3.     <input v-focus>
    & V' w' K) s% o0 \- o! J8 F
  4. </div>
    , `  _8 V/ j3 g2 }0 p. ~" ~1 `9 U
  5. 3 Y. o/ T  Y8 P$ _
  6. <script>% M8 c7 h* r7 l; [$ ^: t, J
  7. // 注册一个全局自定义指令 v-focus
    , H: w  H2 }( \$ t  y3 N: w; p1 l
  8. Vue.directive('focus', {
    2 c0 d! J# R6 s0 F# B$ ?' P
  9.   // 当绑定元素插入到 DOM 中。
    ' l( @2 [+ j/ P+ S  [
  10.   inserted: function (el) {; A+ I( i3 [! A
  11.     // 聚焦元素
    / x7 ?. J+ k+ Z8 s; J" k6 r5 B
  12.     el.focus()5 x% ?2 p/ p7 ~9 M
  13.   }. K# G, O: n4 j( ^5 {
  14. })- J7 d+ y; [: X# m" U
  15. // 创建根实例8 P5 H6 r8 @' Z( ^0 o
  16. new Vue({6 |: D/ M' {1 U1 N! P  _
  17.   el: '#app'
    # F9 d6 e- p2 F: ?8 n
  18. }), @' [0 f# d$ E, y6 f
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
3 o; d3 k/ X( V  K% P$ y  v% y0 y4 u7 Z0 Y% N6 O9 F% }; b
  1. <div id="app">
    8 O; s& b3 a- \, y9 O$ c
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    / F' N- f, d$ l: Z6 C
  3.   <input v-focus>
    & L1 R+ R% t. E
  4. </div>
    ' @( g. c; r) a3 X0 Y& u. q
  5. ; b1 q( L( g( C; i5 F8 }
  6. <script>8 B' E% g1 F' l/ Z1 z' O
  7. // 创建根实例
    * g9 ^7 V, E# @5 T2 ^* q* X' z9 k3 V- Y
  8. new Vue({
    0 f2 q( F( W; s: B3 J; o0 s
  9.   el: '#app',0 n4 @! O% e" `- c$ N: t
  10.   directives: {
    , E/ K+ \3 c! F( f
  11.     // 注册一个局部的自定义指令 v-focus
    7 n, Q3 \: K# L3 O
  12.     focus: {  v4 q- V( Q$ P% t4 @0 C; G
  13.       // 指令的定义2 x% J" L7 n8 q7 [
  14.       inserted: function (el) {: B8 i$ Y* M0 d2 a7 E' v# ?) M+ R
  15.         // 聚焦元素
    5 L' M2 M3 {* D9 m' g  ~
  16.         el.focus()
      s8 M8 `" @6 S) k, K
  17.       }" \1 ?; i$ H* J8 ]
  18.     }
    3 N. j) ]: R& f- K0 T2 M1 T* Z7 q
  19.   }' c" [6 ^. o4 \* W: u& s+ x
  20. })$ }' p0 c8 U0 C. e4 o1 K# C
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    ' ^6 Z# z# y. ]
钩子函数参数
钩子函数的参数有:
  • 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 }。
      ) G& E+ w9 o6 x# S9 J
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。, X) g# S  z: ]. f) T; O, j8 V( n
以下实例演示了这些参数的使用:
实例
% O; b/ i5 h2 ^' a4 d; x8 l2 r, B2 k4 d
  1. <div id="app"  v-runoob:hello.a.b="message">; F. n" |7 @8 H$ b
  2. </div>( {: K. t1 P: l# U$ C" z
  3. ' R# ~+ t5 h% e* k
  4. <script>
    ) z, `0 X0 K. X/ [1 {. ^0 y1 Y. \
  5. Vue.directive('runoob', {" c+ c2 d+ p! P9 z9 R6 r$ H
  6.   bind: function (el, binding, vnode) {4 S( @% L9 m( V- l
  7.     var s = JSON.stringify8 q5 C" \2 y3 k) E8 k" Z- r8 j; L
  8.     el.innerHTML =" `& E7 M5 {$ Q: Q" B  |# _
  9.       'name: '       + s(binding.name) + '<br>' +
    2 g. `. _1 a, P$ |
  10.       'value: '      + s(binding.value) + '<br>' +: m6 A3 ~% f. J! m
  11.       'expression: ' + s(binding.expression) + '<br>' +) i7 W9 g4 L0 ^. I0 ]
  12.       'argument: '   + s(binding.arg) + '<br>' +9 d5 W6 `, n  w3 C
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +: V0 I+ [( g1 ~7 n
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    ' T- ?* C, Q4 [. H/ R
  15.   }" H+ X  V: q, h$ G9 A
  16. })
    : }; ?. z; m7 ^0 V' C) r) c8 l
  17. new Vue({
    ; n+ J- Y: R$ f5 m
  18.   el: '#app'," k2 L  I* z/ N" m7 v: r  q% a
  19.   data: {9 k; k0 W: W' j$ T/ @
  20.     message: '菜鸟教程!'
    : k) z) L7 a9 c0 z- }/ q% w# w
  21.   }$ \+ u. C0 B. M1 o
  22. })& ]( s+ N; S% s4 q, ?2 l
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:" s) o4 X1 b( Q  }; o/ F
  1. Vue.directive('runoob', function (el, binding) {
    + ~, a# _; e8 J% A* h5 c  M
  2.   // 设置指令的背景颜色" j9 X: J( n+ `* I
  3.   el.style.backgroundColor = binding.value.color
    " c% V; }. r/ R9 p2 v5 d5 _" C
  4. })
复制代码

. x0 E: F* F, N: v# P1 ~7 h  A! @
: S9 K( y5 @; O$ {% |
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
! E" D& N6 s) z) o* r
2 D: B4 E: {' j# p( L
  1. <div id="app">/ s& @7 q' l/ ~( K2 e
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    % }6 F5 F! X% _1 z2 y8 z6 a4 c
  3. </div>
    + h, h5 o, L: o9 }6 \

  4. 4 E  Q4 \7 h5 q
  5. <script>4 b7 ~. J7 `( C' r9 ^  E9 C' m
  6. Vue.directive('runoob', function (el, binding) {4 ]: E' R' X" I% p; f
  7.     // 简写方式设置文本及背景颜色
    , `4 M/ }5 [+ B& T/ [% m
  8.     el.innerHTML = binding.value.text
    2 f8 N& G  j8 J
  9.     el.style.backgroundColor = binding.value.color3 y) O' m# b" @) x& i9 I
  10. })
    # c9 @7 u& G% f
  11. new Vue({
    % Q# ^9 \* S( n7 f) ^) }6 B
  12.   el: '#app'
    ) E% L0 a! G: t/ |; D  Q2 F
  13. })/ ?5 i9 |0 {/ P4 o
  14. </script>
复制代码
3 H: h: X9 U% A# \* o$ o/ h, U
- m- x7 d0 F; S, q+ H0 C8 o
0 e7 ]  M  ]4 P  t: m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 03:11 , Processed in 0.051032 second(s), 19 queries .

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