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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
" z! |  c0 {, g& D
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
! k& d/ ~3 w5 h! Z. b; i5 i5 }( L! y8 \  |! K
  1. <div id="app">; P4 c% M* g2 K. x# }9 a  r
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    ; \: L- y# Y7 h; O9 Y0 X
  3.     <input v-focus>* K8 R$ W) `, T- w; c6 F% w
  4. </div>
    : b* V3 ~3 o" R: f

  5. ; R  I, H7 Q- b& g$ d! S
  6. <script>
    5 K7 D; o+ ^) w5 L- Q
  7. // 注册一个全局自定义指令 v-focus
      n; U# V& A) p
  8. Vue.directive('focus', {
    . F) m, p& i8 p* _7 m% o$ N7 b
  9.   // 当绑定元素插入到 DOM 中。
    9 ~0 W7 C- i7 ~5 x. Z! R: Y+ X) c) n
  10.   inserted: function (el) {8 I4 B' y6 T% }, J
  11.     // 聚焦元素
    3 Q) q* v1 [# j& g* ]
  12.     el.focus()
    + L' `5 p( J' l$ G3 w  V
  13.   }
    5 Y4 t: w; h3 ^5 z  u9 c* L
  14. }). X  E% T7 P' Y' }& w9 i
  15. // 创建根实例4 r4 c' C3 @# N  p
  16. new Vue({
    ( y* b6 C4 U& w6 d! W1 q
  17.   el: '#app'
    5 ~+ X. U+ k0 y6 }; v9 z& j0 P
  18. })
    ' W3 t! j7 }2 k9 N* |7 T4 Z, Z
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
2 x# Q+ U) R2 a$ o+ _; Y
' r+ Y  s. S" D( C9 t9 J
  1. <div id="app">
      y, q4 R, e4 C3 m5 W
  2.   <p>页面载入时,input 元素自动获取焦点:</p>9 L# N+ |8 f' k9 ?
  3.   <input v-focus>7 r$ \9 W$ i5 j9 Z8 \5 C& J! {
  4. </div>2 }2 ^- Y1 E: s& V
  5. ! r! Q0 [, N9 z4 L
  6. <script>+ K) A- k( |2 k) d6 D
  7. // 创建根实例3 V( A+ @- p+ @
  8. new Vue({
    7 G& q& D$ Y" l7 Q! o0 \& E! |/ D% a
  9.   el: '#app',( E. l: C; t, p
  10.   directives: {5 x6 R5 n7 t" `
  11.     // 注册一个局部的自定义指令 v-focus. w" R9 p; h  F. i  J8 O
  12.     focus: {( H3 }1 t. i! W4 O
  13.       // 指令的定义
    " @# Y1 Y! U1 ?, O* P
  14.       inserted: function (el) {6 p+ ^* y; O4 T& |. z" c3 K3 c6 D
  15.         // 聚焦元素
    5 h: e5 @& `! }/ O7 l
  16.         el.focus()* j7 o' ?$ Y! C0 e( k
  17.       }* D, l) g' D& }8 I
  18.     }3 m' x! [' N- U
  19.   }
    & U; r1 v0 a  q/ C6 Z* R! f* h9 m
  20. })
    % ~& k! [2 v  @% q* _/ l
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    1 H1 \8 ?# o' f, g. p% l4 m% [
钩子函数参数
钩子函数的参数有:
  • 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 E1 ]& N7 E. Y
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    7 h/ U: ?: G2 d8 `! [7 V* y
以下实例演示了这些参数的使用:
实例
2 f' Y5 B# R8 M1 p* e/ W- B* h6 M1 U* J
  1. <div id="app"  v-runoob:hello.a.b="message">
    6 F7 @( M* o+ V# S
  2. </div>) c! X; Z* J: g! z1 J0 G4 ]; T
  3. $ h  U& g$ g) ]$ A# l
  4. <script>
    ! J3 k. A9 b3 X% Y1 A% L
  5. Vue.directive('runoob', {1 B6 r& `, M. V" Z( M, Z: z
  6.   bind: function (el, binding, vnode) {3 k9 Q' B0 O6 j$ I6 H
  7.     var s = JSON.stringify
    8 ^$ v0 s# K  ~! i
  8.     el.innerHTML =
    . y' G( ^. y( B7 b
  9.       'name: '       + s(binding.name) + '<br>' +  J% Z( K1 b, f/ X
  10.       'value: '      + s(binding.value) + '<br>' +
    4 u0 x5 X! O; T
  11.       'expression: ' + s(binding.expression) + '<br>' +" K: R# [% S6 r1 \* e$ u
  12.       'argument: '   + s(binding.arg) + '<br>' +
    - r: B; X- A) b6 A" ~3 n% O
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    $ Q0 J0 b; \) T7 L
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    # O% h' _' s; j# a
  15.   }* ]4 j0 s3 S/ V
  16. })* ~, U1 z+ J4 F2 T
  17. new Vue({
    8 m9 L: x) O' H. h: T
  18.   el: '#app',: q7 r, {, j9 @) q& I
  19.   data: {
    , A- ?7 |+ G' i
  20.     message: '菜鸟教程!'% n; S5 ^- S3 K8 i
  21.   }
    ) M5 Y$ q. B1 A! B2 B0 ~* Z
  22. })/ ^5 X2 v7 x; i5 z4 z, |
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:# m/ S) J0 J4 M4 D9 _3 s
  1. Vue.directive('runoob', function (el, binding) {# Y2 D0 \* C" r, u  Y4 M, W" O4 b
  2.   // 设置指令的背景颜色
    6 ~' a2 Y2 `9 H
  3.   el.style.backgroundColor = binding.value.color  n+ S9 K+ ~: p% n, f* d6 j0 |
  4. })
复制代码

9 ~6 s' [. ], e- ?  B8 `& o% O- O, |. w# S3 h2 f% `
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例$ s' H' b* S9 U0 B9 Y# s( C+ ~

4 f! ?4 D1 f% _
  1. <div id="app">
    ) q  m) n2 S1 c4 g$ f
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    ' B" ^% Z$ O& j/ V7 o# x
  3. </div>
    1 E9 i& m' A, {2 }; \

  4. $ x& _7 ?# O8 Y: Y, n' G
  5. <script>
    % a% N9 }! L4 O
  6. Vue.directive('runoob', function (el, binding) {
    7 c6 J; `7 c2 p7 ?5 u# n1 J- `
  7.     // 简写方式设置文本及背景颜色3 o" u5 S) X5 ]3 y! a
  8.     el.innerHTML = binding.value.text
    ) ?# Z; N" _5 X  O& y5 M: ^
  9.     el.style.backgroundColor = binding.value.color, B( Z8 F8 j5 s# @% ~- C
  10. })2 }2 @- f5 n  Z' A
  11. new Vue({5 k1 i" K( x5 T. f3 Y9 e
  12.   el: '#app'1 m7 |9 U0 w  E$ r& a$ h8 r( v
  13. })' F  ~. V/ F% C
  14. </script>
复制代码

3 D# R: m! |5 B' b8 [4 y
- Z+ [3 A$ [2 S+ [: Z3 Z& W3 n2 K0 _7 l+ R0 f8 H$ T; K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 20:19 , Processed in 0.060632 second(s), 19 queries .

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