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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

; ]: H+ U1 x" V; x5 z, G
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例+ V! K  b/ Q2 j$ x8 I" [7 Z" q
  q; l( u0 r4 V  A
  1. <div id="app">& c8 i, b+ a- P; J8 z7 r
  2.     <p>页面载入时,input 元素自动获取焦点:</p>( G$ |+ ~1 ?( I5 D( [
  3.     <input v-focus>
    ! Y& R3 |& V6 C, T$ t1 ]: o
  4. </div>
    ' X) ^! t! Q! n' E9 f# h
  5. # N  p( k& W# r* X7 q( W' \
  6. <script># O8 a7 k7 N3 m% i  P
  7. // 注册一个全局自定义指令 v-focus
    , N, T/ p7 v7 g0 L) J- S
  8. Vue.directive('focus', {+ W- b( L* C5 B9 }
  9.   // 当绑定元素插入到 DOM 中。0 x% v# Q" `7 ?, r& W( P
  10.   inserted: function (el) {
    1 M3 ~/ Q; V/ r6 S) [* o9 p1 ^6 B
  11.     // 聚焦元素
      }9 r3 K2 l! U: a2 r$ X
  12.     el.focus()" p1 ~0 {6 S% G: U! O) y3 x
  13.   }
    , U& A8 w* w. P
  14. })
    + g: h) K( D6 X2 a) B0 p" r
  15. // 创建根实例
    3 G5 ]3 H1 f+ [
  16. new Vue({
    4 X) q! y' ?2 ^& r& L
  17.   el: '#app'
    7 Z; x; B% q% n! V9 e; V* q
  18. })
    , P1 I0 x7 S9 h. _( r0 T- R
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例/ J8 U& g" S5 C5 Q) c9 ^
: w, @# ^9 l: f% M5 P
  1. <div id="app">
    ) I  Y1 C( _6 r# `' v
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    6 k$ t% ?. X2 `
  3.   <input v-focus>
    . o+ Q1 R* F' V/ Z, v
  4. </div>
    / t6 b# g0 }0 \% }- N
  5. , f0 @  C2 o2 |; S2 C( p
  6. <script>6 I0 S" d5 J+ l3 k; \
  7. // 创建根实例
    * O: r% R0 B6 T4 t% K/ f7 w! W
  8. new Vue({" ^8 t/ w$ z  j, `. c. L: }4 C) W
  9.   el: '#app',! m( K1 T8 s( R/ k$ q
  10.   directives: {
    6 M: c9 S5 k" o2 D% S) o# A. j
  11.     // 注册一个局部的自定义指令 v-focus
      V# W& Q; T7 @% B  I4 q/ l
  12.     focus: {: Y+ S$ v5 E( Q9 g9 X, M
  13.       // 指令的定义. ~% v/ _6 \! ]4 d' F
  14.       inserted: function (el) {7 S' y2 O# M& w; I+ V" e' B
  15.         // 聚焦元素4 S) f' \! l7 g& m, I3 S9 j
  16.         el.focus()  D$ B5 m0 ?7 _
  17.       }* ?3 X8 j6 X1 w, {- O6 c: ~# S9 j1 R7 i
  18.     }1 l' h% Y$ J7 P" e
  19.   }
    $ b* J' T+ j5 U9 X% E; T
  20. })
    3 m# d8 x0 E3 ^- O" E2 b
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    ' G- ~# ~. o% r
钩子函数参数
钩子函数的参数有:
  • 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 l. z- R5 G" f' q, I
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。0 K1 q* }  h. ?1 n; H' A  ^" _5 D) k
以下实例演示了这些参数的使用:
实例4 s, c4 w0 \$ k3 c8 I& Q. }

6 \' `6 S1 Z7 E8 c, v7 l+ {; G% L
  1. <div id="app"  v-runoob:hello.a.b="message">- H6 i" L) G8 l) f" |7 A
  2. </div>
    " J6 q  w  [3 Y5 e' _, L% X

  3. , O( N) `( o. k9 K. ~
  4. <script>
    - Q$ {! P9 H$ V. S) n! X; ^4 N( ~
  5. Vue.directive('runoob', {
    ! C; ~' X5 i" D) \( t& i8 X& g5 g
  6.   bind: function (el, binding, vnode) {
    2 ~' T6 `4 T) S2 z- u# `  G" W5 E
  7.     var s = JSON.stringify4 p" D/ U5 W8 J; I2 _! l
  8.     el.innerHTML =
    % o' I6 W2 g/ ^" `
  9.       'name: '       + s(binding.name) + '<br>' +; g; Q2 a* x7 v/ @
  10.       'value: '      + s(binding.value) + '<br>' +
    $ A) j# u. B3 ?3 W
  11.       'expression: ' + s(binding.expression) + '<br>' +
    0 V1 @0 E3 R/ V7 f
  12.       'argument: '   + s(binding.arg) + '<br>' +
    0 _6 W% w7 H3 j7 ~, T# p3 {
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +2 G+ o2 f6 u" w2 H
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')3 P+ a( J& R3 K6 G8 n% u7 Q
  15.   }
    ' x3 U1 j/ ]% H1 b, U6 d
  16. })
    " J; o& A4 B3 ?6 Y% d, [4 ?
  17. new Vue({
    6 j# T6 `8 M/ v8 L1 E
  18.   el: '#app',
    $ p3 X. D, j" C0 X& o, z9 c  a
  19.   data: {4 P$ {9 e  V" i
  20.     message: '菜鸟教程!'
    1 o2 \' P7 U4 g/ y
  21.   }
    # r- {$ ]$ r9 Y8 a
  22. }), m& g% L% K& {  o" u3 q* C4 n4 Z8 J) `: n
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:, m+ y0 q1 S% B: \  F% C7 X! Z
  1. Vue.directive('runoob', function (el, binding) {. z, v6 `$ t1 _( X
  2.   // 设置指令的背景颜色" a' X- {/ I, C0 _' w
  3.   el.style.backgroundColor = binding.value.color) K8 F) m. A# [; B( a: w* l
  4. })
复制代码
. l  k/ ^( `- i. F- j% _. Y1 d

( g; b- s) I! G4 j4 S+ j
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例6 H% |3 z$ J4 t8 ]7 c' E6 C

+ n5 I% H8 r9 a
  1. <div id="app">
    4 O' I1 I2 ~8 D2 |( W! k! c5 `9 @0 |
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    % J8 w7 {( o0 z' y0 `+ w% E
  3. </div>
    3 I3 c! V4 t  l! P! n

  4. ; _4 I# H" w$ Z' c! z$ n
  5. <script>$ D- Y- X+ R0 \7 K' K) ]& d
  6. Vue.directive('runoob', function (el, binding) {4 C6 p, x8 E/ u# B* d# K, c
  7.     // 简写方式设置文本及背景颜色+ l: |* t8 _* \3 C7 |
  8.     el.innerHTML = binding.value.text
    % v5 Z* g8 [0 p( h! q; U! j; P
  9.     el.style.backgroundColor = binding.value.color
    , m5 g" w$ P& F/ u
  10. })
    % Z. y) M* r) _' f% ?
  11. new Vue({
    9 q7 U/ @+ Z$ o/ n, D5 X. Q
  12.   el: '#app'
    1 J2 q* z- h! S5 ^' V4 k7 \( v
  13. })
    9 M  s0 E  A0 w3 m# a5 {
  14. </script>
复制代码
+ J. ?* `# p" a* N9 [& Y
& Y6 y4 r8 [+ t8 J0 }% _5 W6 d

: Y' i* b  G- {8 I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 15:14 , Processed in 0.054155 second(s), 19 queries .

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