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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
: m* i) B# D$ X& b% ?8 x
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
/ V4 ?8 x: s) p& f& w# R. |# j6 E- F2 `# R5 f' y
  1. <div id="app">( l& u# @7 S$ E1 S4 l$ k! V
  2.     <p>页面载入时,input 元素自动获取焦点:</p>; Q+ [1 g# j6 T/ z- I  g3 T
  3.     <input v-focus>- R# p- c" x4 `1 m# @7 }
  4. </div>
      W' X4 D& u/ \1 t
  5. 9 K- A: n" w% n
  6. <script>* b7 a/ g* a6 ?4 c% p
  7. // 注册一个全局自定义指令 v-focus+ V( }2 b5 H. F& V9 J+ A
  8. Vue.directive('focus', {/ O9 t& ?( K1 L* Q# G2 |( b9 [
  9.   // 当绑定元素插入到 DOM 中。6 y) {# J# h1 ]) `8 K
  10.   inserted: function (el) {
    , N2 L7 x# I& G
  11.     // 聚焦元素
    ; `: O  `# t/ q7 g' k8 z# |
  12.     el.focus()9 _7 [; m  h7 U0 s
  13.   }* {  C* }2 s8 O- U7 Q" P  f
  14. })+ A* S( |9 M, Y
  15. // 创建根实例
    7 P/ I1 `7 H- L- t: o* {8 W4 ^- R
  16. new Vue({8 A! u6 F! J& @6 z9 R
  17.   el: '#app'
    ) V" q  [: D# v+ H! L& z
  18. })5 B  q  a9 @" Q: ?+ C8 }9 f
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例& b; ^9 |; l& P( A3 w
/ D9 A! b1 R/ v5 }7 M$ \$ s
  1. <div id="app">2 }! W" N* M% n( i8 I3 u
  2.   <p>页面载入时,input 元素自动获取焦点:</p>6 [# {/ U- h% C+ q* [
  3.   <input v-focus>
    , v' P# I: U0 [
  4. </div>. D, ?( I$ Z7 j/ x

  5. " w) u% ?% s( `; V3 Q1 Y/ D
  6. <script>2 k7 m# r4 T8 C# R3 O
  7. // 创建根实例* h* X; x9 H) E7 Z; @/ i+ s
  8. new Vue({7 Z8 r  ?! A4 t8 v. u
  9.   el: '#app',
    8 d5 w' v3 x5 p: |# F
  10.   directives: {0 `2 {4 @: O- Z2 b* N  h: R5 _6 C
  11.     // 注册一个局部的自定义指令 v-focus9 Z2 `% j0 X# u
  12.     focus: {% A/ H- P; r/ y9 g
  13.       // 指令的定义, f" n; s8 D2 {; T* f. D
  14.       inserted: function (el) {: r: j# q- `2 F! x1 M
  15.         // 聚焦元素% A* c% X1 x, J$ s1 P: v9 x
  16.         el.focus()
    / @9 u9 X4 m$ X4 R/ v
  17.       }7 ?# w' T, f9 y3 W0 b
  18.     }0 K$ r7 e: p! {& }4 A* O* u+ X
  19.   }; q: F, v9 e( ?2 |
  20. }): _# L( g) \6 x* J, o; {# v! w2 x
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
    ( L6 z! ?: M0 n# f& K! A; S" j8 T2 B
钩子函数参数
钩子函数的参数有:
  • 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 }。& G- I- e1 j  S! T
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    ; Z6 R6 M# x  A* B& @, w
以下实例演示了这些参数的使用:
实例
% ~  Z# a$ l9 t7 a
6 e9 c9 U, f8 W0 D6 f! q
  1. <div id="app"  v-runoob:hello.a.b="message">2 m! v  `, D- o. H: d9 a
  2. </div>
    - i1 `6 k, ~4 G1 v. Y$ Z9 Q8 Z: Z

  3.   P6 A4 \1 B: w' t3 b3 L# V/ E3 Z
  4. <script>
    % _4 O9 V/ l8 c0 e/ z
  5. Vue.directive('runoob', {
    . k$ F. K3 e- ?. W  F6 Z
  6.   bind: function (el, binding, vnode) {' S6 v8 T1 a. k9 R4 \/ t
  7.     var s = JSON.stringify6 I. a: Y8 o' z/ j
  8.     el.innerHTML =
    . a, i4 u( u0 c
  9.       'name: '       + s(binding.name) + '<br>' +
    % b, c. \# v9 L* g- {8 g
  10.       'value: '      + s(binding.value) + '<br>' +$ J) C* Z! B6 m. N+ r  D
  11.       'expression: ' + s(binding.expression) + '<br>' +
    ! @4 E# Q! E) m
  12.       'argument: '   + s(binding.arg) + '<br>' +, @% n9 E7 B. U7 j- F! C. y& s
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    * E  n1 U5 L$ J% E
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')$ E- f  _  w" m! z
  15.   }
    % o9 c7 }( K5 v0 _
  16. })  m. J: V8 S& B% Z/ `/ K
  17. new Vue({0 F/ D& Z9 F/ |( A
  18.   el: '#app',
    : t% |! Y8 O/ w" |
  19.   data: {
    0 k% B5 o4 I! `7 {6 I% a
  20.     message: '菜鸟教程!'" Z7 T2 [+ k  G+ l+ |" V% a
  21.   }$ ?! S: e/ Y* T& [9 b: P
  22. })5 v- h. @) ?1 A6 |" r. w+ F! s, W
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:; u0 Q2 F! j9 u
  1. Vue.directive('runoob', function (el, binding) {
    5 w' ]% F5 M6 S1 O9 J
  2.   // 设置指令的背景颜色7 X, _6 G" H# }; W/ Q1 c
  3.   el.style.backgroundColor = binding.value.color$ w4 c5 q* E; ]
  4. })
复制代码
8 ~* g" `9 g% V" o! M* [+ K
/ O1 ?# Z* H# G4 R2 E+ u7 q) s
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例2 `8 Y+ A5 {, v) r& s/ I

8 b0 k  u0 H4 t) `; A/ u) C
  1. <div id="app">
    2 ~" C+ i6 _% }1 R
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    4 G2 P' ^& [1 S; x" T3 }
  3. </div>  t1 ^" l6 d, k
  4. 8 ]$ a* `9 ^/ c4 X
  5. <script>0 r! q  A8 d8 c. t
  6. Vue.directive('runoob', function (el, binding) {6 ?- f) u& M: a8 m
  7.     // 简写方式设置文本及背景颜色8 z2 g# d& \. W+ g9 f
  8.     el.innerHTML = binding.value.text
    % |8 J2 ~- G8 `9 @
  9.     el.style.backgroundColor = binding.value.color
    + _, H. q0 B( o, E
  10. }). ~% ]% b. n  {$ O; h0 c6 p- G' ?
  11. new Vue({
      X5 H5 D& \9 K2 ^7 Q# a
  12.   el: '#app'
      U0 S6 l4 m3 V- n+ P+ ^* H6 D
  13. })
    . p" B2 G$ ~* P2 S" h
  14. </script>
复制代码

. ~! h3 C- |3 c/ e& G' T2 p# U, |/ b4 K1 c- c; ?2 n
) |; f" G/ d, A+ F" x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-11-1 13:24 , Processed in 0.122390 second(s), 21 queries .

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