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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

1 {: l7 i7 M# {% K2 `2 c: {
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例3 O7 j6 {' ?5 ^# ^
  T  U7 d! e! P, ~, x( X/ |
  1. <div id="app">7 I! |: U5 C! Y, l2 w) N
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    . L* `# a0 r, `3 n* \6 O' K& X: H4 T1 s
  3.     <input v-focus>5 l2 c2 m% o; M% X
  4. </div>
    $ a8 T. [3 J2 I* O; u

  5.   W  p- p( q* F+ n3 y: C" K$ N
  6. <script>
    0 a. D. e$ f: q  I; Y6 o
  7. // 注册一个全局自定义指令 v-focus' ?  N7 x$ w. D6 ~
  8. Vue.directive('focus', {
    . `7 ?1 Y- b: s) }# x9 Z) F" v
  9.   // 当绑定元素插入到 DOM 中。
    & `! x8 o8 A) D/ W$ s7 W$ O
  10.   inserted: function (el) {
    - Y' g# H/ U* T. d4 R8 i( q
  11.     // 聚焦元素
    / J4 Q: x; M: T& z
  12.     el.focus()2 D* v3 t* x+ I+ D+ v1 d
  13.   }
    5 ], |% A- V3 v, m2 f' V1 A
  14. })
    # N( [5 U3 K8 K9 r5 K2 b
  15. // 创建根实例4 {; F0 W8 _2 Z! L
  16. new Vue({
    ; |0 K# Z) x' C6 b3 `
  17.   el: '#app'& p( D/ J* F6 ~' d
  18. })
    . O( b8 J3 ~( v. g
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例$ K8 e) s8 X: W% k; A

8 q) L  l9 N) I9 V  A1 |0 f
  1. <div id="app">
    - \$ D9 K: l5 W& i
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    2 f  F2 ?: l2 v7 l  c
  3.   <input v-focus>/ b' ^9 m( O) y- ~" W( p( X
  4. </div>+ g  J0 G9 o) s/ o2 K' \4 L# g& ?

  5. - R# M0 z4 l  c6 W; i
  6. <script>' V+ [+ y+ v$ M9 T0 R% r$ B! [
  7. // 创建根实例
    " q$ C- E: [6 q  t- w5 X
  8. new Vue({3 Z& t, v. Z; Y3 m0 s  g
  9.   el: '#app',% B5 w* K! a% P* M4 d, N0 l
  10.   directives: {
    6 ~3 c# v$ |; ^2 S( J
  11.     // 注册一个局部的自定义指令 v-focus
    / w* p' Z; L+ i" g
  12.     focus: {) x" S4 n- {! H$ |
  13.       // 指令的定义
    . E6 E4 _1 }- m9 J* C
  14.       inserted: function (el) {
    1 c3 p5 ]. t) h; P* f" f
  15.         // 聚焦元素
    ! O2 J7 Q. l  t( u# J; m
  16.         el.focus()
      }, O/ V; |, ?, t" \
  17.       }
    , K1 ]4 X9 u/ G
  18.     }3 m$ i7 F0 u, }# P
  19.   }7 v) f$ P; Q# B/ h; B
  20. })+ C6 H. @! R  t+ l0 C! g6 B
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    ' K( }0 t! i$ r
钩子函数参数
钩子函数的参数有:
  • 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 }。, ^% P8 |' w: u
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    + M5 p0 z9 F3 F- S
以下实例演示了这些参数的使用:
实例, C0 I; A8 Q1 ?- c, R
0 }6 ^5 B9 u1 u) [6 R( ^" \( V4 K
  1. <div id="app"  v-runoob:hello.a.b="message">
    " o5 b& t; O" Y) Q
  2. </div>
    ( ^6 Y9 ^8 s7 z9 ]
  3. 9 p1 x8 ?( ]9 X5 g8 e9 S
  4. <script>' t* W3 L: c& c. e
  5. Vue.directive('runoob', {6 z* Z" K# t$ {* ~
  6.   bind: function (el, binding, vnode) {
    & K( v/ H$ F  C8 m4 z
  7.     var s = JSON.stringify
    8 E& L+ r% x6 ^. ~% u
  8.     el.innerHTML =3 X' l$ ?* Z* |6 t
  9.       'name: '       + s(binding.name) + '<br>' +
    $ S: L( B5 h$ m, \; R  e3 L  l9 Z
  10.       'value: '      + s(binding.value) + '<br>' +6 @1 M. v& m$ ]5 d5 d! z
  11.       'expression: ' + s(binding.expression) + '<br>' +0 b) I3 N  j6 f) L) i1 v' ^  s
  12.       'argument: '   + s(binding.arg) + '<br>' +- ~% {- d" G9 R/ e2 g; O
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +. p; E# E  J6 E( D
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    % z: ?+ E7 X9 ~8 g1 d
  15.   }) K3 M, Q$ M/ p0 ^
  16. })1 T1 \2 e/ O5 s% v3 m
  17. new Vue({: u2 k9 l( z% L5 A, \1 ~
  18.   el: '#app',
    6 f5 p, r# T1 h7 c6 b
  19.   data: {5 u. K. ], i  b4 p$ g1 ?( Q
  20.     message: '菜鸟教程!'- |5 A) s- [$ A: Q" p, R
  21.   }# q# d* g% [; |6 H' Y- U* E. w- X7 d
  22. })
    0 t% Q; Y0 v8 a5 K& }* B( _5 j# b
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
* p0 _( @: M) g) Q3 H" B
  1. Vue.directive('runoob', function (el, binding) {- H& `% D5 w- u7 ?- r
  2.   // 设置指令的背景颜色7 N8 K5 |7 p# m4 W' d. a! a
  3.   el.style.backgroundColor = binding.value.color
    + U. p, }! W& p- j$ v7 E# `/ g  S
  4. })
复制代码

& H' f6 h. i# }4 X7 |' x
" L1 V# C. @' _$ M6 d. U9 Z
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
; r3 q4 \* U. W; c6 l+ {& S  y
% s5 p" {: T) P* B
  1. <div id="app">
    ; V+ x$ a2 g! Q( w
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    ! Q* X+ }1 k& Z" K( {  ?9 X8 ?
  3. </div>
    0 l: I; U1 P; t, x

  4. ( q+ D  A: Y4 n! W- Y
  5. <script>5 X+ ?: v( s$ d& C
  6. Vue.directive('runoob', function (el, binding) {
      _9 }" T( g9 h  r
  7.     // 简写方式设置文本及背景颜色- n( z" V2 l( Z! O6 Y( R3 `. O
  8.     el.innerHTML = binding.value.text0 z# y; y. v  C+ ]1 T
  9.     el.style.backgroundColor = binding.value.color, B$ x* c/ f$ W4 b8 p/ I, b' Y
  10. })$ C# o! o( K! X9 E
  11. new Vue({
    ' L: d1 l4 P, v& G: V0 J
  12.   el: '#app'
    . K  W( }. Y! j" r9 q5 `
  13. }). G  R" F+ o; ^
  14. </script>
复制代码
' X# D: y# O$ `: q

+ ]0 j  I8 _# t" S4 k4 `$ D$ G8 q3 y/ P0 V1 t( ?) X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 15:45 , Processed in 0.116059 second(s), 20 queries .

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