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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
% P2 E' F4 @1 g
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
8 p! m5 s5 w6 d+ i! S9 k, z* Z; \+ T0 d% o1 h8 d( I) U# v
  1. <div id="app">' p$ l( j- K! e* w
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    . J2 l9 c5 H  h3 \2 F0 A
  3.     <input v-focus>
    9 P9 A+ s, f, ?/ n/ K. k
  4. </div>
    + d& N2 r4 i- Y6 a; Q% x

  5. 0 l* a+ I0 J7 H6 t! t2 h  a
  6. <script>
    7 {2 }0 J9 r/ k
  7. // 注册一个全局自定义指令 v-focus( h' q) u3 a. B1 }: W
  8. Vue.directive('focus', {
    6 i/ J) f# D: a/ l& g
  9.   // 当绑定元素插入到 DOM 中。
    * p5 A0 b; Y* r9 p, N
  10.   inserted: function (el) {# T% y7 z: ?0 H
  11.     // 聚焦元素2 Y0 `4 N2 b( r/ Z/ j( U( ?$ ]
  12.     el.focus()
    7 D$ T# I& l) s1 v
  13.   }
    + W7 C& p9 u: z
  14. })4 }# W) B0 G$ _* S
  15. // 创建根实例
    8 n3 s8 D; L9 w8 N' q
  16. new Vue({, U/ s; {, \4 V- j0 U2 p
  17.   el: '#app'
    3 O! O" \4 g( v' ]
  18. })
    / i9 y! F" q; d( U' Z
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
& h# P1 @6 |) `8 s- C3 L2 v3 V( m3 z7 A4 p, A* i0 I
  1. <div id="app">
    # D, J! I8 K: Y# e
  2.   <p>页面载入时,input 元素自动获取焦点:</p>/ b9 Q7 f2 O0 ~$ G% M8 ]6 E8 }( q
  3.   <input v-focus>
    ! N  I$ }0 ?7 V& @; B3 |
  4. </div>4 I- a* m) k( T( H- r
  5. 6 r8 i. Y; W# B8 h2 K' H
  6. <script>
    ( \& [) C! X. V: s# H3 \  \
  7. // 创建根实例
    " j2 K; m* E" J# t  N+ H9 y
  8. new Vue({
    / N$ D: b" ?; I
  9.   el: '#app',
    ( G: _9 d/ C, Q
  10.   directives: {
    7 J3 S0 T  Q& _* ^  N6 }; b
  11.     // 注册一个局部的自定义指令 v-focus
    # m9 p. O* D  [& r9 R5 }+ V  {
  12.     focus: {: E, h2 `* C& i9 M4 y
  13.       // 指令的定义
    5 N) |- Q5 T& X  r4 ]0 |( u; n' ~
  14.       inserted: function (el) {! w2 A( I( I( b* n* A$ K2 A. o
  15.         // 聚焦元素
    ' v: ~9 {* T2 z5 `
  16.         el.focus()5 ]- E$ V& ?2 }; z3 ~8 J
  17.       }
    ( W6 @' o7 q; w3 K3 M" A3 r
  18.     }3 Z: H) ?' |; v" c, {' ~1 M9 @
  19.   }. i/ n3 t5 L# O  T6 H
  20. })
    9 J# \+ T: y" x* F3 k2 m% ~1 z( H
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    9 w7 g4 T% e0 \
钩子函数参数
钩子函数的参数有:
  • 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 }。
      5 X) o5 T! Q4 |, {9 w2 P
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    8 ]3 l  Q% J# g
以下实例演示了这些参数的使用:
实例9 M# n5 U3 P" ?1 N2 |; l
+ z! m5 r0 O$ Y
  1. <div id="app"  v-runoob:hello.a.b="message">4 W% P: C  g% V% x
  2. </div>
    5 ?0 W4 K( o* z) K/ r( C9 |! y

  3.   i; S8 n5 n8 A8 }
  4. <script>
    1 o' m/ ]& q" V, |3 S  R+ \
  5. Vue.directive('runoob', {
    ) w* l$ Q1 z5 G* q" Y$ q
  6.   bind: function (el, binding, vnode) {
    7 R- ^$ U8 R. k+ X" }9 F% i
  7.     var s = JSON.stringify; L5 b9 |5 k9 N% R. ~
  8.     el.innerHTML =
    $ Y# P6 d4 m8 o! J
  9.       'name: '       + s(binding.name) + '<br>' +1 `: c" Z8 t7 [+ ^: F; g
  10.       'value: '      + s(binding.value) + '<br>' +# N4 O8 Y5 O& \$ N9 M- W2 ^+ ^! A
  11.       'expression: ' + s(binding.expression) + '<br>' +6 r% N, b4 H8 Q
  12.       'argument: '   + s(binding.arg) + '<br>' +
    & y/ A& R5 A) W* F4 o
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    7 d4 _& w0 t& F# G. C" k
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    4 |$ O( b, {5 T5 q, T
  15.   }0 I6 V; h  }+ f, \
  16. })- P+ v! L, x# g$ c
  17. new Vue({
    - I; x/ H4 }' c0 k8 h
  18.   el: '#app',7 e; k6 I6 Y0 ]' l
  19.   data: {4 I3 _2 D" h) X
  20.     message: '菜鸟教程!'1 s6 V0 u  {' F# q* m
  21.   }6 W" h% ~+ o5 [1 ]0 `. H
  22. })
    . w3 W: {, x( }: f- ]8 _% ^9 ^* J
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:. M5 s! f2 f* W% |) H2 _
  1. Vue.directive('runoob', function (el, binding) {
    0 E8 a, i! j! H* B# k+ C
  2.   // 设置指令的背景颜色/ W4 ~  z+ d2 G
  3.   el.style.backgroundColor = binding.value.color+ s$ H* B  ^( h. U8 z
  4. })
复制代码

5 a0 j/ ?/ m5 V! ?5 g/ x) w4 c& C
7 ]$ B/ L' r7 X" q9 \9 s9 B
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例- {6 @- }- Z- @+ B! n8 _5 N; u" r
1 w, O( S, K; W
  1. <div id="app">. G( G( @$ \4 s
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    9 o$ |5 x# C- D9 E
  3. </div>
      ?( s/ |- V; {2 n( O  I& a/ [

  4. / ?1 p5 G7 e( u
  5. <script>
    . |* N/ M* n+ @) q0 c
  6. Vue.directive('runoob', function (el, binding) {+ `7 S: g( L2 t$ E0 C4 u: n
  7.     // 简写方式设置文本及背景颜色
    6 V$ Y* t$ R! u" I
  8.     el.innerHTML = binding.value.text0 o# M% N: K- R' p  a8 b
  9.     el.style.backgroundColor = binding.value.color( p+ O2 E- Q6 h! d4 X6 ~: Q1 Y3 h- ^
  10. })
    % e" M, z( A3 d  e# f
  11. new Vue({2 o% i3 Z. E1 a, g! N% K$ z
  12.   el: '#app'* e% u& S& i5 D, b9 F$ n+ ~8 Z
  13. })9 H+ L- G. y4 N! M' u$ J+ T2 [
  14. </script>
复制代码
6 @  Q8 M/ H0 e
+ O1 k+ L- ?& W( Q% B, X( E

5 f! b; I8 O, X) Q. v2 T0 `) @/ D3 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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