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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
# R7 v# P/ A1 y1 L3 y
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例; Q& F" s. m7 ]  a2 D6 r9 a/ g

! U& G$ N- |" X! m( a0 t# V
  1. <div id="app">! v% `* A3 t* y0 [/ ?& S
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    5 T+ i3 g; m' @" k7 A
  3.     <input v-focus>: t/ b- s: e0 o5 u7 ]2 |
  4. </div>0 ~8 ?" b5 ^, r
  5. / \$ S/ l% u( C  u
  6. <script>+ n4 \! s% G) C3 K/ k0 {8 g
  7. // 注册一个全局自定义指令 v-focus3 x9 @# t* s% c0 G" Y! G4 ]
  8. Vue.directive('focus', {
    + m, D$ U* b& u9 P1 F3 u
  9.   // 当绑定元素插入到 DOM 中。% ^4 N/ y6 h" O' `- A
  10.   inserted: function (el) {: m: f  |& R6 s
  11.     // 聚焦元素% p' O5 U# S0 e1 k& o! s3 q& B
  12.     el.focus()! F& v, X! ?8 ~6 Q
  13.   }4 d$ E% Z! \# I
  14. })' M- c$ _6 `& C1 z
  15. // 创建根实例- p1 Z5 J/ r% U0 J6 d- ^! Y
  16. new Vue({
    % U7 ^( h# F( r6 b6 Y
  17.   el: '#app'1 L9 G: V; [1 |$ A' y8 ]
  18. })1 U/ A8 n: b: R* x$ j* k0 C
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例7 A6 Z" ^  g9 A$ K

+ |. u* ]: M. c8 R
  1. <div id="app">2 v; U% N6 c* A% y7 C
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    + Q, B4 |. L. q1 Q2 a4 O3 X& G- N
  3.   <input v-focus>8 S/ `% }' a2 L! ?! ?! h1 m% U4 D
  4. </div>6 x8 s! \; g% g  `
  5. * M7 d' ]9 m3 P. u7 O6 G
  6. <script>9 A6 l7 _5 I( z9 b
  7. // 创建根实例, o& I& X$ ?" o8 `+ y& H: _( O2 u
  8. new Vue({
    : o8 i: d+ C9 ]" P2 v
  9.   el: '#app',  s, @: a- p' u! U" N- p+ D
  10.   directives: {
    ) M3 I" d7 R' p4 b2 |' {
  11.     // 注册一个局部的自定义指令 v-focus0 E+ Q1 l4 F1 k; E0 w
  12.     focus: {/ _( |8 s5 Z4 q- k8 e0 o" t  B
  13.       // 指令的定义: o4 I* z( U2 n' _7 t
  14.       inserted: function (el) {
    6 Y+ \" A% i& u# Q8 O! ]3 C
  15.         // 聚焦元素" {7 W' D# t. ?& I- D
  16.         el.focus()
      W7 K$ v3 e. \) k+ V
  17.       }2 ^6 g% V  u. ~! y5 I1 ^# S* W, b
  18.     }
      Q! Z0 Z$ j! q3 |/ i7 l5 L3 O! m7 c( U
  19.   }
    $ |1 t  Q& I$ K8 E/ B' a% o
  20. })) `7 E6 H! P7 a* s$ Y3 U& h; S: o* P
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    + k6 g- ^6 m. S8 v0 ^4 v% R, m# \
钩子函数参数
钩子函数的参数有:
  • 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 }。& A2 G6 q8 Q# d( B: w2 L
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。/ ?( X  J" ~5 M; K  W* k
以下实例演示了这些参数的使用:
实例
0 u* \: a' D2 [1 S/ N! {$ }  i3 q: [( ~
  1. <div id="app"  v-runoob:hello.a.b="message">) i8 f9 J- x8 \- F/ N0 t$ D! k
  2. </div>1 ^+ l" t; w' v0 h* y! c6 y+ F

  3. ! c% B5 W4 o. e" U4 ^8 u$ N0 u
  4. <script>, r. k8 W3 r+ m( f
  5. Vue.directive('runoob', {7 I/ K! q6 g0 K9 V
  6.   bind: function (el, binding, vnode) {
    . m  ~" }! k: s" K. T! u2 b: p
  7.     var s = JSON.stringify
    0 p7 L$ T' o1 R% p
  8.     el.innerHTML =( J$ _6 o! U  S3 Q0 b- m
  9.       'name: '       + s(binding.name) + '<br>' +5 @/ X$ G1 k( J- k: U  B
  10.       'value: '      + s(binding.value) + '<br>' +' n+ v8 a$ }' p- U! S1 H4 B, n
  11.       'expression: ' + s(binding.expression) + '<br>' +
    7 f' v- c! w- n( V& R
  12.       'argument: '   + s(binding.arg) + '<br>' +( J% M- t  f0 c5 t
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +' u) H- A. g, c$ V
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')$ `/ n* i7 R6 Y
  15.   }$ s% r; _$ Y' R
  16. })
    " f0 D2 H- g. \5 d
  17. new Vue({: V8 p- ~9 F* Z. [$ N* J
  18.   el: '#app',
    7 O1 c$ ~9 Q6 [8 l) {) J" Q3 K
  19.   data: {  }* [5 Y! b0 L+ N
  20.     message: '菜鸟教程!'
    / E, O) Y1 b2 }2 J" f5 Y
  21.   }
    3 X* R4 Q9 H' o6 j4 k3 ^( ~3 }
  22. })7 |% U2 G( z3 P- }
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:" L' {# g# T% A* L( z
  1. Vue.directive('runoob', function (el, binding) {  E- M3 f& \( w/ K" z; o
  2.   // 设置指令的背景颜色
    / [2 |4 c; z/ h) m: `, D# p
  3.   el.style.backgroundColor = binding.value.color
    , m9 U! H, z2 z/ t2 J, ]* i# z3 Q
  4. })
复制代码

7 r/ p+ P8 ~* s$ ^
5 l7 I* R% l* ?# E$ v
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例3 A% g! X5 W& a( r4 @; i
% V' k8 M7 B: k
  1. <div id="app">% ~5 L" C, ~4 w& h& S4 S
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    9 p9 J- T) v# A
  3. </div>& z( ?1 Q% ?7 S. Q' q/ E
  4. 1 d% A2 ~5 [2 \3 w8 k( ~, r
  5. <script>
    ; {3 z9 h6 @" L+ {' y7 H; {  G
  6. Vue.directive('runoob', function (el, binding) {. P$ `( [: b. V# x
  7.     // 简写方式设置文本及背景颜色
    ( y& I! d+ N$ t& B3 J
  8.     el.innerHTML = binding.value.text- B9 q$ o3 u' B5 H8 ^! ^$ G7 G3 l% Z
  9.     el.style.backgroundColor = binding.value.color& e0 b0 V: B7 G: g: w) x* w
  10. })1 c) D4 z, e* `7 H& c- i
  11. new Vue({$ H" \" e9 r% S; W4 f0 [
  12.   el: '#app'
    - ^2 B6 A# z% G  w: V
  13. })
    " T3 ]2 t7 X, v) F' d
  14. </script>
复制代码
1 {8 f3 X3 r& Q0 W
9 p2 c) r( ^$ E: }' ?6 o/ g
  w8 m- h/ Z- M3 U' Y; x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 05:17 , Processed in 0.064243 second(s), 19 queries .

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