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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

) Z0 T/ H) m* f# D) }) Y- u
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例: V4 c: O) Y3 m+ L

' i1 _1 A6 L; H  |
  1. <div id="app">* \" _  i1 y: e+ t1 i% G' P+ a2 K
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    ; ]9 a) n0 ?# t6 b* B4 g5 `. A
  3.     <input v-focus>0 i  `# O/ T2 i" u
  4. </div>& r. ~/ f+ D1 R; I! x; ?+ V, d* f

  5. 2 g* e, x  ?2 P! z  s
  6. <script>
    $ O5 U9 A2 i) B$ i: [
  7. // 注册一个全局自定义指令 v-focus6 _: x- o% m' i6 K& r6 G
  8. Vue.directive('focus', {
    1 N& t4 H( I0 D7 v. @- s
  9.   // 当绑定元素插入到 DOM 中。$ k+ Q5 A" K9 ?3 h* l: h6 F
  10.   inserted: function (el) {
    3 L% a) P* }7 `5 U  e
  11.     // 聚焦元素" r" k$ k6 t, ?4 F: @1 \  `
  12.     el.focus()
    ! u% b$ E' ]  X6 A
  13.   }
    4 ~4 J& ]& o6 c+ L
  14. })) W- m$ A- ?$ T! c
  15. // 创建根实例- H) b# N& h) [% c% T5 t: J
  16. new Vue({
    3 Q; Y! N. j( u% g) f0 m
  17.   el: '#app'3 {& b; x* ]! e+ B# z
  18. }): Z  ]8 s) B6 T) |$ w) _7 B
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例" X8 O7 L. _2 a1 u0 S# f

# q# [3 m7 E! X+ T1 Z
  1. <div id="app">
    7 j' A9 L& i# _
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    6 q9 D# |9 ^$ b) m
  3.   <input v-focus>
    : P' P- E1 e; n  c1 a( c. _- s
  4. </div>$ z9 C6 D) I  v9 ?% q2 E

  5. ' c0 I, P0 ?  |7 I" ~; g/ Q
  6. <script>
    6 e/ ?' f/ S. Y1 \- X2 V) t
  7. // 创建根实例
    * D5 g5 h, l8 }! z6 _1 e. K# G
  8. new Vue({
    , g1 y& [6 k- F8 ]& C5 g- g
  9.   el: '#app',
    0 V2 n3 Z4 c5 w
  10.   directives: {" d7 F4 k. d3 ]) a4 u+ r0 F0 s' Q
  11.     // 注册一个局部的自定义指令 v-focus: r. M5 `! U  N" |' p& P2 C
  12.     focus: {
    7 r8 z' n9 x6 Q8 Q9 n% t
  13.       // 指令的定义7 `1 Q/ |$ Z/ \: l  {, P: K
  14.       inserted: function (el) {
    - m, d1 X7 i9 A$ R: v# C
  15.         // 聚焦元素
    ! k) A4 s: _6 K
  16.         el.focus()1 ~2 t8 J% G! }! A5 s" i
  17.       }, t  [$ [  c* f! u- M- g4 d
  18.     }
    : r9 ^( c$ y2 A, I* a  K
  19.   }8 b% _% H2 Z3 N+ C' |9 r9 M
  20. })
    4 i* Z# \' J. x5 V) p9 Y. U. a
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    3 U$ N. ~0 \9 h# E2 O3 z
钩子函数参数
钩子函数的参数有:
  • 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 }。' _8 F, m) C7 l4 N+ \; X
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。) q# Q8 C6 \4 a! T, {
以下实例演示了这些参数的使用:
实例
& F/ |3 p0 }: N3 \
5 K) N* r  s- ?3 J" C
  1. <div id="app"  v-runoob:hello.a.b="message">
    " ?# F* l+ R9 B
  2. </div>% t+ K3 s3 N$ i" ?9 ^

  3. 4 y: k2 P+ |! T- k; a
  4. <script>
    7 j! _4 F& f9 _) p$ }% T
  5. Vue.directive('runoob', {
      p9 S' X* L! n' [% I. A% C8 h
  6.   bind: function (el, binding, vnode) {8 V1 a$ `$ n6 L
  7.     var s = JSON.stringify
    # w# j9 A$ }$ K* q% z7 b
  8.     el.innerHTML =
    3 C% ~. v  F7 R' S
  9.       'name: '       + s(binding.name) + '<br>' +& v% K: o* Q# @7 `6 t
  10.       'value: '      + s(binding.value) + '<br>' +
    / J% t- Q& X4 ~: |4 M5 B: n
  11.       'expression: ' + s(binding.expression) + '<br>' +
    & O) `6 y% ?6 Z% i/ B
  12.       'argument: '   + s(binding.arg) + '<br>' +& m/ e0 w: l; u5 z
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +1 _- j3 h0 F+ [/ `
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    / t0 t9 _2 k) s
  15.   }6 T$ _' z2 H' u, V
  16. })2 Y' K) _# R# ?) p' d  C9 W/ ~
  17. new Vue({
    7 D5 [" t' u4 G( V7 o# m' C
  18.   el: '#app',
    1 W" ]4 X  _5 f
  19.   data: {
    . I, _4 f$ s% [
  20.     message: '菜鸟教程!'
    ! ~/ A) d% @6 o9 v
  21.   }5 W  W; O6 o9 F% M7 |( A& Y+ X$ u
  22. })5 D2 Y, p, c* m0 j
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
6 R5 t2 {+ ?& B* o9 b* Y
  1. Vue.directive('runoob', function (el, binding) {0 d% P/ r9 X1 y6 k
  2.   // 设置指令的背景颜色" Q% a) w4 g, x! P0 C; G
  3.   el.style.backgroundColor = binding.value.color9 N) D9 E* V- l; d3 a1 I+ b
  4. })
复制代码
/ S/ X0 ?& w' B) c& D1 _

! Y( x8 S( `7 H' K. C1 N7 ]9 R
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例% B" ~/ [2 h% M# c0 s. m4 _0 y

/ @0 v6 n. H5 a8 J, C( _6 w7 L5 u
  1. <div id="app">
    - G2 d3 ^" r0 f( R! n% p' k
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>) y, z3 Q$ I" B
  3. </div>
    % L" [9 S; k# o0 f1 T

  4. ! {/ u5 e9 k# P& U# g+ `6 `
  5. <script>
    + I/ I+ S) j& k& F/ h. d
  6. Vue.directive('runoob', function (el, binding) {) G; v3 }1 X$ e# S3 N; M
  7.     // 简写方式设置文本及背景颜色* q' X6 x. q+ i9 A) e2 q. Y/ ?# M
  8.     el.innerHTML = binding.value.text
    , |/ c! S! w  F$ s; [7 }
  9.     el.style.backgroundColor = binding.value.color2 G4 T5 m9 ?% _2 X( w+ J
  10. })5 j; T0 ?3 ?) ?3 N
  11. new Vue({
    , M5 y, J3 [$ b# N
  12.   el: '#app'/ s5 w: S& ]/ F, K
  13. })8 ^8 x. a% A& `
  14. </script>
复制代码
% o: J3 z4 r2 K
4 o( _# x- k" S: G
( v: i- T7 k, f$ t) n2 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-11-1 11:40 , Processed in 0.123209 second(s), 22 queries .

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