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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
9 _5 D  I. H4 {# o
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
* S9 j" r6 F+ n
& o$ G: B, a& E1 m& d9 h
  1. <div id="app">
    + D" M* [8 E4 g% i7 P7 S
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    4 G3 k; p+ {* \/ [
  3.     <input v-focus>
    1 V! d; h# ^* D: F- l
  4. </div>
    ' x! J7 d7 H, o5 s" M& B. ?2 P  B9 i2 p
  5.   p; B( p3 x, ?2 v& |
  6. <script>
    $ G* z( w, ~7 a8 C" t/ k
  7. // 注册一个全局自定义指令 v-focus
    9 N# f, u6 [9 t- i0 ?. d
  8. Vue.directive('focus', {
    # Z4 v2 f) \4 V5 G) c
  9.   // 当绑定元素插入到 DOM 中。1 Y( y- D" z" L& E2 ]& I5 A7 e
  10.   inserted: function (el) {
    % w# g6 v: D+ v4 a) g$ Q1 X  L  Y, U9 c
  11.     // 聚焦元素
    : T9 M  Z% a5 n4 G, _
  12.     el.focus()
    ) ~8 J' U7 [& a) {5 C
  13.   }7 F# z& n$ @: Q% e9 v
  14. })
    2 E: j8 h4 @" D: i. C1 L
  15. // 创建根实例
    - m3 b4 e& U8 i3 M8 ?
  16. new Vue({
    $ u: J9 d; e, I1 e
  17.   el: '#app'
    # {8 Q2 |0 C9 L1 h
  18. })2 K8 ?" z; \: H# ^
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例0 f* Z- b0 z; |% x, ]4 @7 S4 [
5 M: H3 k/ z5 o  z! Y
  1. <div id="app">! c# b( M2 }4 @) u
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    - x8 k1 a- m+ [2 @% D$ ^1 W
  3.   <input v-focus>. Z/ }# r# L, c3 p- d1 r+ R6 l) b
  4. </div>
    % S; J" r  W5 w- m- a

  5. ) {. N" A/ [! Q$ m4 h1 c
  6. <script>) j* K7 ^8 d$ P! c# t; p9 I/ F
  7. // 创建根实例& q1 c8 c- b0 {, Y0 p; d! @7 S  I
  8. new Vue({
    2 @# g# r5 M2 S9 V; C1 L
  9.   el: '#app',( {/ S( s' W( x
  10.   directives: {
    , [0 L1 Z3 y9 N# ^  J
  11.     // 注册一个局部的自定义指令 v-focus. {' D) H/ S7 H& T( c
  12.     focus: {
    . M2 T- a" R, O1 j9 y: G
  13.       // 指令的定义) h3 g; a, l9 u. c
  14.       inserted: function (el) {) G& R2 L6 ?; }+ l2 i, R9 h
  15.         // 聚焦元素
    0 V% k! z( I) c$ M
  16.         el.focus()
    1 E" b* Y3 K( A9 \4 `4 S) Z5 F$ U
  17.       }$ r5 d6 q3 w7 s0 u
  18.     }
    4 i$ \- L) n( m- P  j7 Q8 b
  19.   }
    ; J2 g! a$ P' }9 x/ s8 ?4 C
  20. })6 k$ r, _3 H* |# P. g7 L
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    - ?0 c. A- W2 Q+ I% Z/ b  U
钩子函数参数
钩子函数的参数有:
  • 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 }。% s% u/ u& U; j& n2 |7 I  Z
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。2 ^6 S/ d. y$ t. y
以下实例演示了这些参数的使用:
实例4 M. Q1 z0 [) ]4 N/ j8 ~7 M" [

9 P  C' G! ^' Z3 r+ W. z* |
  1. <div id="app"  v-runoob:hello.a.b="message">) ]1 S9 k" O5 f7 a% E
  2. </div>
    : Q" `: s& Z2 Z0 t- s/ L5 a+ o2 Y
  3. ' u# ]1 p  X( D
  4. <script>
    9 R0 @  F9 @/ N' B# \
  5. Vue.directive('runoob', {6 U- a! K/ G# m: ]. u- I, D+ P: z
  6.   bind: function (el, binding, vnode) {6 P  V0 N- `8 ]+ @- y& [- C
  7.     var s = JSON.stringify
    + [( ]" @9 i1 @: Y, T# T3 p
  8.     el.innerHTML =
    ( h$ J; b( B4 f* H- F9 A
  9.       'name: '       + s(binding.name) + '<br>' +- Z/ [- V8 e  Y( z1 I: D" A9 n& E
  10.       'value: '      + s(binding.value) + '<br>' +
    . m* b9 `; U) D- l: L% U3 y, _
  11.       'expression: ' + s(binding.expression) + '<br>' +7 v) B; V( d4 \  Q1 A, ~1 G. W
  12.       'argument: '   + s(binding.arg) + '<br>' +
    4 N0 E0 d, U/ [& d3 N: v
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    9 `- ^& m8 J/ O4 A2 G) R
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    5 i9 f4 D, I' N. n. s% n: s. z
  15.   }
    8 r6 P# w3 x8 j# j6 a
  16. })3 S$ w& A& }) K. P, n$ s. q
  17. new Vue({
    & W, J4 o" s2 K6 i/ V
  18.   el: '#app',
    $ A' m9 {# h: _* a3 P" B
  19.   data: {- r; s4 _" U* g$ T, ?
  20.     message: '菜鸟教程!'
    & {( t5 Q# }9 ]6 S" P1 s
  21.   }! x5 x) }5 F0 w' V6 Y
  22. })
    3 m  a8 r6 H& I0 S
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:: M. [* f: T# l" q* R
  1. Vue.directive('runoob', function (el, binding) {
    , [) N, |0 P. |* \5 k9 Z$ F
  2.   // 设置指令的背景颜色
    # c0 x* }0 _8 u) h5 S
  3.   el.style.backgroundColor = binding.value.color
    : C6 L% D9 A0 o- E6 ]
  4. })
复制代码
$ ]! K1 K1 b3 f5 b' i
9 ?+ K8 {2 b% R  ]  a
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
5 o' I# p2 P9 O+ N- O
* @( _* T4 @& \0 l
  1. <div id="app">' P8 o' o; Z- M( a6 p/ W
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>+ y! ?; Z5 y. y% P' m4 x5 T( I! L
  3. </div>- r" P7 }( E# w+ h2 K+ t7 ]0 \
  4. . c0 m: N4 Z( Z' D+ g/ A/ D
  5. <script>5 }+ ~: s1 Q6 b% q  @9 C. L5 f
  6. Vue.directive('runoob', function (el, binding) {
    , F( |# z' D4 W3 h& p. f* {
  7.     // 简写方式设置文本及背景颜色  {; d$ p7 z/ d* ?0 [
  8.     el.innerHTML = binding.value.text+ g9 ]8 |. ~+ Y3 h
  9.     el.style.backgroundColor = binding.value.color6 ]8 ~1 g! L, i4 {" a/ z
  10. })
    ) k! g2 Z/ J# l6 w! L4 ]% p' G: D* V
  11. new Vue({
    4 q" V) R' A; q6 w) o" C; L7 l
  12.   el: '#app'
    ; ]' X+ ^$ ^! c# x7 F1 W
  13. })
    % }1 _. E; @" t
  14. </script>
复制代码
/ q! I& \  f- r3 O5 [) |( l

- G, E5 X4 l1 W! m3 g% K) v
( I* Q# w% I/ C7 _1 C2 W0 X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 22:05 , Processed in 0.050628 second(s), 20 queries .

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