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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2018-7-4 11:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
+ |) m8 m7 E1 B7 R
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。
下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点:
实例
9 Q. [; h$ g7 p' v3 a. _0 X2 q- u6 m1 G+ c/ j) Q0 J
  1. <div id="app">8 G& f4 |/ R, D  ?5 e! R4 d# U
  2.     <p>页面载入时,input 元素自动获取焦点:</p>
    % s  }" A  O# f* V) W+ u! x4 r
  3.     <input v-focus>
    5 |$ E5 y2 ?" `% S* ^' d* I1 Z
  4. </div>- ^% k$ e  A6 d+ M. I

  5. : V/ d- |' i2 c2 v
  6. <script>
    + R" m2 I" ^. G- g
  7. // 注册一个全局自定义指令 v-focus) z  G! t. {% I$ ]! H; N
  8. Vue.directive('focus', {
    % o+ O3 t% c  M5 k9 G$ N
  9.   // 当绑定元素插入到 DOM 中。
    ) @8 `0 B3 j# T% U( l4 v2 r0 n
  10.   inserted: function (el) {9 H+ w: R* z, |: I/ F" N6 y  W1 y5 K
  11.     // 聚焦元素- ]# ]3 r- a# A3 b5 ]/ B
  12.     el.focus(); J  V. H3 X  }2 c6 A4 P
  13.   }
    6 M8 r/ s* n. M5 ?6 g1 ?
  14. })7 i6 J  x# X1 D- q" w
  15. // 创建根实例$ N  f5 I7 f1 |
  16. new Vue({- V* V5 }* ^( l( J
  17.   el: '#app'
    ! K8 S9 g) Q- r
  18. })$ b$ I6 u/ F' N+ @/ z
  19. </script>
复制代码
我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用:
实例( J9 p* c: T/ W7 z. Q( a
* ?! N; V* r+ T7 {2 ~
  1. <div id="app">) e2 Z% r- j! f3 H6 C3 z
  2.   <p>页面载入时,input 元素自动获取焦点:</p>
    . K1 y" y+ V5 e  G* O
  3.   <input v-focus>
    & R5 a. k% v- h2 U: H
  4. </div># U  P4 X0 U$ g/ z% s
  5. 7 c* I. k0 u: Q/ B! f: n- k* X9 o
  6. <script>
    ' I- E" v0 X% j! U
  7. // 创建根实例
    & y* e" C8 ]; u- i* u1 _
  8. new Vue({
    * N. J" d3 o5 X* [
  9.   el: '#app',& d! i+ R  e( u$ G
  10.   directives: {
    ; P* @& J/ Q5 _% ?; Y2 d
  11.     // 注册一个局部的自定义指令 v-focus6 b7 }+ S0 ]  ~( T+ o6 S
  12.     focus: {
    4 x* }; G; \0 Z9 O6 l  R
  13.       // 指令的定义- u7 Z4 Z: s* p0 j4 u+ n
  14.       inserted: function (el) {
    2 q) d% G# t& B- N- U  k: l
  15.         // 聚焦元素
    ' T2 L( S6 |' o
  16.         el.focus()$ R9 t! B+ x" Y  d3 w6 Y+ ^# I( d4 R
  17.       }
    + f) G. w9 @1 f7 J/ @
  18.     }
    & h0 `, y5 F6 V7 H9 u
  19.   }
    2 ?4 @' i. c/ A3 H$ W2 s) I
  20. })
    # c( _6 b* C1 i1 m$ T
  21. </script>
复制代码
钩子钩子函数
指令定义函数提供了几个钩子函数(可选):
  • bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。
  • inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  • update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
  • componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
  • unbind: 只调用一次, 指令与元素解绑时调用。

      b+ Q. x- k, \7 P2 M0 K6 q6 l4 z
钩子函数参数
钩子函数的参数有:
  • 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 }。
      ( s8 `# M' ?7 D! W& o9 f0 g6 Y3 e
  • vnode: Vue 编译生成的虚拟节点。
  • oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
    2 f. f. f1 D6 ~) O
以下实例演示了这些参数的使用:
实例
8 I; e/ S* N  K+ P0 W7 V3 x9 h
5 b+ ~: o8 h/ h! K; {
  1. <div id="app"  v-runoob:hello.a.b="message">, Q) p" S" N& |1 K
  2. </div>
    1 a6 {/ @+ I$ V  U  P: }6 M, z
  3. 1 v& h, z- E, [' S% B+ x
  4. <script>
    % N  t; ~+ Z* F
  5. Vue.directive('runoob', {
    . _: H, t- m- S$ V0 D- ]: a
  6.   bind: function (el, binding, vnode) {
    5 U4 e5 _$ V( Q( E
  7.     var s = JSON.stringify5 Z0 C8 y3 z9 C$ c) v
  8.     el.innerHTML =9 D: S! l! N/ }9 @" N: b; g
  9.       'name: '       + s(binding.name) + '<br>' +& |. f8 d5 H. N
  10.       'value: '      + s(binding.value) + '<br>' +( B, y: B  S4 ^: d1 m+ G# Y5 a
  11.       'expression: ' + s(binding.expression) + '<br>' +* ?* d! U5 U( j7 {  w
  12.       'argument: '   + s(binding.arg) + '<br>' +
    4 {( w4 j( Q( _/ [2 G
  13.       'modifiers: '  + s(binding.modifiers) + '<br>' +. R/ Q; H! r2 Z9 |
  14.       'vnode keys: ' + Object.keys(vnode).join(', ')/ s6 G, @& H, R/ L# t. B' @, t
  15.   }- l* V1 I4 R. y. o! y6 e/ g
  16. })" n  G  F8 i5 N4 ^
  17. new Vue({
    1 S) ]% k1 ^! s
  18.   el: '#app',
    3 v* B% t: U- e9 j( C
  19.   data: {
    2 Z2 P( W( R+ `3 j1 ]
  20.     message: '菜鸟教程!'3 I  e2 @  K3 z. F
  21.   }
    ' s  s  e4 _' X% m
  22. })
    - v' x! k, p2 C1 M! c
  23. </script>
复制代码
有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:
. Y$ ~9 u/ y( E8 C' G: T% I
  1. Vue.directive('runoob', function (el, binding) {" G8 n8 S8 S+ S& [8 [: U
  2.   // 设置指令的背景颜色* R+ ]9 G* u  T
  3.   el.style.backgroundColor = binding.value.color
    # E! K. {3 q/ O$ h0 a
  4. })
复制代码

& P2 L6 g8 ?) D2 Y( B/ l. b' D$ J
$ Z+ s# `9 u* x* ]/ W8 m0 t
指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象:
实例5 A* o, V! U% c
  j) {# _) ]5 c! v$ \; {! u
  1. <div id="app">
    + O/ f, ]7 c. P4 N0 ]. _0 k3 l6 e' X
  2.     <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
    6 N' s+ _3 Y  a3 G# D1 P! Q* u- ^
  3. </div>2 u& A9 _/ H% p) S0 d
  4. ) b" J2 N/ {; z& C. A3 w
  5. <script>
    * k" K' @! P! j* p) k
  6. Vue.directive('runoob', function (el, binding) {
    ; v  `! a8 Q# n! P/ X
  7.     // 简写方式设置文本及背景颜色- Z) i3 c. e# R" \
  8.     el.innerHTML = binding.value.text
    # I2 }1 T. P% A) g1 |1 ~
  9.     el.style.backgroundColor = binding.value.color" r, N2 `% G. j; T8 S: E  i
  10. })
    ' o3 x# K$ F3 B& O$ C* V+ Y
  11. new Vue({. ^( ~) A( X+ u* A5 C
  12.   el: '#app'- _7 K7 F( K4 y3 r/ d# G6 u
  13. })
    ) a1 o1 ~1 F3 a- j) M# [
  14. </script>
复制代码

" T8 p( \$ V/ ^; ~% X4 v
$ c* r: b; l& Q" _5 A4 k2 `7 H" a7 d0 Q5 Z# V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 16:01 , Processed in 0.209220 second(s), 20 queries .

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