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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

8 [2 A; _+ q% z9 s
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
* W" [7 t$ k: O0 G+ J$ b- j' |6 p' C  X- l. b+ k' o& b# C5 g
  1. <div id="app">
    : o* F8 e/ u9 H! a8 d# S
  2.     <p>页面载入时,input 元素自动获取焦点:</p>! z# r0 G! I9 N2 U9 |% D  u' s
  3.     <input v-focus>: j7 F4 B* V* q
  4. </div>
    . h& y0 p  |8 u  j: ?2 S
  5. 7 [0 W5 e+ q, k3 I9 [0 [# \
  6. <script>
    8 B9 T  A( e5 m+ {) j
  7. // 注册一个全局自定义指令 v-focus
    9 M9 P& L  Z# L* ]! c7 m
  8. Vue.directive('focus', {
    ' H8 F" P- L" H5 `& ^$ [: d
  9.   // 当绑定元素插入到 DOM 中。0 X9 ?3 \4 H' h' Z
  10.   inserted: function (el) {: s) q# r- L' s0 ]5 N( i
  11.     // 聚焦元素# Y4 o5 F  x, V/ N# Y$ n
  12.     el.focus()
    - _4 i2 ]3 S& R+ E  `1 E
  13.   }& ?1 e/ s! M3 M% Z. X
  14. })
    " i3 v' Y, a$ U  ~6 {8 r7 ~
  15. // 创建根实例
    , J$ T! }6 }: l  d$ q
  16. new Vue({2 O% `/ J7 H+ b2 f/ p  o0 q
  17.   el: '#app'! h1 L) v- ~4 G" P9 z' x
  18. })8 B! g4 k7 l. h9 c5 g7 {1 E
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
# o2 J  v* G" u1 g+ N! }% r
1 ]# t2 {: H' c. M* S: ?6 H( V/ d
  1. <div id="app">4 j( P: E) m% u3 D+ e. b
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    ) ?! ^  m& v5 h
  3.   <input v-focus>8 Q$ X% s- v" x3 a4 B
  4. </div>
    ( x# D9 V3 o& y! x: i
  5. / b5 |3 p; Y- O, f
  6. <script>
    " V1 z" L& J/ y) t6 U$ d
  7. // 创建根实例! ~& s& f2 U. A, Y5 C; u
  8. new Vue({& {* m, D! m; b9 `
  9.   el: '#app',0 ^& G, A/ [- Y
  10.   directives: {
    # X6 N9 I; `+ a2 l2 C  n
  11.     // 注册一个局部的自定义指令 v-focus
    9 L* j0 g7 _- U5 \- {. s% }
  12.     focus: {, q! T# g5 y" M$ C" Y
  13.       // 指令的定义8 f+ r( h; T  [+ I, {
  14.       inserted: function (el) {% [3 }7 ?& E( A
  15.         // 聚焦元素
    ( s! T- u; c5 h2 m# t
  16.         el.focus()
    , S- S' x4 [% V! v  o! [5 x
  17.       }
    1 V/ z0 l+ h( M- {
  18.     }
    * L- Q6 C; O; H* d% {  m) O
  19.   }5 @  X4 O2 D+ s; \
  20. }). A4 W/ k2 z8 P, M5 t
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    & [! W( r0 D" i. 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 }。
      ! \% `! S* t" y8 S$ t4 o
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    ! l: D+ _9 r" F! g3 _% r
以下实例演示了这些参数的使用:
实例) w& A* m  H- n* |8 D
( x! `9 g6 C& ]8 z8 ^$ ^6 V
  1. <div id="app"  v-runoob:hello.a.b="message">6 h3 {* w7 U2 Z  \& z% [2 L
  2. </div>9 F0 q# m, p8 k; N
  3. 9 q( w/ W9 s0 S
  4. <script>
    5 ~/ M3 Q" a1 N% A: I
  5. Vue.directive('runoob', {
    ) v. s( t5 v" k8 V. Y& b" _" m) j5 q: J
  6.   bind: function (el, binding, vnode) {% f$ o% c& i- J: [0 l4 j
  7.     var s = JSON.stringify7 e1 m* G4 S; x. R
  8.     el.innerHTML =
    ! R4 a8 V& N, z( r( e8 c
  9.       'name: '       + s(binding.name) + '<br>' +
    ' A- W( z" K8 P  k$ J( k3 E1 f# R
  10.       'value: '      + s(binding.value) + '<br>' +
    9 S' r  L( J7 D8 T# d* C4 ^9 _
  11.       'expression: ' + s(binding.expression) + '<br>' +/ H6 {9 B$ [) R0 i; V+ _
  12.       'argument: '   + s(binding.arg) + '<br>' +
    : j3 m9 S5 i! t' `* c9 n& u
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    5 \. x" m2 C* n# @
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    4 G. d. ^- w" {+ T5 |0 G+ l
  15.   }" d. L* \* `) b' {  K* P6 _
  16. })
    : z. ?* U: N' U- r' b  @+ K
  17. new Vue({
    ; f6 H* k2 S6 v# a* r
  18.   el: '#app',$ b; K$ M0 y, _# W, b( c1 ~
  19.   data: {
      k7 ~5 ]# s8 u2 }3 K1 n# r' _5 @4 Z- ?
  20.     message: '菜鸟教程!'3 O! K' N/ [( @, }
  21.   }6 G1 i* A$ V% v! J8 ]
  22. })
    9 L5 S8 V! l/ @
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:! }' \. |. ]! @2 @# g
  1. Vue.directive('runoob', function (el, binding) {
    & {( T& L- E( i! P
  2.   // 设置指令的背景颜色" `+ f, E+ M: e+ x" c& o
  3.   el.style.backgroundColor = binding.value.color3 l2 m: b. l9 m
  4. })
复制代码
( u$ L6 A$ T% p
) M. d& r$ k; u  ]- r8 C$ ?
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例# N# V( {2 a; q# S7 ~
, K, N2 T3 B' a6 K0 Q0 i
  1. <div id="app">; U- r0 j* U; p" [8 S6 h2 p
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    # |4 B2 B+ K# s  {5 z: Y
  3. </div>
      {  q. x- M( \! v8 D' X
  4. + U) \. s5 j/ h' E
  5. <script>" ~1 q# q. L  u/ M
  6. Vue.directive('runoob', function (el, binding) {* T. j# F, h6 D# J$ T
  7.     // 简写方式设置文本及背景颜色
    2 B& V6 f: P: C1 e* e
  8.     el.innerHTML = binding.value.text
    4 b6 n# g/ T5 V9 C
  9.     el.style.backgroundColor = binding.value.color& A5 c) W# S; [! \$ `* D$ j: P
  10. })+ d' y1 k: M1 u9 y. P. V4 p. F- K
  11. new Vue({
    1 v' ]# S4 c/ |$ @
  12.   el: '#app'# L) `" G: ]) w( l
  13. })
    6 I4 N" X2 w  A0 P* e$ K' q
  14. </script>
复制代码
0 m8 [. d; \9 J6 x" C  s
) U5 d: S) z  ]& ^- |. A  U& r

5 w  j, J+ c, Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 10:51 , Processed in 0.049843 second(s), 20 queries .

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