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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
$ m2 m: k2 C6 K9 i- h% k* K2 G1 V; n
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例- g3 ^( p; o  y
* G# y) W& q, Q& G) Z4 S# q
  1. <div id="app">! m2 d( t" j' [! d6 F
  2.     <p>页面载入时,input 元素自动获取焦点:</p>) u& r1 {% R4 b/ c. q
  3.     <input v-focus>( \4 O3 P- _( T2 s7 C
  4. </div>3 d3 |; ]# Q4 C5 h/ ~! u+ L* K8 i
  5. & {% K3 B* h! U  p+ ]  X9 v
  6. <script>" O. d) t) X" ^  L% T9 O
  7. // 注册一个全局自定义指令 v-focus2 H  A2 j6 R* s  f/ t6 ]
  8. Vue.directive('focus', {4 q& f; `6 d! V$ Y: h$ K9 |
  9.   // 当绑定元素插入到 DOM 中。
    . ~, E& k+ R( o( O2 k$ U! E
  10.   inserted: function (el) {
    " g( r) L- T1 l1 ~* x. x
  11.     // 聚焦元素2 z2 Z! ~0 Z1 G6 p
  12.     el.focus()# M! B" O+ r  C8 x( D: b
  13.   }2 M! r) D! i( o; Z* c5 n7 M$ U
  14. })
    ' P8 B3 U/ h. p; u' U
  15. // 创建根实例5 e# C% {4 k4 N  Q+ d: W
  16. new Vue({% R9 i4 s1 ~# m
  17.   el: '#app'/ {5 O+ x9 q9 t( J- |: _8 ?  e
  18. })) H% F0 D) S! Y6 q" S3 P4 X
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例) V( e9 s/ ^7 U
1 ]( C9 _( R) {" ~- u" j
  1. <div id="app">
    3 I+ ^: ^" d% Q2 X  n
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    7 ^6 I* e  r- y4 w4 r+ I
  3.   <input v-focus>
    , F$ \8 r7 L/ @7 M8 J
  4. </div>
    ! F+ n! L6 U6 d8 c" ~( ]6 W! K

  5. 0 l6 }' c. U: j
  6. <script>
    ; x/ o% k: d$ f  n7 k# C3 ?
  7. // 创建根实例9 ?" c8 u; y- h7 Y
  8. new Vue({/ p' q& X. x. L8 u0 ~- H0 r# P8 V
  9.   el: '#app',
    - M! t) V! i& _
  10.   directives: {- U* [" }+ i4 K+ c% l: K
  11.     // 注册一个局部的自定义指令 v-focus
    3 I: R3 B& B! y1 s  c1 a
  12.     focus: {* ~( l2 E( c( [, [0 Z  {
  13.       // 指令的定义
    1 M/ P9 \% @9 V+ h
  14.       inserted: function (el) {- u: @5 B5 n9 W' I4 A
  15.         // 聚焦元素
    ! J& ]4 E  F* M
  16.         el.focus()6 W1 p2 k5 `( T0 |
  17.       }
    + Z) o( n( |6 P. O4 w6 j; ~
  18.     }7 K5 N( M7 c* V9 F# k( Y$ H7 m$ ~
  19.   }
    ; l3 Y( [( M8 r) a+ L
  20. })' Y& \4 M! O( Y0 ~+ a
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    $ b' I5 S3 s2 C8 _1 M3 n' f
钩子函数参数
钩子函数的参数有:
  • 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 }。
      : H: W2 a* |; u4 J6 p
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。4 `$ j2 b; @' }
以下实例演示了这些参数的使用:
实例) H. O7 D* s7 p" y

# O2 m! d7 k  {  b! ]3 m" ]" N& ?
  1. <div id="app"  v-runoob:hello.a.b="message">
    # N" v" h+ p$ b1 h: a2 p3 y
  2. </div>
    ) `1 W: f! R! |' b! J( F! M
  3. ! N+ d! H: I7 v% v- c6 `
  4. <script>; d3 c6 {. }$ P% d( r" v8 H! s/ ~5 J
  5. Vue.directive('runoob', {
    9 O0 H, U. J" [0 e: l/ _( Z9 J
  6.   bind: function (el, binding, vnode) {
    - ?) m4 G2 f' T
  7.     var s = JSON.stringify
    8 j7 N; e$ V/ G9 \7 K9 t' J
  8.     el.innerHTML =
    8 O9 s$ r5 k5 }8 E
  9.       'name: '       + s(binding.name) + '<br>' +; _( ~8 a- l$ y; Y
  10.       'value: '      + s(binding.value) + '<br>' +
      J4 m1 q5 a4 ?! l6 ?9 X7 L* ?
  11.       'expression: ' + s(binding.expression) + '<br>' +, W$ ~9 K% E! `+ Z7 q  r4 p8 F( d
  12.       'argument: '   + s(binding.arg) + '<br>' +
    9 f. f5 o4 X  W3 i* V
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    % g9 L# M! C& Y- a3 Q% _# e
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')9 V1 P0 [2 G$ I3 z0 Y
  15.   }+ `4 P6 B5 Q' {; n! u
  16. })+ g# C( v+ k. d$ ?& f% S0 @- q6 v
  17. new Vue({9 J5 X6 Q  }- |! n
  18.   el: '#app',2 R6 p& n! g! B) l+ `- }9 Y' Y% v
  19.   data: {, B# \0 H1 Q/ m6 e/ ~: p
  20.     message: '菜鸟教程!'
    3 j8 c2 K- e- D) _' a
  21.   }
    & |7 s- W: r$ q% I3 k
  22. })& `: R+ Z2 z# n4 o; ~
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:7 j9 u0 d4 i- d" Q: u. [
  1. Vue.directive('runoob', function (el, binding) {  ]: W2 i" _5 [/ q) x9 U% t
  2.   // 设置指令的背景颜色1 w. k  N7 q1 p5 E: ]2 J0 ]7 O
  3.   el.style.backgroundColor = binding.value.color" B- s/ P$ m5 t/ ?
  4. })
复制代码

7 y! w+ l  Q  w; Q
$ m9 ]" Q! S/ P9 E" {- R5 y6 |
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例: q. P7 D5 Y+ b$ b( ^6 a& T

! U: Z! y/ N* }( C
  1. <div id="app">' A% N" \# ?7 U
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>3 v! D9 B+ r' g0 V+ G
  3. </div>
    1 t% N. ~% y0 |( n' l3 \; c0 C) F

  4. - h7 x1 g$ n% k* T
  5. <script>
    & F, m) e' c% X* v5 Z' C
  6. Vue.directive('runoob', function (el, binding) {
    ; |' @5 b5 J+ d# e  O5 d
  7.     // 简写方式设置文本及背景颜色
    0 ?6 b* u7 S+ t1 H
  8.     el.innerHTML = binding.value.text
    * r8 Y5 R" K- I3 P# n5 m# I
  9.     el.style.backgroundColor = binding.value.color0 s1 j5 z8 I; ^2 k
  10. })1 W# x6 @) {, y4 G$ a- _
  11. new Vue({
    : `* A- a, C% k6 e5 x& |
  12.   el: '#app'' C7 \6 _- D9 z0 d
  13. })
    " |( o8 u/ n5 _6 \
  14. </script>
复制代码
9 ]3 ^" `5 V1 ?6 [

# O/ |+ E, M# L, y3 r
5 I1 x, \' @: t+ T/ ~' Q" U: T9 T, \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 02:53 , Processed in 0.049826 second(s), 19 queries .

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