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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

5 E$ X: D( K# ~/ Q0 }! x, I6 g
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例# L' P; F, d9 x' C& L& F7 [$ g

9 w1 I3 V2 Z' j8 c* k( h8 m
  1. <div id="app">
    & x2 N- I, l3 u
  2.     <p>页面载入时,input 元素自动获取焦点:</p>( Q3 e! I( J% v  W3 S
  3.     <input v-focus>
    . p' ]& g5 Y1 |; \# P; A- b
  4. </div>
    / H6 P# x- v/ y. L9 E* S5 d! b& v7 h
  5. ! Y5 f/ e' i+ O- i7 _0 @
  6. <script>2 a1 M# N+ j& D7 v- H/ ]8 H
  7. // 注册一个全局自定义指令 v-focus
    4 P) ]* S$ h. ~8 q% ]
  8. Vue.directive('focus', {0 B, E; t! r* \8 P: y! a
  9.   // 当绑定元素插入到 DOM 中。8 P  Y& P' E1 R+ n! b
  10.   inserted: function (el) {& h* {3 d, u) E: U4 c
  11.     // 聚焦元素+ [) V4 s/ C2 n8 o8 J: v) @
  12.     el.focus()
    . ?) b/ g+ n& c2 L7 X
  13.   }* K8 l- L- q: v
  14. })9 L' C4 X; q/ |8 y, o
  15. // 创建根实例& O0 m* p5 f0 |: |" o
  16. new Vue({
    , K' H: ?) d' v% E  i1 N
  17.   el: '#app'7 g. i2 o1 S; X5 ^  U7 s, g7 d
  18. })+ ]. W  a) G7 e
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
6 E; ~6 ]9 s4 O/ N( r9 S5 U, Z6 d1 k: C; G' c5 s% Z& I
  1. <div id="app">
    5 [0 x4 F4 c9 |9 K& {- {
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    * T; y8 [/ f+ ]( |( _4 L
  3.   <input v-focus>
    : G7 j& E2 b% [4 Q# v
  4. </div>/ R! n/ _& W" B- a

  5. , v  F7 r0 K' }. {- K4 [' Z; Y& i
  6. <script>
    % J9 X9 u5 v- Q( Z. a
  7. // 创建根实例
    & `# c! T$ A$ Y; u  |( Y
  8. new Vue({* f3 f4 C; R: O, {1 r# N
  9.   el: '#app',% |- E# z. K% y6 E
  10.   directives: {
    ( Q. F0 o0 \: f6 s2 V$ ]( ?
  11.     // 注册一个局部的自定义指令 v-focus( i5 s/ P0 q- \2 C& l* f3 x$ p
  12.     focus: {7 w" \' v% C( l, l4 Z7 w5 E, |9 y& t
  13.       // 指令的定义2 Y# ~9 n) U8 z8 f: b5 S) I$ U
  14.       inserted: function (el) {. R  R4 m* k# C
  15.         // 聚焦元素
    9 A& n6 X% q; N& ]' M
  16.         el.focus()
    5 C; u; S5 B+ k* u5 m, Y% Y& d
  17.       }
    , b' j& u& v, ]' U1 H" ^) K
  18.     }3 Y7 O. N+ H* K2 j
  19.   }# W6 l1 ^1 ^* K8 X, y  P0 J
  20. })% i+ m9 G* K4 z
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    6 [7 b" w7 B5 {' D6 V- g& R% i
钩子函数参数
钩子函数的参数有:
  • 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 }。. y# z) S, G7 \3 m
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    3 R: S# V2 z9 V( Z9 H+ W5 X% Y
以下实例演示了这些参数的使用:
实例
4 v' F6 r, P( J! |0 k' D5 ~- o4 r% r/ @8 M, T7 l/ ^
  1. <div id="app"  v-runoob:hello.a.b="message">/ e- c7 _9 Y1 b9 G) X4 Y
  2. </div>
    : x, w; _3 P1 E" m  `' W

  3. ( H1 c6 Y: Z2 N3 p
  4. <script>
    * m% r- e7 W$ F2 `: _6 Z
  5. Vue.directive('runoob', {- S3 d# _  y1 z  ?+ D) f% _' I- Z/ _
  6.   bind: function (el, binding, vnode) {
    & ^4 G0 u* y9 a& y7 f
  7.     var s = JSON.stringify/ J6 _; S$ L5 g8 u
  8.     el.innerHTML =
    2 v/ M  j! T0 b
  9.       'name: '       + s(binding.name) + '<br>' +
    % z/ T: a& p5 C: G3 P( ~
  10.       'value: '      + s(binding.value) + '<br>' +0 X% c! F8 k) g  m" T, s
  11.       'expression: ' + s(binding.expression) + '<br>' +/ ]2 E# y( M' w3 K
  12.       'argument: '   + s(binding.arg) + '<br>' +5 m: C5 v% p( N+ G
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +  V' m1 d8 R+ G: t
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')& K- {0 Y8 K" X4 S! f
  15.   }
    6 \3 |4 H& p7 t' U7 A: g$ x
  16. })+ v" S3 g4 t5 J3 S. k
  17. new Vue({% x9 I* j+ G" O+ J+ d/ a8 S8 }9 D
  18.   el: '#app',
      q! x9 z8 s2 a' k
  19.   data: {
    ! g  ]+ v% [) R' ]  B6 X% _) J! ^
  20.     message: '菜鸟教程!'/ Q" z- u4 G4 i: z
  21.   }3 e  ]: ?: m! E$ d0 X8 k% X/ J
  22. })
    3 ]/ |# u+ k  e* j2 R0 m4 N
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
( }3 Q* t& u% i2 ~% K. ?+ a. n
  1. Vue.directive('runoob', function (el, binding) {- v& H. Z2 ~8 Z  {
  2.   // 设置指令的背景颜色
    7 ?  e  p* r/ v
  3.   el.style.backgroundColor = binding.value.color0 S. Z6 O. J$ ^% s: m9 x
  4. })
复制代码
3 R, t4 U4 k9 B; i
  H7 X" W6 N4 @. A
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例& h3 ?* `4 T, s2 ?  y: S) D# u
9 y- E$ p/ q) Q$ c$ G# H
  1. <div id="app">  h7 t0 j# b! P0 D) V/ H
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>8 M! [! {  B! s0 U8 ^, F7 a! u
  3. </div>% v0 y5 O4 v' z9 m! a+ C

  4. 5 ~+ A; l$ ~% G4 s% ?( w" E
  5. <script>
    9 o$ P+ J  B7 l
  6. Vue.directive('runoob', function (el, binding) {% g$ g& ^$ C8 E; l" g, a
  7.     // 简写方式设置文本及背景颜色
    4 C: M5 ^3 h; K% r1 T
  8.     el.innerHTML = binding.value.text
    ! r/ C, A6 b+ V- j
  9.     el.style.backgroundColor = binding.value.color  u' I; }" T8 m) v; ]
  10. }): I& a! u& d1 q4 k2 J* k
  11. new Vue({
    / q$ N/ P6 L+ G6 H6 g
  12.   el: '#app'  `6 F- b& G# t0 C/ k0 K
  13. }); n; M0 G1 G0 r; @
  14. </script>
复制代码
: B- a! g4 W* w0 I! S
+ u+ `! p7 }% y; t9 ?' Q- }

/ a# Y, V6 J6 ?" B8 r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 10:49 , Processed in 0.126065 second(s), 19 queries .

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