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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

2 `- \1 H" S# {3 ~9 ]$ F
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例; C9 i# G0 X* g) q& k* [

2 F$ B# m6 ?$ s: E
  1. <div id="app">
    9 c$ r# Y% U9 w( N+ y7 s7 V/ D
  2.     <p>页面载入时,input 元素自动获取焦点:</p>" f3 S& a- ~( `9 A- b5 K
  3.     <input v-focus>+ s$ l  ~! [9 ?  m) ]: t+ e& ^
  4. </div>4 g2 G2 \9 f2 v/ f- G/ a& J
  5. $ m6 |9 y0 e. N' Z% n# n4 X- r* p
  6. <script>( I4 Z$ j& L, U3 M% F% K& v
  7. // 注册一个全局自定义指令 v-focus
    7 {/ P# M% ^( T. {! N" [' n
  8. Vue.directive('focus', {/ Z5 L7 A0 M! y% V
  9.   // 当绑定元素插入到 DOM 中。
    ( G$ U! Q4 ]+ N5 ?
  10.   inserted: function (el) {
    ( {: r) J, l) Y7 w) _' V( M" N! m- Y
  11.     // 聚焦元素
    ) o/ {% N5 j5 t( Z' M0 c$ Y
  12.     el.focus()" d" s8 V, U2 G/ o# [
  13.   }9 n# g3 W; X* S
  14. }). b- A4 H, X: o
  15. // 创建根实例
    + \3 W+ `$ y1 R4 r
  16. new Vue({
    / {1 j' M5 N& t! E. `1 J
  17.   el: '#app'
    3 n' B4 v! f# A3 c% t8 z3 C9 f
  18. })
    ; h  ~9 @' C  e
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例9 _1 I! ^" o! Y/ D) @! A+ f

# {) H2 L( _8 y# ^7 R% I
  1. <div id="app">( l0 m8 z( d" O* W
  2.   <p>页面载入时,input 元素自动获取焦点:</p>  A$ z9 g4 `4 n9 n
  3.   <input v-focus>
    ! I- O1 V. a, ?" B
  4. </div>
    & Y) X' ?9 O& H/ j* L2 V- H

  5. 8 G; D+ Y" p; M* C. M$ i2 G
  6. <script>
    5 K& e- t3 Q7 }0 J( F
  7. // 创建根实例
    8 ~& K! t$ ]+ d# M; D
  8. new Vue({
    ) l& l/ p6 ]/ ^
  9.   el: '#app',9 @2 K, P( [! B+ Y4 x
  10.   directives: {8 u- Q" `* O; b: }( n. E1 M0 q
  11.     // 注册一个局部的自定义指令 v-focus4 \, q% Y$ k5 e0 U5 j* `
  12.     focus: {$ R* [2 S$ l7 `
  13.       // 指令的定义
    & \* [$ P( K" N7 P. h3 G. M
  14.       inserted: function (el) {) i' D5 i. }. P3 P/ u0 e
  15.         // 聚焦元素5 E4 E) \/ {7 Q  P% X
  16.         el.focus()
    5 |2 F+ q& l* `5 m9 z) s
  17.       }
    5 D- o7 m4 ]( w& [- Y
  18.     }/ l* c! {6 [" I2 h
  19.   }$ }( E) p7 Y: s5 p. K0 Y
  20. })5 {* F2 H; ^6 E4 v9 d  D
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    ( T& h1 q, V& K1 t  q8 d
钩子函数参数
钩子函数的参数有:
  • 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 }。& B3 j6 E) q7 C7 J5 ^1 e
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    0 F2 Q  d2 t5 P+ p$ @
以下实例演示了这些参数的使用:
实例
" e% H0 y) }7 y4 I) v; P0 @, l( c, f/ B# }
  1. <div id="app"  v-runoob:hello.a.b="message">- B0 q$ s2 T* k6 k. ]' a. T
  2. </div>
    6 w, D9 C2 O% ~4 m8 ?% t' |" z

  3. 9 Q) c8 @8 e0 k. Z
  4. <script>% U, S! {( a- J" E& F
  5. Vue.directive('runoob', {
    . w' o' h; s: n/ P3 v7 M% Z4 y
  6.   bind: function (el, binding, vnode) {( q$ }3 X: F0 U# H. O. M
  7.     var s = JSON.stringify
    . }$ |' w7 @# ^7 d# Z6 `# p+ w
  8.     el.innerHTML =
    " t* ?; M1 ^$ ?& C/ p3 K
  9.       'name: '       + s(binding.name) + '<br>' +
    5 _; V, c+ f5 d1 ]8 ]4 d4 w
  10.       'value: '      + s(binding.value) + '<br>' +
    0 N0 x; H4 o7 J0 F! \6 S
  11.       'expression: ' + s(binding.expression) + '<br>' +
    # ?4 Y- R2 ]) p/ G9 q7 w
  12.       'argument: '   + s(binding.arg) + '<br>' +
    4 L) j- j# a. a2 H
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +4 C" g) k0 X2 G. `
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    : E+ x- o" G" t" s/ F
  15.   }$ _" s5 \' d' _6 s' C
  16. })
    % S0 N* u  s6 Z# K; O
  17. new Vue({
    9 P3 E& B, c/ r; X, q# f
  18.   el: '#app',
    & u! U& p! v+ N
  19.   data: {% t9 x: h. `3 D% R; {  R
  20.     message: '菜鸟教程!'$ _0 f+ o5 w) y( j9 ?+ Y
  21.   }
    1 A' @2 L6 L+ }9 z) u1 j
  22. })
    ! @- b, ?" p8 j5 W5 g
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:) t% v# n* q8 c5 s% j
  1. Vue.directive('runoob', function (el, binding) {, n+ \. R& l% Z
  2.   // 设置指令的背景颜色
    " I: ?2 k5 F9 M8 x3 f
  3.   el.style.backgroundColor = binding.value.color, k* z2 ~' U7 C. X& _
  4. })
复制代码

. b- U  p5 c3 w6 @7 J3 b4 ]  f$ G4 c! `" Z+ O+ {
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例6 D6 Z; `& v5 v
: p# o, z" v5 C8 q# N( d
  1. <div id="app">+ ~: H& R  i7 U" k
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    " t. b2 W) F/ A7 w
  3. </div>
    3 w1 S1 t: Z- [" ^
  4. ( x6 r+ v7 c$ P) @. ~! H# d
  5. <script>  K! X, X' P4 S, N' y# ~' A
  6. Vue.directive('runoob', function (el, binding) {
    . ^' T& _0 K/ J) l1 c5 x
  7.     // 简写方式设置文本及背景颜色* {9 b8 |; ~& R" M6 _: N7 V& N' h
  8.     el.innerHTML = binding.value.text
    ) _, P" d8 d- G# W7 S! {' T
  9.     el.style.backgroundColor = binding.value.color' a2 u8 Q4 O* h; q6 c& c! Q
  10. })( W, X/ L" p* i/ `
  11. new Vue({5 _: C1 w+ l+ z6 n8 `6 R' s
  12.   el: '#app') u6 U& T. y& o. y; o$ }
  13. }). K4 Q3 t& }  o2 J  Q! a: @3 d% _
  14. </script>
复制代码
" Y, F& P% \6 @: _

7 q. F, H* r0 O$ G
( e& Z. |1 ^) }2 H) c8 A- g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 15:59 , Processed in 0.070207 second(s), 19 queries .

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