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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2 I- ^7 T  R% u- ^9 F& v4 g
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
& o: ?/ F2 t: P' {& D0 A4 U* c0 q, Q8 D
  1. <div id="app">
    ( p9 R) y5 e9 P. K
  2.     <p>页面载入时,input 元素自动获取焦点:</p>. u  B; H2 a* ]/ l! R0 g) w
  3.     <input v-focus>; y. i$ [- T. X' _
  4. </div>. {+ M' ^& U, H  n8 T+ \
  5. 3 q4 e2 t/ |1 B% [
  6. <script>
    , L' c: ]6 x' O4 c3 f0 T% _: q/ Y
  7. // 注册一个全局自定义指令 v-focus: x9 {  s* K8 ~0 q) g
  8. Vue.directive('focus', {
    5 G. O) R6 n" U! [9 s; R: `
  9.   // 当绑定元素插入到 DOM 中。
    1 b/ U5 n8 E# J1 r, O$ h) s
  10.   inserted: function (el) {
    % J7 ]7 ~) @, b/ r% v+ T, A' n
  11.     // 聚焦元素4 M6 f5 a. ^& A
  12.     el.focus()
    / m- f3 u4 u2 c( H: g% M) t. y7 y
  13.   }( W6 [: A3 V0 Q& G2 E9 J% `6 M
  14. })
    4 o& t0 k1 n+ Y- p5 y2 U% {
  15. // 创建根实例
    / X7 F  ?6 K0 }! Y' c1 }- i* F" h
  16. new Vue({0 L& X6 M8 t: w( o* L% G
  17.   el: '#app'
    1 g1 N+ v2 h; Q, h4 ]: J, s, s
  18. })$ A& \6 B9 j, `/ U
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
! G- P4 c3 Z9 b5 H# W2 @' z* k. l2 ]* J. r& N. ?
  1. <div id="app">
    " O5 z& P! ~8 z: Q6 v0 Z
  2.   <p>页面载入时,input 元素自动获取焦点:</p>8 I& h" u+ a. g, u( B' I/ m
  3.   <input v-focus>1 X* X( C9 c$ P8 c7 C* S7 M
  4. </div>1 W) |9 |! t/ c1 o- [" p) y
  5.   w6 a! `6 @. p6 R/ \# x6 G
  6. <script>
    $ g) k: D& o$ n
  7. // 创建根实例" |. W& N& Q8 x! d
  8. new Vue({
    + ^" _4 M, ]1 W3 M$ H6 ]/ {
  9.   el: '#app',
    9 }- x% E# n- p& H0 b
  10.   directives: {' V9 f, I( m1 }  m$ e/ b
  11.     // 注册一个局部的自定义指令 v-focus- I. x' }5 u; K$ G* a  Z. m2 S
  12.     focus: {
    . C. I# U/ @% h- r
  13.       // 指令的定义3 h6 K: c/ k% `* ?3 C9 E' F
  14.       inserted: function (el) {0 W* ]* n# q6 v( N8 j' ]6 Y
  15.         // 聚焦元素( v1 E9 I8 {5 w0 m" a
  16.         el.focus()
    - q* a1 g% u6 u# g0 o# j
  17.       }4 P6 K4 f, K; @
  18.     }1 o8 W$ N; F+ \# y# j; S
  19.   }
    # q; `% R& L! k- U3 e; S2 V
  20. }); _9 ^7 j7 ~" d; y3 g
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    + g+ H* b( d3 Q; L' {7 e
钩子函数参数
钩子函数的参数有:
  • 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 }。
      * L+ H" S9 z" [0 i' ^
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    " r. ^9 l3 N6 G# R" [  U0 Z
以下实例演示了这些参数的使用:
实例
# }" ^) i4 n5 b' ~( j6 S0 x) w6 ^0 z5 F5 \$ u  b+ A& N
  1. <div id="app"  v-runoob:hello.a.b="message">5 h* G" ]& ]& P) O6 O+ m: v
  2. </div>: A3 H; `& B- C! V' b
  3. # n+ A% h3 Z2 Y, ^3 m5 \( R
  4. <script>
    + t4 c$ |' ~: V' T/ s7 s# D7 w
  5. Vue.directive('runoob', {+ B/ `- L5 {+ j: c1 N7 a( J
  6.   bind: function (el, binding, vnode) {- s0 r1 p4 g, t5 x& z; K8 Q( w7 E
  7.     var s = JSON.stringify
    & e. W: N" S& E+ ?, k
  8.     el.innerHTML =
      }/ ^& p4 L2 x4 Q1 o  I
  9.       'name: '       + s(binding.name) + '<br>' +& ]) B; H7 f& N: I6 r1 X9 d
  10.       'value: '      + s(binding.value) + '<br>' +
    + {' ?4 `/ q* F" F9 I9 a. M" A
  11.       'expression: ' + s(binding.expression) + '<br>' +2 y5 V2 i7 k! m* u
  12.       'argument: '   + s(binding.arg) + '<br>' +8 q* L% }& ^' ~+ [6 V
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' ++ h5 u) g' [8 Z+ B9 M
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')) o9 i) E& y' x( j! d& F5 X- E8 w
  15.   }% Z/ X3 U: F% y5 k, W
  16. })& S8 [7 b5 c/ x; F5 s! Z! _" A
  17. new Vue({
    - c. z8 ?+ H, n# S. h3 [8 e- E1 |
  18.   el: '#app',
    - K8 N/ g3 G% T- i6 C6 c6 p
  19.   data: {
    6 W7 x* c5 B5 C& ?0 ?" |1 C1 p
  20.     message: '菜鸟教程!'9 I3 l& a9 W0 ?& O% S* Q
  21.   }, M3 P* V! y. w( V+ n
  22. })) X0 H* S* B9 i4 [
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
- v+ k9 b! X( Z: t
  1. Vue.directive('runoob', function (el, binding) {
    7 k2 ?1 _) i% a5 U8 S7 G9 p
  2.   // 设置指令的背景颜色
    , [6 n% Z5 X: M: f$ Z! }
  3.   el.style.backgroundColor = binding.value.color! N  p4 T) d9 [( @
  4. })
复制代码
) ]; I7 x$ @$ n9 ^- b1 f

* B0 N  l! w) \- o3 U+ ?
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例$ ]' V" N" g4 a6 m; Y  g

* [2 ~/ [9 `7 Q- j0 t: n. a6 L
  1. <div id="app">
    # H4 h' f* }' X* a3 A/ f( f
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>. V, B! a% Z* j5 i, |
  3. </div>
    . W( F# s0 O4 C2 F/ j; ]
  4. 5 P+ U2 L4 \: o& `" O9 U! [! N
  5. <script>8 |3 u( @3 G0 Q* d  X/ t) H3 G
  6. Vue.directive('runoob', function (el, binding) {
    8 d  H% v3 P: @6 c
  7.     // 简写方式设置文本及背景颜色% d0 Z+ L0 O0 `$ R
  8.     el.innerHTML = binding.value.text- V+ h0 U# p9 n. h
  9.     el.style.backgroundColor = binding.value.color4 @4 w9 G$ l& b% D
  10. })
    ! o6 p( J% L1 B- P* J
  11. new Vue({
    9 i5 k# I- z! O, ^4 e% B8 Y
  12.   el: '#app'( i& q4 W) [2 S7 W
  13. })
    5 @: p5 e% q7 O" a
  14. </script>
复制代码
2 K4 b& q4 Y' L1 |; Y
7 o) x. h: a; B1 h% ^

5 Z1 J7 u, v7 \0 o" N  ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 17:23 , Processed in 0.049029 second(s), 19 queries .

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