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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

  J; Y! ?5 r$ p/ e% F7 b
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
0 }3 U) |: _# M$ R# ]0 s: I% x6 G9 r* |) K# b3 G
  1. <div id="app">
    " v$ t# @3 `8 q7 X8 m$ s
  2.     <p>页面载入时,input 元素自动获取焦点:</p>- i  x6 R# G! H* n' W
  3.     <input v-focus>
    ! c2 R8 {( K& }
  4. </div># N! L( p5 x8 ]- B# |! h8 g
  5. ) M+ p* \. S9 e2 P$ ~
  6. <script>, G$ I5 }+ T( l& k4 N' K
  7. // 注册一个全局自定义指令 v-focus
    3 H3 n9 x' i" u5 P
  8. Vue.directive('focus', {7 v# Z- _. g) r; O" R6 ~# v; H
  9.   // 当绑定元素插入到 DOM 中。
    3 K2 R" F5 G" W; ?
  10.   inserted: function (el) {% g' S0 \7 X4 B4 d7 o
  11.     // 聚焦元素- S% W: f2 P0 Q, U- h
  12.     el.focus()
    2 L- q+ K  V& R* S& C. u
  13.   }: H0 C+ e: q9 |! H/ }
  14. })
    & }7 j. H9 r6 D7 z2 ?
  15. // 创建根实例
    9 x( H) Y& R; h6 X' j) X
  16. new Vue({
    , Y7 r8 n; s  B+ m  b: Z) {1 O
  17.   el: '#app'
    2 W. S, C$ Z7 P0 R, Z+ ?
  18. }); _- P/ n7 |9 R! d: j7 T
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例3 A7 ?3 t" B0 T1 P$ y' q$ f

% y( S- F) F7 y
  1. <div id="app">
    ( A7 R% K" H: j5 X! S% H# B
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    / L8 ?6 H1 c/ T/ I; ^  D
  3.   <input v-focus>3 x) h4 z0 c: o* T7 a
  4. </div>% [+ I) r( n6 b- q6 O2 E; e

  5. ( P1 i/ C, y3 c
  6. <script>
    # ~! H1 ?& v7 Q8 y
  7. // 创建根实例
    & ^7 E* h" ~/ _& s
  8. new Vue({
    8 a5 i  n" n# d4 H; J6 _
  9.   el: '#app',
    * R8 }6 q9 C3 _8 C6 F' w
  10.   directives: {9 h3 g) {$ O1 q1 S7 Y7 V
  11.     // 注册一个局部的自定义指令 v-focus
    : o9 f& D: O6 P! V
  12.     focus: {4 C8 Y# o/ ^' c0 N8 D) P
  13.       // 指令的定义
    4 m- b! W1 m7 A) e% q2 A
  14.       inserted: function (el) {1 R: K: u% E( Y% X
  15.         // 聚焦元素
    ! h* v( V9 l. V' n7 s0 n8 v
  16.         el.focus()
    . p3 }, O1 r7 D$ ^' ~
  17.       }
    * T; @) J# Q4 y
  18.     }, w2 K) }1 B" R+ f! A
  19.   }
    6 d3 E4 a3 j8 y' c* ?- i
  20. }): F! h9 w3 W1 a
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    # o" C0 X, l; n0 t( Z
钩子函数参数
钩子函数的参数有:
  • 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 }。+ S+ h1 a6 s( c. D& Z: L6 p
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    & D1 |) v, w- K. C4 I! M: m
以下实例演示了这些参数的使用:
实例* f' X6 F* P% F, i3 }1 \8 g

5 u9 j& r) T! I" t7 Y
  1. <div id="app"  v-runoob:hello.a.b="message">
    ! r$ _; `7 ~) Z, d) x% l* }
  2. </div>8 ~7 G" k5 ]$ z/ [- c, q

  3. 2 d. @; N  N$ _7 v/ m5 c3 `
  4. <script>; S8 @6 M7 r" v& q% R, f
  5. Vue.directive('runoob', {0 L$ r% f. F# u1 J7 X, D/ x
  6.   bind: function (el, binding, vnode) {
    5 l0 N; W$ @9 P% q* x1 W
  7.     var s = JSON.stringify4 P9 z4 b9 X5 U9 i0 I1 b
  8.     el.innerHTML =
    . P' ]  P: _( x  ?
  9.       'name: '       + s(binding.name) + '<br>' +
    5 p* m0 j* I3 Q! `
  10.       'value: '      + s(binding.value) + '<br>' +1 j; o, K+ H; ^( ^& Y
  11.       'expression: ' + s(binding.expression) + '<br>' +
    9 a. w) ?8 B7 i
  12.       'argument: '   + s(binding.arg) + '<br>' +1 d% Y9 x) o3 Z) f7 V3 c
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' ++ ?0 k3 X9 \! K% N
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    9 ~- ~5 }) M! ?% E5 }% _
  15.   }
    & K$ D; q/ N- }& s6 K4 I  B
  16. })! j) j7 p" P9 b6 ]5 j7 a9 G' ]
  17. new Vue({
    , R2 ~. }7 }0 b5 G7 \
  18.   el: '#app',
    . z$ ?! n5 \( o
  19.   data: {
    5 ?* `8 e: O  I8 R9 A* Y4 z
  20.     message: '菜鸟教程!'& a& P+ _% Y0 L( y5 [$ X
  21.   }
    4 f7 F9 |& I' ~4 e9 m7 G% }
  22. })' w# A8 n5 {# `4 {$ d
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:2 S0 K3 s4 j. F* c0 }- l
  1. Vue.directive('runoob', function (el, binding) {
    ! M' o# S* _. \8 z/ P6 ~
  2.   // 设置指令的背景颜色+ x% u5 v/ g' ]( a
  3.   el.style.backgroundColor = binding.value.color7 ]$ L, O+ B' g% w
  4. })
复制代码
# U) T9 `/ T' E

' @' q7 l7 p" p" m7 d; d) v1 w
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例6 G' `( K* @. ]( G2 c

% o. {& |" x4 k" K  T# n! L- ^
  1. <div id="app">
    * g2 I: {+ ]0 ^8 v8 n# Z, ^- o+ ^
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    0 C+ M: G" ~; O  F: m: H& p! B: ]
  3. </div>
    # S/ J$ f" R1 z" a+ G+ g. u

  4. + W: O# i4 E! x6 i! A- ^" z
  5. <script>/ T3 ^% E# ^6 V( g$ q3 H) R
  6. Vue.directive('runoob', function (el, binding) {2 m. J2 e! k' v4 h
  7.     // 简写方式设置文本及背景颜色9 J2 h( x2 W% O5 J0 v' J
  8.     el.innerHTML = binding.value.text
    4 M2 x) J% C' M$ `% M+ p; d# _
  9.     el.style.backgroundColor = binding.value.color; V" V9 i! n2 i7 V! V0 t3 l
  10. })4 F: Z$ ]& @% a7 e: J1 \( G
  11. new Vue({
    $ [8 s3 A' ~5 b" _' `2 G. H
  12.   el: '#app'
    9 A: S4 D& J% c2 b, N
  13. }), I+ J5 n6 J3 e
  14. </script>
复制代码

2 b/ I3 A) R, m: {! o: V+ x6 c* G& j. t4 @( v' i6 d4 ~  _' T

7 C/ o' r0 D, N: G+ @- P4 R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 05:22 , Processed in 0.057760 second(s), 20 queries .

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