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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

) a  J! e5 I6 `. W
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例+ {; z# h% b: Q3 f! J
$ S" A& o1 x% c2 O( F
  1. <div id="app">! k2 u4 `+ a3 e; A4 d
  2.     <p>页面载入时,input 元素自动获取焦点:</p>( }3 O7 I' y, u1 }2 V
  3.     <input v-focus>
    ' [0 ]0 y" S+ u: k. o
  4. </div>) Z6 {, r2 ~" @- j# U* ~

  5. 7 k1 [5 A1 ~  e- X6 |: R
  6. <script>
    # k3 @  w' b' C9 T! H
  7. // 注册一个全局自定义指令 v-focus
    , j7 s& T9 g( @1 i8 U5 |8 ^* F
  8. Vue.directive('focus', {4 s, y$ J0 E/ D, V+ V8 m' ~
  9.   // 当绑定元素插入到 DOM 中。2 z  p% k4 d7 }4 s
  10.   inserted: function (el) {
    9 H8 b% D7 B3 k9 P
  11.     // 聚焦元素
    ) O$ I1 e' l1 ~8 g0 i
  12.     el.focus()
    # \# r8 B  i% R( w. C) Q$ b, }0 e
  13.   }
    / s7 w! s1 b! V& H" t
  14. })6 t$ k. V5 b# @, w, C  e( K6 d0 T
  15. // 创建根实例
    4 |7 `5 h. b5 v
  16. new Vue({
    7 s# m2 V# }5 C/ F3 V
  17.   el: '#app'
    " I4 \; L  T) \& ]6 `
  18. })
    - K: M+ O! p; x# ]/ M
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
" F" a6 P6 F3 `& e# m/ X8 F8 {; K1 ~" W* ]- d. M5 G
  1. <div id="app">8 z: Z; h+ S0 y' }9 {1 H" x
  2.   <p>页面载入时,input 元素自动获取焦点:</p>2 ?  v- Q  f/ c/ |, Y9 K+ v
  3.   <input v-focus>9 O/ E& h3 f% J
  4. </div>% v* z( a$ T: A) t0 M+ [

  5. 3 a0 L& {& t. K* c
  6. <script>
    6 \6 M4 K. H9 E6 q$ F( Y' c
  7. // 创建根实例% ]4 G) \) N$ G0 x( S7 t) b
  8. new Vue({5 I) [4 i7 p$ j" ~5 f$ i$ i
  9.   el: '#app',
    ; _! W/ |0 R% N5 j- g
  10.   directives: {5 V3 r" w# D% W" o. d) G- @
  11.     // 注册一个局部的自定义指令 v-focus
    : S2 {9 w$ w1 r: k' z9 z  @
  12.     focus: {4 w+ p# o  }5 P& Y& D- ^
  13.       // 指令的定义2 D: k  u& @0 G+ t4 z
  14.       inserted: function (el) {
    6 T* \% ]0 Q8 Q+ J1 X( A* f% W
  15.         // 聚焦元素$ L  x9 f( ~+ ?. y0 C
  16.         el.focus()
    8 t/ u3 \! g4 V0 t! {
  17.       }
    0 O/ |5 T1 G* ~5 k7 H" }: Z
  18.     }0 X" V+ j# Z6 K6 J
  19.   }: }) F( B6 S0 r2 e
  20. })
    3 M8 S. v  {. F& a
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    2 s; _- ?0 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 }。* e5 m* F  I8 E6 T" m
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    . I+ ]0 l( L7 ?9 n
以下实例演示了这些参数的使用:
实例
! k$ A% l+ z2 k: g- E$ S0 f
% c& T' @, K6 B! r
  1. <div id="app"  v-runoob:hello.a.b="message">& Z1 L- [8 o% J' g" R. z
  2. </div>& i8 q& y" n' t2 a; A) j! z1 [0 O

  3. 5 ?; z+ Y& M) V
  4. <script>
    * `; g5 @+ W# G6 @# |  L3 ?1 Z* L
  5. Vue.directive('runoob', {
    7 v" Z9 r4 E: v
  6.   bind: function (el, binding, vnode) {
      Q4 R# S/ b$ K' h- T  E! O  z# I( X
  7.     var s = JSON.stringify
    3 m. j2 ?1 v9 F, T: H% p
  8.     el.innerHTML =
    . f# s; x+ ]3 |
  9.       'name: '       + s(binding.name) + '<br>' +
    . |! n7 ~. f7 t- Z7 F0 u; v
  10.       'value: '      + s(binding.value) + '<br>' +
    9 w7 E/ T* h  e+ ^! b! E
  11.       'expression: ' + s(binding.expression) + '<br>' ++ G- O( \* G: ]5 B
  12.       'argument: '   + s(binding.arg) + '<br>' +
    ' s- @/ W6 ]3 P1 l9 Q
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    3 s1 j) P% b1 }% n
  14.       'vnode keys: ' + Object.keys(vnode).join(', '), x1 n0 T. k, F
  15.   }
    2 m3 t  L4 Z# J7 q! }9 v
  16. })
    7 r( ?$ ~4 \( o" x# e2 k
  17. new Vue({( {# S1 C/ A) K3 U
  18.   el: '#app',
    7 R  Z! W7 m: [  B
  19.   data: {) G* u' x  z- o0 t: k6 u
  20.     message: '菜鸟教程!'
    / S/ z0 J) U9 l) _7 E3 |
  21.   }7 L9 j# u. l  L( ~  Q* E5 T
  22. })0 e5 a4 W2 @7 _0 `# N# H3 l
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
) q; s. j" a! w5 S, i
  1. Vue.directive('runoob', function (el, binding) {8 E2 N4 q/ q) b6 o+ S3 R2 C
  2.   // 设置指令的背景颜色7 C  r2 n7 H) x/ {/ n7 ?9 P
  3.   el.style.backgroundColor = binding.value.color) @7 O2 h$ ^9 m. z" ?( \1 [5 K
  4. })
复制代码
7 j5 N+ f+ M+ h

1 o6 o) |+ o: [6 X* a
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例4 b6 U0 i# L9 J. n% {2 M. U
  l3 i+ Q9 u$ f. r
  1. <div id="app">
    6 I1 [( g3 F  \6 L* B4 E
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>/ W2 v/ D# L5 _3 w  N
  3. </div>* z3 ^$ S. }& F# G. z( Q

  4. 7 q5 b( d, [! b  G
  5. <script>! X9 x* L4 o  D2 W
  6. Vue.directive('runoob', function (el, binding) {
    - [, _' T& U0 L7 h5 ~: ]. G
  7.     // 简写方式设置文本及背景颜色
    . m8 e  G) s% [/ o
  8.     el.innerHTML = binding.value.text
    2 ?2 L$ [( J" D$ H$ K1 l
  9.     el.style.backgroundColor = binding.value.color+ |: {! t  r( f
  10. })
    & p+ w7 V& Q! @. h$ c
  11. new Vue({
    0 t/ ?2 A" z* @) ^$ ?" A5 r
  12.   el: '#app'
    ' L) [* V; l  e
  13. })
    3 G& N$ O# q2 @7 _
  14. </script>
复制代码
, O1 L3 V; E, O  m, V. }: ^
1 O1 f7 g1 P( g' _

( b1 V2 ~9 l, M! _+ B0 B* }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-28 06:32 , Processed in 0.143197 second(s), 22 queries .

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