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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
% g7 t$ B( W+ b; h4 S. c
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例+ i4 k2 l( Q+ p! \2 G

- x6 P" e( }0 W6 ]- O
  1. <div id="app">
    5 }' U' ?; ^* O
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    2 H9 F# C, E, U9 {
  3.     <input v-focus>
    % |6 u6 z! Z$ p
  4. </div>
    & C! Q. K1 c4 O, A' v+ S0 ^" {

  5. 6 r' ]+ V. _. v, m" {) M' A. g  [
  6. <script>$ f7 D' y: V" P$ ^: d1 U; |! e
  7. // 注册一个全局自定义指令 v-focus( F0 r* @$ j7 f
  8. Vue.directive('focus', {* i! M+ e0 x: C( g4 y
  9.   // 当绑定元素插入到 DOM 中。
      ]) n5 i) Z) l$ x" b3 S
  10.   inserted: function (el) {5 W- C' z. k3 n6 q. d( P, {9 t; u
  11.     // 聚焦元素& B; e9 {. B$ T/ v2 ^
  12.     el.focus()
    5 f) o; e0 ^; H6 k. a# ]
  13.   }
    7 u. H& _4 q! C7 P: S4 }
  14. }), `( i7 x8 z8 N/ ?0 D* L
  15. // 创建根实例# A8 K! W$ p$ }3 w4 I; u8 K  u
  16. new Vue({
    ' \; z! f. d; g7 c- a5 \7 J& B' ^
  17.   el: '#app'( a  `! c0 P. z: @7 ?) i. @9 h
  18. })' \8 X4 z; W# N/ F1 I
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例
$ j. @, j6 j7 @$ b3 G
# |: b6 ?( q+ k/ G# U, G( i
  1. <div id="app">
    - a' [# Y7 s  @+ P
  2.   <p>页面载入时,input 元素自动获取焦点:</p>3 P# J0 b% M: h
  3.   <input v-focus>
    5 h: t' P- F0 u: y
  4. </div>* y+ C& E0 |! B1 x

  5. 5 n  t2 i4 P" s! O( j$ Z- O
  6. <script>
    4 ]( m$ l7 K% e/ A* C& H
  7. // 创建根实例
    ( T( z1 Y- Z1 j% I
  8. new Vue({
    2 Z0 F3 w6 \- I. Q/ Z  |
  9.   el: '#app',* W; r6 V5 b7 |& k( U7 ~
  10.   directives: {( ~1 }$ z' w* j
  11.     // 注册一个局部的自定义指令 v-focus
    ( _' s% g8 A" I- C1 N3 R+ Z
  12.     focus: {
    8 ^" D8 _9 T$ C5 U# {
  13.       // 指令的定义2 D) ^. l* g2 K  H0 n- D
  14.       inserted: function (el) {
      P( A; F# m# e0 D3 T
  15.         // 聚焦元素
    0 W$ c9 C& K2 E9 U/ T  d! `: T
  16.         el.focus()
    5 b. j' B) a; Q/ S3 \' g& _- }
  17.       }3 Q8 x1 Q7 V  P
  18.     }0 b* a( G/ V+ Z3 V9 X5 \
  19.   }
    2 j3 R! k' p  l& A% I3 k" M& f
  20. })
    3 v  E( ^$ \" Y9 v  H$ r4 g
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

    % \; b! u- w$ ?9 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 }。7 u$ b5 {6 j3 y
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    : v/ {4 M; {) w+ z9 R" n
以下实例演示了这些参数的使用:
实例
' W  ^8 [6 g/ n! S; w
* h: B: v5 F; O6 ~6 ]6 Q
  1. <div id="app"  v-runoob:hello.a.b="message">" q: {, L( R2 j3 A
  2. </div>( v5 n: N& p% K  t

  3.   y/ S) v* Y4 Y0 B: H. b  B. A
  4. <script>! S/ A* E  ~4 T
  5. Vue.directive('runoob', {
    * M& o, d& {& ^8 X& Z; F% o& e1 x) ~
  6.   bind: function (el, binding, vnode) {
    ; a& `( c4 {0 t+ l2 Q
  7.     var s = JSON.stringify
    - Y$ b1 ^4 @8 L2 h) X
  8.     el.innerHTML =# u9 E2 B6 I* }( {/ O& ~8 e
  9.       'name: '       + s(binding.name) + '<br>' +1 \  B/ ~" D* a
  10.       'value: '      + s(binding.value) + '<br>' +1 B9 n& ^# @, W! f- i# ]: Y9 M* l
  11.       'expression: ' + s(binding.expression) + '<br>' +7 q9 b* X! p- w% P: W
  12.       'argument: '   + s(binding.arg) + '<br>' +
    ! B8 r. |, \5 |& Q9 {; H
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +
    * G, t9 H1 ~( i# H4 Q( j: `
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    # u8 c% m2 k9 f; R, m' _7 k  j3 l
  15.   }9 Z+ U. ~& {0 ~9 e3 g! Y
  16. })/ H1 ]% o$ ]; ~+ ~
  17. new Vue({
    7 a+ [; d( G$ Q
  18.   el: '#app',
    ; b3 y- r* W2 k# X
  19.   data: {
    & T, C4 P3 }4 W; t
  20.     message: '菜鸟教程!'
      r2 W' M& \7 r
  21.   }5 v/ u) j5 Z) y8 }5 x8 b* v3 G- |
  22. })& |* F# e' A$ E/ |- @. {
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:$ [& W' ]- a' x* W& y
  1. Vue.directive('runoob', function (el, binding) {
    7 ~) i) C6 s* p) K. ~; {, Z; ~
  2.   // 设置指令的背景颜色6 X$ o5 |0 o; s( _- k' _! m8 {. [
  3.   el.style.backgroundColor = binding.value.color
    & [9 P" X1 u* I0 t  I- }/ v! V
  4. })
复制代码
! X/ V5 Z5 Q* T

$ L" q# V% U( a8 F$ p  w! G
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
  E2 E7 K8 E* `2 Z5 l2 E$ G8 H
0 v0 ~: v7 o- n( y
  1. <div id="app">
    ) ]1 L( J/ e7 `% W
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    6 ?2 k$ [' |6 V0 ]
  3. </div>9 b8 v" ?/ [2 m5 \$ H! K
  4. ( e( m3 H" g7 N- u
  5. <script>6 k' l5 G4 ]2 I* p  G- a
  6. Vue.directive('runoob', function (el, binding) {7 z9 `, D6 |5 O: a7 ^8 t6 i, Q
  7.     // 简写方式设置文本及背景颜色
    + f% r7 V# l: e: P
  8.     el.innerHTML = binding.value.text; ?1 c# i5 V  L% t) Z/ e
  9.     el.style.backgroundColor = binding.value.color- T4 {" J2 y# t6 c- P
  10. })
    / C: M: \) Z$ D, g7 p
  11. new Vue({
    ' x2 s3 u. _9 a$ k/ q4 A- m! `; ?. H
  12.   el: '#app'
    8 T- d3 Q' x5 D: u2 G- {1 u# \' a8 |
  13. })
    8 w9 f" f* {- K2 _1 o) Z7 y
  14. </script>
复制代码

" U; C9 E' k7 n" v
: l4 e' Q9 j0 x& |3 ^
0 k' i) D. a. \+ o5 E$ _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:55 , Processed in 0.070203 second(s), 19 queries .

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