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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
( u$ a. Z; _7 ~0 t
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例4 Q8 X8 c1 d  Y3 p
; N2 J, k# M4 {/ v2 P, m2 ^
  1. <div id="app">
      w# N9 m$ u3 C, y2 Z
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    * h( o/ C$ n; z+ n: R
  3.     <input v-focus>, r  [4 z" |$ N" l1 z; I
  4. </div>
    " J7 p  G: A3 y) t/ `
  5. ; X  W! T# Y0 t8 [
  6. <script>
    ; ]5 S# p7 u# }9 n7 \+ g5 ~* I
  7. // 注册一个全局自定义指令 v-focus' i; Y7 r, |8 U
  8. Vue.directive('focus', {
    - N5 o8 a' c% a' z6 t4 T3 {  _
  9.   // 当绑定元素插入到 DOM 中。4 J1 w& S4 k  G7 z; w- t6 C/ o
  10.   inserted: function (el) {# r9 _; O% t  O' e% C
  11.     // 聚焦元素5 f2 b6 `) f7 V- {: g
  12.     el.focus()
    1 I0 r1 ?7 ~) I3 M) Z& c" c
  13.   }
    0 i9 n* {: o& ~8 Y! ~- z$ Q
  14. })
    * n2 ?% l$ \6 u* F, U8 _; K) s
  15. // 创建根实例2 E& W! i6 }3 F) E
  16. new Vue({
    8 R- X; f9 r2 e7 S& z7 {1 c# g7 u
  17.   el: '#app'3 ~: f. \' P( l( L
  18. })6 O8 k" o: o1 i  q6 ^# E7 y
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
% r+ ]3 q# N, G8 R9 l" M/ H5 Y4 Y
  1. <div id="app">% I- Z% x& o, K) ^  N
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    ) s; r- M+ v" Q( ?! W5 c. m
  3.   <input v-focus>
    / R& p  [  }3 D
  4. </div>9 ~: z; e+ A8 e8 P- C6 X

  5. / h3 y: w& |  @2 v
  6. <script>
    1 C% _$ H) E& a$ F* F1 N% {  e7 g
  7. // 创建根实例1 h5 p5 ~9 u6 `- ]9 c0 I. C
  8. new Vue({9 H$ ]0 W2 n+ Z9 b
  9.   el: '#app',
    0 o% q: s/ L4 \! ~0 Q! `! E/ e
  10.   directives: {
    % B+ ~& T) A; n* J5 A+ _
  11.     // 注册一个局部的自定义指令 v-focus" B& w0 u- v! t  O9 e; ^% K
  12.     focus: {" I# f  _! v, N& ?, q# h. Q+ T
  13.       // 指令的定义1 m6 _4 |4 J- `8 R. A- N
  14.       inserted: function (el) {: k7 ?7 T+ Y* m$ o; k" k
  15.         // 聚焦元素* _$ m( O4 B0 r
  16.         el.focus()
    + m7 t' |/ @) X7 s( Z
  17.       }0 P; P5 Q5 J+ g/ H
  18.     }+ \: g$ S4 [; ^6 H  W2 S  _! P3 a* O
  19.   }
    ' L9 ~. Y" I$ M: _
  20. })
    ) B/ v& K1 ?; n
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    9 J# j6 y$ T* w) j
钩子函数参数
钩子函数的参数有:
  • 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 }。
      + f: e5 R: I  z+ e
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。' [  B- w- @2 i4 X/ T0 }) z$ i
以下实例演示了这些参数的使用:
实例! h8 G: W% I: @  c

4 ^& H3 J& ~7 N% f! d
  1. <div id="app"  v-runoob:hello.a.b="message">
    # T- P9 E4 a/ `3 x3 [- T
  2. </div># H5 ]7 `: @; x, K4 T3 x6 M, M- J
  3. # e2 M  c% w9 n$ N
  4. <script>
    0 J5 \0 N4 F& y( Y/ l
  5. Vue.directive('runoob', {
    ' E! }; G, R% |$ Z/ d7 o& I
  6.   bind: function (el, binding, vnode) {
    4 W* f. U: o- C" d
  7.     var s = JSON.stringify5 ~/ J8 H$ X" S! w% K$ T8 U
  8.     el.innerHTML =/ S" C. V  E; z4 K) K
  9.       'name: '       + s(binding.name) + '<br>' +: {# f( \% _) E2 x; w: _! K8 I7 d4 j, o
  10.       'value: '      + s(binding.value) + '<br>' +, H7 I& P0 k0 J* |
  11.       'expression: ' + s(binding.expression) + '<br>' +
    * n4 P9 H; F* K3 \' I( J1 E: u1 t
  12.       'argument: '   + s(binding.arg) + '<br>' +
    , {5 N- X5 s# O" `6 H/ o
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    + ~3 E+ x+ t. A
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')! c6 Z7 J% i8 `. W  ?
  15.   }
    4 f/ B) ]' |- |% z% A1 c9 S- W
  16. })7 u" T% Z8 N/ _9 Z7 N- z# h
  17. new Vue({
    - s5 f2 i% e! ]- z: {, _# D8 |
  18.   el: '#app',7 J/ N4 B7 q" h/ H' ^
  19.   data: {
    / [( R4 R& D, A1 @7 O
  20.     message: '菜鸟教程!'  m$ J3 Q9 Z7 n
  21.   }: ?, q% Y5 p1 G# ~
  22. })
      |. {1 K1 l  S5 K6 T# p2 e
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:$ q9 P+ q! ], N, l3 K
  1. Vue.directive('runoob', function (el, binding) {
    9 A: r1 _2 V7 n1 M9 v
  2.   // 设置指令的背景颜色
    - l8 g* ^9 w) a7 d0 y3 Z% z
  3.   el.style.backgroundColor = binding.value.color
    & W1 A( E; H5 u" ~# h& ?/ ^
  4. })
复制代码
5 K9 y" x8 ^: g& B( h6 G

+ m! r0 D( l' V- B
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例& V$ H2 L" \0 d( a( @
- U9 S3 k. c: X3 k
  1. <div id="app">5 b9 J8 f5 C) B& C: M$ [
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    ' |: x& _9 k; k, ?9 [3 p1 K
  3. </div># y8 r/ s7 F5 o1 `5 }
  4. 2 @* g$ t) q7 c8 m
  5. <script>9 Z+ l8 G+ Z: x) \4 Z5 D9 m
  6. Vue.directive('runoob', function (el, binding) {% v/ Q6 U+ f/ G0 Y2 ]
  7.     // 简写方式设置文本及背景颜色
    ; R* H! W, ]; L3 l9 g
  8.     el.innerHTML = binding.value.text
    / e: v& L5 E9 G; x8 K- r% z4 w
  9.     el.style.backgroundColor = binding.value.color" J9 b7 v) I0 G* k6 N' r" D, \: A+ u6 \; i
  10. })/ \6 u: Z/ |7 Z' n# u+ v; d
  11. new Vue({
    ( C0 i. @/ X3 a) v7 X2 r, G
  12.   el: '#app'1 F6 O: t4 P- J- H$ E
  13. })
    # I( m, u( @  J4 F5 B# ~
  14. </script>
复制代码
  K+ U, c, F3 r6 `
8 J: ^' l1 L' [& \6 P" D$ Q

0 ^8 ]9 p6 d! n& v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 21:27 , Processed in 0.114614 second(s), 22 queries .

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