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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

8 q5 r0 @3 N$ j
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
" ?4 V; F) }# v* y
3 a) s  c2 K9 x3 {7 m1 }: ~
  1. <div id="app">& m, M# u! b& T( k
  2.     <p>页面载入时,input 元素自动获取焦点:</p>* U- N7 C3 y- c: C" V$ X/ q  a6 @
  3.     <input v-focus>, Z; }! t/ l, @( S
  4. </div>
    6 u  Q* t- L3 H8 b: u0 r

  5. 6 s" D/ k9 O9 _) }& Q- b3 a
  6. <script>) n; V! E; c# p8 }3 F" s  e
  7. // 注册一个全局自定义指令 v-focus* h$ ~: n# ^6 a$ A3 Z5 V
  8. Vue.directive('focus', {
    - U% g2 K: g+ W$ a7 I
  9.   // 当绑定元素插入到 DOM 中。9 u1 c6 I! B8 z0 V) f: i
  10.   inserted: function (el) {
    / v9 Y7 m% b0 @8 d- H, Z
  11.     // 聚焦元素  ]8 b5 i: R; F% J
  12.     el.focus()
      o; M, d, C9 F2 p3 G1 Q
  13.   }: i8 f2 Q- x5 a' e) T5 A  }  H
  14. })
    1 a& @5 ?. H0 R7 u  F
  15. // 创建根实例  A( V2 [- \% |4 \5 l' b+ s& w: d
  16. new Vue({9 D& F' a2 @! U
  17.   el: '#app'
    ' |# X+ ]1 ~) S+ V- B/ i# M
  18. })
    8 {& I2 G& e/ I0 S8 M' @7 F
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
! ^7 n; g8 V9 @8 M' i/ |8 R9 B5 J: e9 }  i% h
  1. <div id="app">
    % h( D/ n' i) m3 C- z  X. T; o
  2.   <p>页面载入时,input 元素自动获取焦点:</p>$ I7 F7 W/ o1 x$ o2 ?+ q+ R$ D
  3.   <input v-focus>
    : W$ Q1 n: i3 F# i* u: X3 Q$ M
  4. </div>
      i: u, u4 Q1 w: n2 O

  5. % P$ m3 O0 u$ p$ y% b
  6. <script>" h4 g" b* o- \& I/ h7 V8 l  s
  7. // 创建根实例
    - e3 x7 ?7 }# R& `2 q0 F( X# M
  8. new Vue({- O* h5 m! T* D1 z
  9.   el: '#app',
    . T2 n4 Z! N% {
  10.   directives: {
    8 a; i4 \0 ~( l7 C
  11.     // 注册一个局部的自定义指令 v-focus
    0 f+ _6 p( ~0 v7 f& v/ l
  12.     focus: {& w' F# x4 R2 [' w
  13.       // 指令的定义, _, [; W% W# r* m
  14.       inserted: function (el) {9 ^. Z) Q( u$ {6 }( g9 A
  15.         // 聚焦元素
    4 f. R. ]: v. L; T/ [  Y
  16.         el.focus()
    0 {) _  p! Y6 ~$ D4 f
  17.       }
    " H* s( _1 m  k7 `' ^1 e
  18.     }
      v9 v" q+ h1 Q4 k" O4 r
  19.   }
    + y$ Y  C0 j: @9 C
  20. })
    , i) ?0 Y- i4 h9 k
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    2 {/ |! f6 |: ^2 D" K
钩子函数参数
钩子函数的参数有:
  • 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 }。/ l6 p  i* W7 ]# ?* G; P
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    2 \) X8 z6 ?- ?" R! H7 z7 _
以下实例演示了这些参数的使用:
实例8 P5 t1 m1 Q" ^. z1 v/ K

& B8 p8 Q# }$ ]7 K$ D
  1. <div id="app"  v-runoob:hello.a.b="message">
    ( T/ P% o- w* @& W& X: k6 A
  2. </div>
    9 W& d; W: ^* [
  3. - l* E/ r. |9 d% [4 X
  4. <script>
    7 v# b, K' g. V' R+ Q
  5. Vue.directive('runoob', {
    ) x2 p* U+ v" q: g, _
  6.   bind: function (el, binding, vnode) {
    , ~. _& Q/ S1 O
  7.     var s = JSON.stringify
    / c0 P( M, }4 L, I5 x
  8.     el.innerHTML =
    ( J* q1 k# w7 T% C: ?% f( D
  9.       'name: '       + s(binding.name) + '<br>' +
    : v0 z- _# t7 B7 F+ ~" }
  10.       'value: '      + s(binding.value) + '<br>' +, b; d. S# [) b5 B  @+ U( w
  11.       'expression: ' + s(binding.expression) + '<br>' +
    7 C3 `) P' T6 j% X" Y1 h
  12.       'argument: '   + s(binding.arg) + '<br>' +
    6 ~  _. _$ s# J9 n( |1 q& q0 H2 p7 u
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +# ~: w! x! i* |+ [6 l5 d
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    6 N( V8 u) y% g" Z7 _
  15.   }
    3 ^+ y. V# P, G% s' Y
  16. })  ]9 c8 I6 P: ]: c: {) j
  17. new Vue({
    $ z8 t' W7 l! J
  18.   el: '#app',
      i9 r) T; k+ X6 [
  19.   data: {
    9 }" t% P" O, {% }) {5 @# t
  20.     message: '菜鸟教程!'6 \' ?( J, _3 \2 L  ]' q1 I) J
  21.   }
    ! g% l" ?" g3 m8 Y
  22. })
    ) D' H- a+ q7 a. u; o. e- L
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
; _6 I7 J+ a0 L2 I: U
  1. Vue.directive('runoob', function (el, binding) {* L3 Y# b: \3 x" x
  2.   // 设置指令的背景颜色
    ( `5 i: m7 G: X3 V( P) ?! m4 {
  3.   el.style.backgroundColor = binding.value.color0 z! z: w8 r* Q, f
  4. })
复制代码
& a9 u1 x, G2 T6 b
, ]9 e1 K0 e  r; k9 X9 }( f1 H! s) J
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例0 ~/ L8 g  w* d& x1 ~
9 R6 @6 s" P+ Y/ D# b" `- W* R
  1. <div id="app">
    6 P9 ~6 [/ B$ W* d* Z: s
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div># x) l8 w5 ]1 W9 \; Q
  3. </div>
    / |* ^) W) O* E. Q+ G1 G

  4. ( F9 H* u5 B  `* q8 M
  5. <script>
    5 D9 M! p+ e0 d5 m- ]
  6. Vue.directive('runoob', function (el, binding) {1 i6 _4 N- n7 a' `/ L8 F
  7.     // 简写方式设置文本及背景颜色9 K6 z- s+ L3 I* D1 z
  8.     el.innerHTML = binding.value.text
    8 ?  j+ W# J& N- B/ z* t
  9.     el.style.backgroundColor = binding.value.color
    & Q: J, s; H$ t; M- A6 X- p
  10. })
    ' F" k8 U, p$ T* V  |% ]1 D
  11. new Vue({
    : |" N1 Z  S+ ?( l7 e) ~
  12.   el: '#app'
    5 o3 v- O5 R% e" i  ~
  13. })- q% A# D( F, R1 ~" m* v' ~
  14. </script>
复制代码
& A) r0 I0 [* Q; c& U6 w
7 C% y) \6 y" t' n

4 W+ D. Q1 @. d% f) j" _  E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 13:33 , Processed in 0.059913 second(s), 19 queries .

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