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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

! T+ r* W& a5 T0 p* H$ \
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
# O* P! e4 P7 ?. E& L. D6 ?
  A' J% t" k8 c
  1. <div id="app">
    % f$ S3 }" K( W, o
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
      c) {2 a6 |( |2 }7 {, t
  3.     <input v-focus>5 [1 ?# x/ v( w; S! v$ }
  4. </div>$ O% z1 R2 ~' D: s
  5. / a& E' X( _) s
  6. <script>& N- d9 ^2 u# _. p
  7. // 注册一个全局自定义指令 v-focus
    3 O! {  D2 a  S, J/ N- U2 y
  8. Vue.directive('focus', {
    . t0 b! ?3 @: Z7 H9 u8 y* Z" b, G
  9.   // 当绑定元素插入到 DOM 中。
    - o' e, ?9 q# n; m. d
  10.   inserted: function (el) {' V4 \# P2 b$ V3 h" S- k
  11.     // 聚焦元素
    ; f( Z9 ^  B" a) f
  12.     el.focus()& D0 G/ N3 j% m
  13.   }
    , K$ Z( Z' m5 z  T" T2 h1 m8 X
  14. }), ~" h. c- B" N" p1 V3 ]
  15. // 创建根实例; s6 \- p& \0 [# y
  16. new Vue({+ Y3 A! T) S$ O& V" U# E
  17.   el: '#app'9 l, D6 B5 }+ ^$ @" a5 {, ]2 r# s$ w
  18. })
    / V. w- b. P; r) o0 j
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
5 w# n9 E. |& e, g' |" q  H7 K# d1 U( U! i
  1. <div id="app">
    9 T  p/ Y% p, Z' m$ y% J  M$ a
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    0 O( J  q# y# J7 P* S' Z
  3.   <input v-focus>9 F" n  z0 Y9 y( T8 M( b1 w& {
  4. </div>
    3 g$ c: \, P* {  Q+ `
  5. & t* G* u8 F1 ^6 Q* Z3 S
  6. <script>
    ( k6 `5 h6 \! P5 ?4 p4 t( E' M  s
  7. // 创建根实例
    ; I3 n* [. k. W* W- J# f( g- A
  8. new Vue({
    / K6 J) d" N$ w4 V1 T; s
  9.   el: '#app',2 A. b  `! w& X% U
  10.   directives: {
    0 }& I/ P) b; _4 i+ t; V
  11.     // 注册一个局部的自定义指令 v-focus
    % l% e% g7 Q! Y' M
  12.     focus: {( x' v3 T1 [% q' J3 b) ]. R+ h
  13.       // 指令的定义
    / _& ]! J: w8 g. {2 M
  14.       inserted: function (el) {
    ; H* V$ x0 S1 O  B. t3 |
  15.         // 聚焦元素
    * k8 v8 D' R: v) `8 k
  16.         el.focus()# z2 R1 \( M9 b6 ]3 Y' @
  17.       }% H  W3 F7 _8 Q/ v. j  G$ E
  18.     }
    4 a$ Q2 r3 S) s4 v0 m/ d
  19.   }
    ! I- F* L: v( P0 i6 S: g  E
  20. })
    ) L- Q+ F/ a/ H6 X9 |% l
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    $ u: z* a1 ~! G5 V7 d: Q  @
钩子函数参数
钩子函数的参数有:
  • 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 }。* K; f9 E' Y! t5 r; r( P* y
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。' F8 }  W& H4 g1 X8 N
以下实例演示了这些参数的使用:
实例: D& d" K( k6 B9 ], \! _

  _2 p$ Y# g4 ^2 I1 T% N( F# \
  1. <div id="app"  v-runoob:hello.a.b="message"># r- @+ S! J: ^0 E' u
  2. </div>8 L7 F5 h- b2 T
  3. 8 z% R6 l( a! h) @" S5 \+ G: R
  4. <script>
    2 _& D) Q4 J4 D; x  G
  5. Vue.directive('runoob', {  S* {6 D! F  m( l$ R& O
  6.   bind: function (el, binding, vnode) {( r: R2 h4 {% \  P: S! j
  7.     var s = JSON.stringify
    7 u6 P& M+ s+ _: K$ X3 G. T
  8.     el.innerHTML =) u/ s( Z5 |1 S6 w/ Z$ \0 O! }0 X! g
  9.       'name: '       + s(binding.name) + '<br>' +8 ]# }" \; q, v& k
  10.       'value: '      + s(binding.value) + '<br>' +! T& B$ [. U& V
  11.       'expression: ' + s(binding.expression) + '<br>' +/ [( R* g% B+ V4 R, u* j
  12.       'argument: '   + s(binding.arg) + '<br>' +
    / I$ |' M0 N) Q1 p3 ]
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    ) B1 V$ M$ F8 U" @$ Y* W* c, i- U: Y  T
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    . e- B+ ~0 P. R% E
  15.   }
    % l' q- T, Q$ p# Z, r$ Y
  16. })
    5 m- r" Q5 @  g8 w: @/ J# e# L
  17. new Vue({
    + g9 U! ~" V- A
  18.   el: '#app',3 n# S1 p. [4 Y) M
  19.   data: {
    % c  y" P8 |5 Z; {
  20.     message: '菜鸟教程!'5 G; E) K! S# |; M1 V
  21.   }
    / B5 w* j$ B" ~8 B2 |6 _1 E3 ]- F
  22. })
    # |3 J; P# @. ~9 e: B# @3 M
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
8 X9 F' y+ {9 N, b% P
  1. Vue.directive('runoob', function (el, binding) {& h9 y% e* T6 c: r& X! o
  2.   // 设置指令的背景颜色2 U4 q  A/ e: v0 {. Q8 e. q, r
  3.   el.style.backgroundColor = binding.value.color
    2 i! v) l0 c0 D
  4. })
复制代码

! w" v+ @7 h/ G) F5 o+ `- r2 `; L: l2 o8 W
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例& l8 T! n6 P: d& y0 Y- B

8 t% C* h, i, w0 B- r8 \$ I
  1. <div id="app">
    / D: x+ e  a  H6 @
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    , _, W# K" c$ i3 k& s2 ^  G) m
  3. </div>
    % Z% }) l& \/ _; u0 l9 Q
  4. 0 a; ]  g2 A# @& C% M
  5. <script>4 d# v& C: l4 v# s0 o, Z& c% y
  6. Vue.directive('runoob', function (el, binding) {
    # M7 h- {; S9 g; l! K& C; j5 C
  7.     // 简写方式设置文本及背景颜色
    - q& R* C" c1 a; c" c' Q8 A
  8.     el.innerHTML = binding.value.text/ c! i3 C! f  J& |9 |' e
  9.     el.style.backgroundColor = binding.value.color/ X. k; v; ~" c  h; i9 v7 m
  10. })
    4 M; Z* O5 L* t: O# s; p; y
  11. new Vue({
    % \6 ~" ~, p/ N  x) j
  12.   el: '#app'
    / w4 n0 z# Q, {  a
  13. })
      J& p: X! [6 _9 J& y. k
  14. </script>
复制代码
4 j9 {& b, Z% m2 u) |* m9 C( e; N

) z2 G0 J& P: _' H" z5 J6 L0 O) @5 \) \, G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-6-18 21:04 , Processed in 0.122736 second(s), 20 queries .

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