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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
8 C; y: Q7 E2 Q; m6 q
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例" D: _. g; u* f& ~7 L
7 K" Y  M1 D1 ]6 s
  1. <div id="app">5 @) L; D- R/ O/ v* ^6 d5 G
  2.     <p>页面载入时,input 元素自动获取焦点:</p>( S* s' t# W2 E0 O5 V
  3.     <input v-focus>
    8 h5 i$ Q6 d6 j; S- t/ ?) ~: I4 `4 h
  4. </div>3 }4 |( |8 L' d0 {. L8 O% j6 Z- A: j

  5. # H* P7 v) [* u1 n* m/ l
  6. <script>
    . r5 g1 Y2 s9 {7 q
  7. // 注册一个全局自定义指令 v-focus( l5 q; S4 w2 I+ a2 m
  8. Vue.directive('focus', {
    - m; U( `) h- w% ^( O6 t5 g
  9.   // 当绑定元素插入到 DOM 中。
    8 J; M9 u& H7 ~8 b
  10.   inserted: function (el) {
    ' d) N" X  a. l5 c
  11.     // 聚焦元素6 r+ V7 f& K; T1 z% D" q
  12.     el.focus()  e$ A! s0 ^7 v. d: k
  13.   }9 U/ D! }! Q, y' J4 O
  14. })
    : j8 d' Q) D( x' v& n
  15. // 创建根实例
    * D+ q: f4 b+ O4 y/ d9 ~
  16. new Vue({
    0 j# N6 b% t. d5 c5 y- Z. r
  17.   el: '#app'
    5 I8 K' M' `( A0 Q) Q! m% x6 @# i5 r  J
  18. })
    # }) i  p6 Y% F+ N0 Y& P1 a) f
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例8 z+ f. E# e3 `0 A
+ D, x  x( g* w+ t% N
  1. <div id="app">
    ' O- X2 T5 w" f1 v
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
      T* ^$ R2 Z7 X* u1 h
  3.   <input v-focus>! J  z6 o, |) ~" Y* s$ n
  4. </div>
    ' m# _# \1 C7 |) I3 z# N

  5. , {3 }2 m5 m* @7 V; E
  6. <script>
    6 d' l. F5 w/ i
  7. // 创建根实例1 q$ \! j; ?4 k) }
  8. new Vue({" F6 ]4 [4 j8 ~2 C. x: A
  9.   el: '#app',
    " b9 r' ?  b5 a
  10.   directives: {# v* S" A% M/ p7 J
  11.     // 注册一个局部的自定义指令 v-focus
    - B8 |* G' B5 W$ [( V
  12.     focus: {0 E% c  Z+ S1 x& K: ]! ?, e1 N6 e
  13.       // 指令的定义/ u8 Q% |0 P0 g2 b6 Y8 }
  14.       inserted: function (el) {! a( o/ X" w. F; Z5 p7 X
  15.         // 聚焦元素. h7 Q8 A7 V, u8 ^: W+ D: d+ u
  16.         el.focus()
    . p& F5 o6 q% u% j! \) t9 E- S: N
  17.       }# r* Q% b' G* Q/ K
  18.     }+ d2 n. K, k. Q( x1 |
  19.   }
    , e6 h3 l/ S+ U2 |7 A
  20. })
    2 W% S9 G8 Y9 Q; v
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    + \+ O" z+ T# t  F6 ^
钩子函数参数
钩子函数的参数有:
  • 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 }。
      3 ^8 r. x+ L5 L  e4 K) O: k% g
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    / g8 F4 y" a" M% L
以下实例演示了这些参数的使用:
实例
& o0 Q1 x6 s9 _$ T6 Y0 ?, Y& v! |$ l' h1 {0 ~
  1. <div id="app"  v-runoob:hello.a.b="message">
    2 c& q% I  j' p0 [! Y$ Q
  2. </div>
    3 h" S8 B( q& T5 B3 x2 M
  3. ' D! P6 {" Y7 H9 S# Z% _. F
  4. <script>% `: F6 O6 w# A' u0 N% ]2 ]6 m3 u
  5. Vue.directive('runoob', {
    # S- d' G. M! s7 w+ \! O, u
  6.   bind: function (el, binding, vnode) {5 B% B! W! U, P
  7.     var s = JSON.stringify
    4 }1 C  O: e5 e$ r$ V
  8.     el.innerHTML =3 h7 [7 W8 s7 c! o; O8 e( t0 n7 a
  9.       'name: '       + s(binding.name) + '<br>' +, B% _7 H) [3 E2 @' f
  10.       'value: '      + s(binding.value) + '<br>' +* B; r' ^7 j. @5 J
  11.       'expression: ' + s(binding.expression) + '<br>' +! a- d; w1 Q% p' |
  12.       'argument: '   + s(binding.arg) + '<br>' +
    + |) }+ l9 |6 q, M$ v7 V0 s7 f$ X
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +( Y4 h& S) c  k( y# R
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    5 L# ?) a0 f: x8 _* C0 W
  15.   }, I0 a% q" f, i
  16. })  Y9 T5 P0 y4 A
  17. new Vue({: H) Q" K, |- ]# w
  18.   el: '#app',
    3 o; Q7 N( J6 u4 \
  19.   data: {
    & ~' @! z1 ?+ L( h3 G+ x
  20.     message: '菜鸟教程!'
    + x( P/ I/ H- C
  21.   }; q- z% I% l( H+ P
  22. })  m* Z# q$ r# w
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
7 E- v" e: P4 E2 c* D) W" _# G
  1. Vue.directive('runoob', function (el, binding) {3 b% k1 g7 i1 W  Q) I" g% a
  2.   // 设置指令的背景颜色5 T1 v5 _4 y; H; h
  3.   el.style.backgroundColor = binding.value.color# X; u- a- A& v$ y, F5 g
  4. })
复制代码

0 v$ h+ ~9 h& g" L7 S; d' _0 C  F8 w& t0 C+ ?3 f) O! i* Q
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
: @. T8 g8 C4 y$ d& ^7 X1 s  m' N+ A% o( b& X! T
  1. <div id="app">! s! K' W4 g4 W* Q. W
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    : i' k' E$ v0 o( D
  3. </div>2 M9 f" k$ r. D$ l6 f
  4. / {1 J2 e% ?0 h# L3 V
  5. <script>
    " l- s: P; x) Y
  6. Vue.directive('runoob', function (el, binding) {/ W4 U: m$ M1 ?. F; ]4 P
  7.     // 简写方式设置文本及背景颜色
    * R) W- e0 q3 Z2 [+ o
  8.     el.innerHTML = binding.value.text
    3 i* P: T) |& y' `; j
  9.     el.style.backgroundColor = binding.value.color
    8 V& Y, W, Z; ?5 S% s8 o& M, ]0 d
  10. })5 {7 k/ v2 T: _" d. O
  11. new Vue({
      {5 Y' E1 {  b
  12.   el: '#app'
    : b9 k+ @2 D- ~
  13. }). y( C4 s6 h7 c/ u# Y- [
  14. </script>
复制代码

; B  H! O$ J0 K- C5 G/ T
1 X! M6 w5 [5 E6 k' z9 }; ^- a( K% D1 O+ S3 g9 I5 P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:26 , Processed in 0.061821 second(s), 19 queries .

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