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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

1 T* `8 s+ ]* y( J! I
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例; C, \, c4 v/ |' m/ d. A' y; d
( \. I) W; E0 ?0 L( a
  1. <div id="app">/ P2 q  w1 z9 L( x
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    " Y7 S3 ]/ i; [) h4 C
  3.     <input v-focus>0 S0 b4 Q! j5 h" ^& S  a3 P& ]
  4. </div>, h8 E! d8 W8 }: m$ i4 n6 d
  5. # E, g$ r" ^9 w- G% N6 O
  6. <script>
    " c% K" G) U+ Y- G4 Z! z# O
  7. // 注册一个全局自定义指令 v-focus. u5 e% z& g$ J. X0 G0 s
  8. Vue.directive('focus', {
    6 x+ v/ i1 y" o8 j& Y3 p' E. G/ E
  9.   // 当绑定元素插入到 DOM 中。( t& r6 F* z% n
  10.   inserted: function (el) {
    8 F; z5 J4 V: \% @
  11.     // 聚焦元素6 I) r4 \" t$ {+ G+ ^* [7 F7 A0 d
  12.     el.focus()
    0 H  m( q# E: N; _9 L$ {) U
  13.   }! `! b( i6 D( `1 M3 x$ s
  14. })
    4 |7 O7 ?  \( g9 x$ F9 t
  15. // 创建根实例
    + C5 r+ h; D3 V/ i+ ?
  16. new Vue({
    6 e1 @3 G3 m, L: L
  17.   el: '#app'& w1 W" Z- s6 M$ o
  18. })# l- A( U' z' x
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例% E3 a6 S. u  m8 _3 q
- H6 m6 x, [- o& ^" a! n8 `" _0 L
  1. <div id="app">
    . p3 P3 _2 h) [. H# o
  2.   <p>页面载入时,input 元素自动获取焦点:</p>) K6 {! j# U7 Z- I
  3.   <input v-focus>  {5 q* _% q6 y4 b! l' {
  4. </div>
    3 S4 U) g- B) W! H3 k3 |/ ^) R" {

  5. 1 M% Z% _  F5 o! l1 l6 T
  6. <script>
    , @% k3 a0 o: K+ R3 X3 Y+ u, v4 e
  7. // 创建根实例
    8 K1 ~/ z$ m0 {9 @
  8. new Vue({
    $ |& P' `( {9 u- ~6 z  \  c
  9.   el: '#app',
    9 U' q$ s. L  x' L1 v! c
  10.   directives: {
    6 _" o, O7 O% v  I3 }
  11.     // 注册一个局部的自定义指令 v-focus
    : k5 I6 U2 Q4 v
  12.     focus: {
    - i4 G( b' b6 f+ H$ R2 Y% l4 ?' t" C
  13.       // 指令的定义
    8 [; ?$ W; M: E* S$ Y2 A& k- c2 F/ Q
  14.       inserted: function (el) {
    $ O% k; d6 a5 y6 x- p
  15.         // 聚焦元素
    ( l1 \5 u5 V$ Y! E
  16.         el.focus()
    3 R! S, Y! W& }% k
  17.       }3 y3 V4 O" y, c! w! C9 u: u4 l
  18.     }: O' V0 U9 Z8 }/ I2 x
  19.   }
    9 \- P$ ^' ]1 \. `: ^
  20. })
    + |+ o4 I( |& ^
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    % j; G9 [* a7 H- _6 }9 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 }。
      * n) h! B3 f2 H6 w
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。, X9 M! Y, |# Q7 K( o5 i7 h" w  d; Q
以下实例演示了这些参数的使用:
实例4 Q7 @* I& l8 h6 u- Q) O9 J# ?; d
  ^: d! T8 P5 b: i, H
  1. <div id="app"  v-runoob:hello.a.b="message">
    $ J. E  B' Z5 M: T1 q
  2. </div>
    2 h& Y) g5 u8 D; I0 N
  3. ! Q5 X# x$ _1 v+ ^8 B5 o# }0 |
  4. <script>5 o7 d5 g" d& J. y$ C
  5. Vue.directive('runoob', {
    1 S5 C: O% [6 w! `( M* D
  6.   bind: function (el, binding, vnode) {
    * J! h- n! h$ k  t4 \
  7.     var s = JSON.stringify
    % S7 K% h; ]/ N
  8.     el.innerHTML =) p9 g; Z7 I% l8 w! a
  9.       'name: '       + s(binding.name) + '<br>' ++ J7 n0 j8 q: N" l% {
  10.       'value: '      + s(binding.value) + '<br>' +! \! z' K1 @5 l4 ?/ j* U/ B
  11.       'expression: ' + s(binding.expression) + '<br>' +
    : a' ~& r9 a8 N; e' `1 Y" P$ R
  12.       'argument: '   + s(binding.arg) + '<br>' +
    : m; d# M- z! ?* d
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +! |3 c; e& E5 v$ l0 f% O3 v4 D
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    ' C$ O4 |0 E" @
  15.   }8 d2 s/ c8 x: C( S
  16. })0 O  B/ y- E' w# w7 Z  k! b
  17. new Vue({
    1 e% }/ |8 B$ m; Z# u0 I
  18.   el: '#app',
    0 h! q" y- @8 H2 E: \
  19.   data: {3 ~( D6 L/ y3 `8 }
  20.     message: '菜鸟教程!'% J% i% l( s( \. e" e: b
  21.   }" ^3 W' o: I, D
  22. })$ v' M! ?6 X9 Y0 v2 N
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
: t' U. V3 o$ `; K& {
  1. Vue.directive('runoob', function (el, binding) {3 s* A6 t* ], \; S& x1 I+ G/ k
  2.   // 设置指令的背景颜色9 O5 ]# g, i3 C8 q& {( q& J
  3.   el.style.backgroundColor = binding.value.color& l8 b+ x1 v& |9 w2 N2 G
  4. })
复制代码
+ x. ?/ J6 A! P. p
/ [$ I; `, ^6 b$ `: e2 ~
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
. _$ x  ~+ n0 }; [7 p
. r) V% p9 g2 B
  1. <div id="app">
    - A/ v8 t1 Y( Y: B+ H7 o) {/ s
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>7 P. n, i8 @* h# B  S* X7 g  j( h
  3. </div>
    % {+ U, F) D* O9 R5 [; z+ A

  4. 0 ?: o9 R, L* P8 F
  5. <script>' o/ D# \! Y, F6 b  h) @
  6. Vue.directive('runoob', function (el, binding) {" @! P: ~! N5 }3 x4 S6 d5 g
  7.     // 简写方式设置文本及背景颜色
    $ y4 L8 Q, v; o) ?* ?* w
  8.     el.innerHTML = binding.value.text* M- s/ M" z* E. @, k3 S0 W/ O
  9.     el.style.backgroundColor = binding.value.color
    3 T( G. R, T4 R' ~( ?9 \
  10. })8 T. m, N$ e5 B" Y
  11. new Vue({4 {: l& ?# v0 e/ K+ s! V6 @) F: t
  12.   el: '#app'" G- Z! q, O( g) |6 v4 @& }
  13. })) z% L  h: D8 `+ X4 m6 q
  14. </script>
复制代码
( @( p2 S4 W7 O

% _  K1 f2 k& `' j& \- C
" G+ _& u* y" l0 _- k
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 16:14 , Processed in 0.104055 second(s), 19 queries .

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