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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5 V+ R, h+ M1 k3 O6 x
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
9 U- \/ B: O# \4 l# U: G* }! ^- ]0 k( @1 O
  1. <div id="app">$ G; W) a4 f3 I8 i# \
  2.     <p>页面载入时,input 元素自动获取焦点:</p>; T9 F# @* v7 p- i. r
  3.     <input v-focus># `, z6 F/ s5 m" ~6 o3 M
  4. </div>, _( X7 w' d& j9 v

  5. ) i: \* T+ _5 _! m8 m2 z* Z1 ?
  6. <script># ^4 \1 t+ d! M
  7. // 注册一个全局自定义指令 v-focus3 ?- f  G# q" ]5 c& f
  8. Vue.directive('focus', {
    6 ]7 L/ @# {* B- I) `8 s+ A
  9.   // 当绑定元素插入到 DOM 中。* P) E, m0 O, [1 ~
  10.   inserted: function (el) {
    + v% o' X( }) e' Y, O' C/ R/ X
  11.     // 聚焦元素
    ! o# F6 d7 ]2 ^  v* z' A) O3 Y
  12.     el.focus()* J0 }: P2 ?; n6 K7 E" k( S% }  q
  13.   }1 R, M. x% I; W( z" v0 Q  ]
  14. })
    " b4 I; u" d$ t, I4 O+ h# _
  15. // 创建根实例* S9 _4 \  N6 t; O; P% K$ Q
  16. new Vue({
    8 n  D* D5 a; k! F0 H, B
  17.   el: '#app'
    4 [+ A, A5 U6 H) s$ D3 G
  18. })9 g3 r# z& i5 w& o  ?
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
* r: x  {3 Y: @# R1 Q
1 r+ [6 }3 I% n
  1. <div id="app">
    7 E7 C" D' _' ?& f+ u: U
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    & J' U$ x# P- P2 i
  3.   <input v-focus>3 K& v: ^  u  T5 y" f' p
  4. </div>$ }) i6 ?1 v& b6 i( ?: k
  5. * y' z1 ?7 M6 W3 {! Q( m/ P
  6. <script>
    8 {% a2 w0 |2 U/ ?7 k
  7. // 创建根实例
    1 I2 y' i( r8 i3 U: H+ C
  8. new Vue({0 r, V9 c7 W6 O2 j6 ~  U
  9.   el: '#app',  ^% s! w9 H  k3 m& M
  10.   directives: {2 x( v/ {0 k, t0 h3 }5 M. }
  11.     // 注册一个局部的自定义指令 v-focus
    , `* M8 e2 }3 [2 e1 V  o
  12.     focus: {
    ' C6 \( J* C. E! B- {& R: Q5 d
  13.       // 指令的定义
    3 E: x- Y$ B1 N
  14.       inserted: function (el) {
      Y" |. j! }5 a& X3 z) h! l
  15.         // 聚焦元素$ c  b) @# ^) k; Y- Z
  16.         el.focus()
    - i$ O/ e% N6 z
  17.       }7 w9 b  Y  a0 z! o
  18.     }
    ) s& h) O. F6 r( x5 N
  19.   }
    * \$ X+ ?6 G6 W% y) }! }) j! b$ h
  20. })
    ' {& Z. |+ R  I" y, S( b
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    1 p4 R. `; D3 C" m& q3 L) e( l
钩子函数参数
钩子函数的参数有:
  • 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 }。
      9 H( K) T) g# M
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。7 i, l# f, Y6 F7 P4 c5 L* ]
以下实例演示了这些参数的使用:
实例
1 K& i, L; s: l) f0 E$ L5 G  a
$ L7 r" [+ ~" t' a* @0 W/ e
  1. <div id="app"  v-runoob:hello.a.b="message">0 r' q: R6 }  b0 _: l4 A
  2. </div>! x1 {8 G& n7 ^8 J: c( \- r3 e

  3. 9 y) n7 U/ ~" G3 e  p
  4. <script>
    " ]+ n% V. u% X; m% p
  5. Vue.directive('runoob', {* G/ F  H, M# R  r
  6.   bind: function (el, binding, vnode) {
    % k" ~+ Z$ @/ j$ P' n! D
  7.     var s = JSON.stringify
    9 r1 ~9 I; c8 V: d' Z
  8.     el.innerHTML =
      s0 C, M7 I4 {( A& p& d0 n
  9.       'name: '       + s(binding.name) + '<br>' +
    ( m6 w' R5 u2 K
  10.       'value: '      + s(binding.value) + '<br>' +0 x: N8 X' M* O- @( T
  11.       'expression: ' + s(binding.expression) + '<br>' +
    ( C  s# S& B7 b
  12.       'argument: '   + s(binding.arg) + '<br>' +; W1 _7 Z( g* r. Y+ |
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +. |$ L; v* J# c  B, H( x& m) U
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')# p; X' Z1 S3 s7 l
  15.   }- `2 V6 f: C0 `
  16. })
    / i: r' O9 E3 J) }) X) k  Y
  17. new Vue({+ i# W  Q" M* r* J
  18.   el: '#app',
    ' ^; r3 Y# n7 D4 d
  19.   data: {
    0 f% C) N- H* O  T$ M+ Q
  20.     message: '菜鸟教程!'- i8 p. @' f- H9 O
  21.   }3 |0 L. _6 e8 n  B! Q# S9 {- z
  22. })4 E) @, G/ K; i
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
/ ?& V9 e. _+ R- c/ C! Y7 H
  1. Vue.directive('runoob', function (el, binding) {
      j1 I2 m# F7 g- r
  2.   // 设置指令的背景颜色  U' Z" d: T4 P3 B3 u. E
  3.   el.style.backgroundColor = binding.value.color; O, @* e2 x& M' H8 C) R
  4. })
复制代码
( L) ]- k$ ]1 @

6 Y! k# P# ^' ?: b4 M' B3 N0 C+ h
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
9 f' w' w( S- }5 e9 |. S4 d/ I/ @9 _, f
  1. <div id="app">
    ) [/ f1 [. u+ o# Q- l
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    * t& ]7 s/ r( E- h
  3. </div>
    4 L  T0 b( e4 v% ~
  4. ( |( i  H% \' D$ a
  5. <script>8 y+ x5 E" Y* w, T8 Q
  6. Vue.directive('runoob', function (el, binding) {
    0 _8 v% ]4 b* [: o6 [3 R
  7.     // 简写方式设置文本及背景颜色
    4 K5 T/ x* G  e9 z$ t
  8.     el.innerHTML = binding.value.text( P2 P$ ~: h1 j2 [
  9.     el.style.backgroundColor = binding.value.color
    4 z/ y4 k& K4 ]- K# A( t/ M
  10. })
    , n) @5 S6 U. |- e1 Z1 q. ~
  11. new Vue({$ z" `$ z; s9 |# [+ e7 t2 ^# l
  12.   el: '#app'
    ' \% A1 U  J& R9 }4 O* b3 ~  ^1 V; J
  13. })
    ( r$ s) Z+ Q7 w6 Z" l  ~
  14. </script>
复制代码
/ N+ N8 `7 n: \" c4 I; a$ @& N

' R( Y% y) {% c# ^3 g- F: r; [0 t& s- {! {; q( g6 S
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 08:12 , Processed in 0.055926 second(s), 19 queries .

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