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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
4 i- O% r, [1 H8 N% d+ ^# c
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
% K9 J5 o! Z/ Y+ O! R
. }1 P! F5 D8 {% @8 Q
  1. <div id="app">, ^; g$ z, ^+ S/ y% R6 m. w
  2.     <p>页面载入时,input 元素自动获取焦点:</p>, O/ e& j2 ?( L8 J$ g/ q2 R
  3.     <input v-focus>
    $ _. Z8 K% X" a% e$ ?4 R) V  I
  4. </div>$ I' N$ U* N; E% ^

  5. 3 e! j7 E4 W- i6 H5 X" Q) [( F2 O
  6. <script>
    9 i1 {. c5 [" B' A
  7. // 注册一个全局自定义指令 v-focus
    6 t, x; }$ E' r9 r( X
  8. Vue.directive('focus', {
      U+ \1 k! `0 [/ L3 P% @7 N
  9.   // 当绑定元素插入到 DOM 中。
    + y6 P1 d) L; t$ Q2 s- y
  10.   inserted: function (el) {
    7 |+ i3 y  F4 n8 Y. l* P) q3 i
  11.     // 聚焦元素
    % K. ]; }1 Y% ^* Q" G
  12.     el.focus()7 M. S! m' k6 E! G5 l
  13.   }  R7 t$ }+ R) @! c3 C6 |' w5 _
  14. })' F# W6 j, E+ M$ |, o
  15. // 创建根实例1 O5 O; @. h7 T3 `
  16. new Vue({3 [0 Q0 e% h; D1 q  i1 m
  17.   el: '#app'& r5 T5 U- O, b" E0 Y) q0 W
  18. })4 U% H) y- T; b( N% ?
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例- {4 I- r) g' U
+ P2 L" A* w1 Q( s2 Y7 f
  1. <div id="app">
    ! N5 J) {; r2 Y: g
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
      ?1 Q+ @. L3 E, ~& N
  3.   <input v-focus>! E6 i6 A: [5 o5 Q
  4. </div>) \# w" z6 N: g  W5 ^

  5. ' E6 E& m) k' A2 Y
  6. <script>3 r  V: C( z/ L* n
  7. // 创建根实例
    0 y- b# M& X1 u4 L3 A
  8. new Vue({2 E: F6 h2 K$ E! ?! t
  9.   el: '#app',: C: x8 H+ [! A4 B4 T7 [
  10.   directives: {
    " k% M  e* W+ |3 b7 F9 y
  11.     // 注册一个局部的自定义指令 v-focus
    2 ]8 h9 C* A3 |+ U; e: E+ H
  12.     focus: {
    * v& ?% @8 |1 ~. @/ n
  13.       // 指令的定义
    / o/ U/ w- X7 x2 {3 e# W$ p/ z
  14.       inserted: function (el) {7 }% B- V+ F$ X- j8 y3 A  c% R( D2 E' E
  15.         // 聚焦元素
    * m( l) Y+ m: @; X, c
  16.         el.focus()
    ; a% @4 i) {! E7 E0 P
  17.       }
    1 S& X8 ]& y4 ?% }
  18.     }
    / Y( h( I+ |" N1 n
  19.   }
    + s7 z6 |6 A, ]' D
  20. })
    7 }( d* O3 b0 ^6 j; i) \) D
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。
      u. ~% F' ]% d
钩子函数参数
钩子函数的参数有:
  • 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 }。" h+ T6 C7 o  o- D& E
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    0 V$ y) p0 m$ @3 N0 y
以下实例演示了这些参数的使用:
实例7 D$ x8 k% T2 ~! A

8 i% t! K# D: D5 Q9 i
  1. <div id="app"  v-runoob:hello.a.b="message">0 z; W* T5 |! `
  2. </div>! a8 D! w& o* b# N9 {3 P) I# [

  3. % Q+ a' g6 V# g  t+ l! [
  4. <script>8 Q3 L3 x9 X' E
  5. Vue.directive('runoob', {
    % z# v) x5 ?. p
  6.   bind: function (el, binding, vnode) {/ I6 ]1 x! _; E9 z9 g
  7.     var s = JSON.stringify
    ' W# \$ r- P0 I
  8.     el.innerHTML =
    : h7 V+ D! b% V; Z5 @
  9.       'name: '       + s(binding.name) + '<br>' +( j1 K: Q5 i1 P9 w
  10.       'value: '      + s(binding.value) + '<br>' +
    & i! ?, q# w1 `
  11.       'expression: ' + s(binding.expression) + '<br>' +
    ; D) }% o- q0 t: S2 E6 i
  12.       'argument: '   + s(binding.arg) + '<br>' +
    % o3 f: o& W7 C2 O" g
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +' b6 B  U& A& Y$ N' p! J: @
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')
    . r. P/ G  Z/ {5 h, W- e$ t0 m- L
  15.   }
    5 c0 M4 w2 o) ^& Z
  16. })
    8 A5 p; k6 d" o  |  x; W, h* x( t* A
  17. new Vue({" `; M2 ^& u) b8 |
  18.   el: '#app',
    ! S. N/ [+ S2 M& T0 x4 S
  19.   data: {
    ( V6 r& v1 e4 @$ o2 h" X+ r. V! `; w  j$ T
  20.     message: '菜鸟教程!'
    ( u1 R: K/ E. b: ?) [8 S, e5 }" \
  21.   }" M5 `% O  J: |
  22. })
    # ]- c- L* o7 D* O
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
& @2 n: Z7 z% J1 b( {1 f
  1. Vue.directive('runoob', function (el, binding) {, B- J/ m  r' t
  2.   // 设置指令的背景颜色
    : ~4 C/ ^' m9 t5 @+ b
  3.   el.style.backgroundColor = binding.value.color
    9 M9 z4 Y3 X" d3 X# ], o" l3 F
  4. })
复制代码
& I- w9 b2 R# T  o  w8 b

5 `- z. n0 H9 ~8 \% Q4 r; l
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例
- M# i- k2 w5 w: T) i
3 C, w5 F; O* g
  1. <div id="app">
    ) f; T5 O; }% K' i1 U
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>5 f: V. y, G( W5 h3 m9 K, u
  3. </div>" c  O& Y5 a6 L* z5 M  ~

  4. ; d, r& S+ B/ I
  5. <script>
    3 Q5 m0 A! M, T/ u* F
  6. Vue.directive('runoob', function (el, binding) {# Y( R; c  v1 n5 S7 {
  7.     // 简写方式设置文本及背景颜色9 ~9 i8 j5 t+ _7 I& K7 ~$ Z
  8.     el.innerHTML = binding.value.text
    8 V% {  i5 ?& h4 u# I
  9.     el.style.backgroundColor = binding.value.color$ I% x4 l) a9 N2 v2 i
  10. })
    . C9 C4 x5 I4 K% z1 t7 J" ?' r
  11. new Vue({6 c2 I1 n* s  k6 \1 o
  12.   el: '#app'
    # ~: q- i1 A8 r( j
  13. })
    & b5 \+ g* a+ e5 z8 K
  14. </script>
复制代码
( {& P; y* L! O, r% n5 v2 V
! h  x& @% {3 k
3 D5 O6 Y7 ~$ @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 14:22 , Processed in 0.066855 second(s), 19 queries .

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