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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

- v" U1 H7 n; R5 q% V* i! }# b
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例$ ~  C8 y# @& F
0 h8 Z0 E; f4 S+ i' g' |- F4 [
  1. <div id="app">
    % T+ O* J- q# @! ~7 A8 d9 C' U
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    9 C* s/ M, K5 m
  3.     <input v-focus>& x" `2 V. Y! t: j. Y
  4. </div>- f" K* `) q4 U: v8 y6 U

  5. 4 Y& k: L" H/ O5 j  s+ R' g7 K
  6. <script>
    ' M/ f" p! y" F! l& n" v4 |5 x$ ~. t; }
  7. // 注册一个全局自定义指令 v-focus1 ^. o; |0 H! O5 V" l# h
  8. Vue.directive('focus', {
    0 I3 @, `+ d5 s3 d9 [
  9.   // 当绑定元素插入到 DOM 中。
    ( R4 j! c! }% G5 m
  10.   inserted: function (el) {
    # {% l& p6 d1 f0 A& L0 @6 b8 k
  11.     // 聚焦元素
    % ]! s+ t" Q; Z
  12.     el.focus()
    & T5 D$ [4 u. Z9 G
  13.   }
    6 v& M9 i  V+ C/ ?- Z
  14. })
    : h) D, Y+ Y/ L: n3 c
  15. // 创建根实例3 l$ x1 t! T+ {- n+ t: ~
  16. new Vue({% j  @, j/ E' _( u) Y. X
  17.   el: '#app'  q: G. o+ k; x& e) _9 j" D$ c
  18. })$ ?6 L- d4 q8 B8 Z/ c$ [$ G& L
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例7 o, M6 \: w2 c3 D
7 V5 S- K% K: L+ d' Q' }
  1. <div id="app">
    0 b" P# Y, i8 k, @
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    / l- V; n3 u6 s7 b) }
  3.   <input v-focus>
    ; i) U2 r: ]. z, G8 y' u; i: ^
  4. </div>
    8 z2 s8 ?8 M7 `4 W+ h& H# H  K

  5. ; h/ ~4 h) a! z6 T; E
  6. <script>
    . N* n! T, j& f
  7. // 创建根实例4 M# _! K0 T6 Q4 z; ?3 ?% T+ A1 E; n) e
  8. new Vue({
    # F/ d0 ?4 k# T% K
  9.   el: '#app',
    + M+ k* z3 ?) E3 y. B/ M: U
  10.   directives: {  h! b9 k% M+ A
  11.     // 注册一个局部的自定义指令 v-focus6 a# d' J# U0 i1 w9 w5 H
  12.     focus: {
    0 g: i& x2 ]8 f2 ^
  13.       // 指令的定义8 K2 {, _9 u% q$ v! U2 Y
  14.       inserted: function (el) {
    5 w- T4 S$ f8 e( B
  15.         // 聚焦元素* n8 m: s7 ?9 Y9 z
  16.         el.focus()
    + k; R7 o4 B+ H, K/ I! Z, k: O
  17.       }
    0 L3 ?4 ^) e# |7 S
  18.     }1 u# x# t1 p& V0 Y
  19.   }
    . G6 X0 S) m: s$ }" ?1 b, o9 {2 o4 ?
  20. })8 j; C, J) N' W$ A; a
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    # h! W9 |/ t/ P* W3 M
钩子函数参数
钩子函数的参数有:
  • 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 }。5 ]' J, Z' p1 c) N
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    , H+ k* ?+ n/ j* Z5 Q, U5 m& @, n
以下实例演示了这些参数的使用:
实例, V1 Y! z- W$ J2 l$ A

$ d9 |+ V9 b: r! O- z0 q
  1. <div id="app"  v-runoob:hello.a.b="message">
    . Q) M1 \. {9 W
  2. </div>$ P  j% N# S. w7 F9 G1 z% w' ?+ v

  3.   Z/ K7 d5 h) f5 `3 o1 @* l
  4. <script>
    3 y9 j0 A( `# g9 d$ p
  5. Vue.directive('runoob', {
    - G2 u( r, U2 d" g! G
  6.   bind: function (el, binding, vnode) {
    & S! w1 i  B7 N1 i( P% q: G
  7.     var s = JSON.stringify+ q5 D$ T% j) G
  8.     el.innerHTML =8 W" a/ r& C) t5 }& a$ b) p$ S
  9.       'name: '       + s(binding.name) + '<br>' +( E* |3 Y/ j* {* `5 l( _# {
  10.       'value: '      + s(binding.value) + '<br>' +
    ! |) D" q- {. K8 M$ F5 l
  11.       'expression: ' + s(binding.expression) + '<br>' +
    , U5 U2 _: c' i; F% Z
  12.       'argument: '   + s(binding.arg) + '<br>' +) u: C  `$ k8 L
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    + r9 L+ `& O8 W. S; s+ h
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    ( D0 [) }+ p5 I, ~
  15.   }
    / Q7 u7 E3 n  T' v3 d/ H# n
  16. })
    8 _0 W! }6 z* [5 P; c3 m+ M6 ]
  17. new Vue({
    # `3 y8 G+ W6 X7 Q: R6 x- U4 @* a  C
  18.   el: '#app',9 ]( v0 v7 E0 D2 ~1 C# L
  19.   data: {
    # p+ ]6 v0 Z$ B) h
  20.     message: '菜鸟教程!'
    ( s$ M" a: M' k9 }3 m# _1 L
  21.   }. \1 V3 h; i% G
  22. })$ `# T& I4 z; |/ ?+ O4 p/ r
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:; P# j+ y" Q- u2 D9 K1 F
  1. Vue.directive('runoob', function (el, binding) {- j4 u  f6 C- z+ |" ^# `: e+ ~
  2.   // 设置指令的背景颜色6 k' V& J  Q! n' X, j
  3.   el.style.backgroundColor = binding.value.color$ O0 N( G; L6 X  W4 @0 {3 t% B' C
  4. })
复制代码
# w- o% y% @. p
2 U  `% V, O# B4 L  e0 _6 G
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例+ z6 }. N. r0 _5 V. q

  F4 n( n1 m* E
  1. <div id="app">
    ! ]! `4 j$ r) {1 a$ n
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    0 A+ k. n* W! a3 S1 Y
  3. </div>
    0 M' K  O+ n8 Z% ^6 \
  4. & ^/ z) N. d+ b
  5. <script>' z  ]2 J4 F* B' a" m; i
  6. Vue.directive('runoob', function (el, binding) {
    1 |7 t/ P' M/ w) B! M: b5 u
  7.     // 简写方式设置文本及背景颜色  p3 w1 @$ N! r  T0 _
  8.     el.innerHTML = binding.value.text+ G) _. ?) K. N2 H% d6 r0 E  e
  9.     el.style.backgroundColor = binding.value.color
    ) e! K  w8 W9 e, g
  10. })4 Q7 t, j7 ~, D& f
  11. new Vue({- o+ u" V: J! L( Q
  12.   el: '#app'- F2 c+ b  [1 l+ u5 V
  13. })
    $ s( v7 ?0 t- ]: K6 P% q
  14. </script>
复制代码

; D2 k# p! O8 z! r% L( i# J3 X% J
5 D) s3 E- ~' B9 o9 X- s) I; {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-22 04:12 , Processed in 0.052255 second(s), 19 queries .

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