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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

+ j( q1 b+ O/ _& I* t$ G: P0 N' a% t
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例& z# }4 ?" N: F* O% P4 Y. o  P$ g

4 j/ J! _$ H! m6 g& Q  I0 ?( j4 Y9 K
  1. <div id="app">  J5 F  J- W8 z2 `/ c1 C- k3 g4 H2 q
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    2 ?* G0 y1 A, r; F( \( ^# d
  3.     <input v-focus>
    . e# u) Z9 c8 u6 B' E. v: a* J, [
  4. </div>
    ! t9 I& S6 |. H) D  T: _: r
  5. 2 \7 @( ?* Q2 o! e  L/ \) s/ R
  6. <script>* ]2 d- m/ f1 f. J% |0 o
  7. // 注册一个全局自定义指令 v-focus
    2 G9 C8 J: z6 }8 {& U
  8. Vue.directive('focus', {
    ; l( Q( f  L( q# W  X
  9.   // 当绑定元素插入到 DOM 中。& J. G! V& n' |+ m
  10.   inserted: function (el) {0 A0 g# s: m) r1 g
  11.     // 聚焦元素  ?  L- j- M3 b9 c5 k0 a/ X7 m5 x
  12.     el.focus()
    2 t5 Z# S0 a8 K' x+ W$ T
  13.   }
    , M; ?! r1 U# L8 x$ F4 G
  14. }). P2 i( ?: I5 z( U/ C. q
  15. // 创建根实例
    1 p; p% G. H( d" c# P# b
  16. new Vue({( C: M7 `& [- I- b' b8 p' a
  17.   el: '#app'5 ^$ Z2 ?) N% i5 ]2 \, G
  18. })
    + Y8 s" X& n  B8 |) S! s+ J
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例+ k) {! r6 f9 N5 q) G5 t. ~
+ Z4 y' E  h1 M: k: I
  1. <div id="app">0 G0 q: H! U; E5 y
  2.   <p>页面载入时,input 元素自动获取焦点:</p>5 J3 h7 {: b. z: H9 \
  3.   <input v-focus>8 a& W6 i( X5 l# E
  4. </div>9 U; F; h4 K. e9 r: B7 v- p- A

  5. " ~/ H- U5 i- c& s# f* F" K# q
  6. <script>
    6 J: `: e2 F7 {* H) p8 A" ~
  7. // 创建根实例
    3 ?% n- T% _) ~5 F7 V5 K9 H
  8. new Vue({
    + B7 [+ U  j: ?0 e! m
  9.   el: '#app',5 K! n5 }& z! K8 C( H7 O
  10.   directives: {' [/ a2 C& w$ J, T, }
  11.     // 注册一个局部的自定义指令 v-focus: ?- {. u* J9 n- P$ K( e. p8 j
  12.     focus: {+ Q# X8 Z! J7 ]- V( b+ O7 m, I* p
  13.       // 指令的定义; S% h( n9 {* S6 D8 k! ?. g
  14.       inserted: function (el) {! r( T) a% n$ h/ K! h3 }: U! ], B
  15.         // 聚焦元素' U+ z( K/ H7 N, c; L6 u
  16.         el.focus()
    7 a$ B$ P( J5 W' `1 O1 [; A
  17.       }+ N0 B. |/ v# j) |1 y0 b
  18.     }
    $ U/ g/ I6 g3 a5 Z
  19.   }) D4 _: n5 C0 w. D# U7 H5 _& h
  20. })
    ! D' q* p6 L% F9 a7 _
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    6 E2 N# z7 A; J; ]
钩子函数参数
钩子函数的参数有:
  • 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 }。+ `3 T" M& G2 D5 x8 M* i
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    8 A$ Q5 @0 D* {  V
以下实例演示了这些参数的使用:
实例3 R' h4 {2 C. A( b- R( |. l
& ^$ K- ]' S; O/ `7 f2 C1 ?
  1. <div id="app"  v-runoob:hello.a.b="message">
    4 Z- x4 m' \! Z& s5 k0 e8 }
  2. </div>5 m! d4 }: L+ D* N! H

  3. ! Z( z' ~! j% i
  4. <script>
    9 N0 c5 f$ z- O! {
  5. Vue.directive('runoob', {. @$ m6 i1 r% P6 O
  6.   bind: function (el, binding, vnode) {$ d# A( j, f3 x
  7.     var s = JSON.stringify
    % \+ t! {$ S9 k- s3 ^
  8.     el.innerHTML =
    4 Q- g2 P: r8 X! K; V, d2 [: h
  9.       'name: '       + s(binding.name) + '<br>' +- Z" j( T! M# \# c/ p! A  E
  10.       'value: '      + s(binding.value) + '<br>' +
    0 {/ s7 }, X/ P8 e
  11.       'expression: ' + s(binding.expression) + '<br>' +
    9 ?3 G, Y  N) {2 m0 {2 }
  12.       'argument: '   + s(binding.arg) + '<br>' +
    : w7 @" E+ s% _$ u# I1 L
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    1 I1 [' F2 ~( }& c
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    2 }1 s# L( F6 H5 R7 P
  15.   }3 Q* t5 w- `( a- H) ]
  16. })
    7 x3 p8 g( ]3 N, ^- U) W# C
  17. new Vue({
    % n, M. _" ~) t$ K
  18.   el: '#app',: y8 D! t$ \! r  j# o0 k+ A
  19.   data: {3 d: `) P' O/ q5 C& M3 F
  20.     message: '菜鸟教程!'& `! y; W0 |! [$ z3 Z  A4 V& C! j
  21.   }
    ! C8 p6 g% s1 {0 G6 P
  22. })- g, O; \4 n5 O7 H" k
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:  _' S( W0 s- ^! o6 D- K! [" G
  1. Vue.directive('runoob', function (el, binding) {
    9 d( Z6 s- M- c) a8 {% t, [0 {
  2.   // 设置指令的背景颜色
    + u+ f' o- H; B# F
  3.   el.style.backgroundColor = binding.value.color3 ?& ?2 o* `5 [7 J* Z
  4. })
复制代码

  C0 G9 q. @( z3 I4 E- J) E1 y( H
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
; ]3 A! N" B7 A. v4 s! F7 E  H& ]3 U0 y) M8 m  I
  1. <div id="app">: H1 C6 I9 B: N3 l/ J3 v$ G
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>8 }+ c& A2 C( Z
  3. </div>
    ( n8 j' a8 I1 A$ I# d4 {2 e# I
  4. " r9 ]" a6 V; [6 T: n4 K
  5. <script>
    1 {2 L/ `7 S- }! ]4 d# j
  6. Vue.directive('runoob', function (el, binding) {1 `" h# e# j6 ?) K" G# p- W( W
  7.     // 简写方式设置文本及背景颜色$ C3 M7 x# v& B" o# Q+ \5 Q
  8.     el.innerHTML = binding.value.text
    ; ]7 Q0 [7 o9 s! d7 F" D
  9.     el.style.backgroundColor = binding.value.color4 F2 e% U! Y# c7 v  [
  10. }): r1 \7 a: k5 S; C
  11. new Vue({
    3 h6 K( X) A5 p& D( j
  12.   el: '#app'
    , |; n! K0 B6 ]1 }+ M
  13. })% Y! L+ s; O1 x) `
  14. </script>
复制代码
; }: I9 d, E' L  X/ l9 D2 `
/ Q8 W7 j/ C% m- Z  m5 [

: [. A' N5 _4 ?+ F  L
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 16:27 , Processed in 0.116461 second(s), 19 queries .

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