: 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
- <div id="app">( l& u# @7 S$ E1 S4 l$ k! V
- <p>页面载入时,input 元素自动获取焦点:</p>; Q+ [1 g# j6 T/ z- I g3 T
- <input v-focus>- R# p- c" x4 `1 m# @7 }
- </div>
W' X4 D& u/ \1 t - 9 K- A: n" w% n
- <script>* b7 a/ g* a6 ?4 c% p
- // 注册一个全局自定义指令 v-focus+ V( }2 b5 H. F& V9 J+ A
- Vue.directive('focus', {/ O9 t& ?( K1 L* Q# G2 |( b9 [
- // 当绑定元素插入到 DOM 中。6 y) {# J# h1 ]) `8 K
- inserted: function (el) {
, N2 L7 x# I& G - // 聚焦元素
; `: O `# t/ q7 g' k8 z# | - el.focus()9 _7 [; m h7 U0 s
- }* { C* }2 s8 O- U7 Q" P f
- })+ A* S( |9 M, Y
- // 创建根实例
7 P/ I1 `7 H- L- t: o* {8 W4 ^- R - new Vue({8 A! u6 F! J& @6 z9 R
- el: '#app'
) V" q [: D# v+ H! L& z - })5 B q a9 @" Q: ?+ C8 }9 f
- </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例& b; ^9 |; l& P( A3 w
/ D9 A! b1 R/ v5 }7 M$ \$ s
- <div id="app">2 }! W" N* M% n( i8 I3 u
- <p>页面载入时,input 元素自动获取焦点:</p>6 [# {/ U- h% C+ q* [
- <input v-focus>
, v' P# I: U0 [ - </div>. D, ?( I$ Z7 j/ x
-
" w) u% ?% s( `; V3 Q1 Y/ D - <script>2 k7 m# r4 T8 C# R3 O
- // 创建根实例* h* X; x9 H) E7 Z; @/ i+ s
- new Vue({7 Z8 r ?! A4 t8 v. u
- el: '#app',
8 d5 w' v3 x5 p: |# F - directives: {0 `2 {4 @: O- Z2 b* N h: R5 _6 C
- // 注册一个局部的自定义指令 v-focus9 Z2 `% j0 X# u
- focus: {% A/ H- P; r/ y9 g
- // 指令的定义, f" n; s8 D2 {; T* f. D
- inserted: function (el) {: r: j# q- `2 F! x1 M
- // 聚焦元素% A* c% X1 x, J$ s1 P: v9 x
- el.focus()
/ @9 u9 X4 m$ X4 R/ v - }7 ?# w' T, f9 y3 W0 b
- }0 K$ r7 e: p! {& }4 A* O* u+ X
- }; q: F, v9 e( ?2 |
- }): _# L( g) \6 x* J, o; {# v! w2 x
- </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- <div id="app" v-runoob:hello.a.b="message">2 m! v `, D- o. H: d9 a
- </div>
- i1 `6 k, ~4 G1 v. Y$ Z9 Q8 Z: Z -
P6 A4 \1 B: w' t3 b3 L# V/ E3 Z - <script>
% _4 O9 V/ l8 c0 e/ z - Vue.directive('runoob', {
. k$ F. K3 e- ?. W F6 Z - bind: function (el, binding, vnode) {' S6 v8 T1 a. k9 R4 \/ t
- var s = JSON.stringify6 I. a: Y8 o' z/ j
- el.innerHTML =
. a, i4 u( u0 c - 'name: ' + s(binding.name) + '<br>' +
% b, c. \# v9 L* g- {8 g - 'value: ' + s(binding.value) + '<br>' +$ J) C* Z! B6 m. N+ r D
- 'expression: ' + s(binding.expression) + '<br>' +
! @4 E# Q! E) m - 'argument: ' + s(binding.arg) + '<br>' +, @% n9 E7 B. U7 j- F! C. y& s
- 'modifiers: ' + s(binding.modifiers) + '<br>' +
* E n1 U5 L$ J% E - 'vnode keys: ' + Object.keys(vnode).join(', ')$ E- f _ w" m! z
- }
% o9 c7 }( K5 v0 _ - }) m. J: V8 S& B% Z/ `/ K
- new Vue({0 F/ D& Z9 F/ |( A
- el: '#app',
: t% |! Y8 O/ w" | - data: {
0 k% B5 o4 I! `7 {6 I% a - message: '菜鸟教程!'" Z7 T2 [+ k G+ l+ |" V% a
- }$ ?! S: e/ Y* T& [9 b: P
- })5 v- h. @) ?1 A6 |" r. w+ F! s, W
- </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:; u0 Q2 F! j9 u
- Vue.directive('runoob', function (el, binding) {
5 w' ]% F5 M6 S1 O9 J - // 设置指令的背景颜色7 X, _6 G" H# }; W/ Q1 c
- el.style.backgroundColor = binding.value.color$ w4 c5 q* E; ]
- })
复制代码 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- <div id="app">
2 ~" C+ i6 _% }1 R - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
4 G2 P' ^& [1 S; x" T3 } - </div> t1 ^" l6 d, k
- 8 ]$ a* `9 ^/ c4 X
- <script>0 r! q A8 d8 c. t
- Vue.directive('runoob', function (el, binding) {6 ?- f) u& M: a8 m
- // 简写方式设置文本及背景颜色8 z2 g# d& \. W+ g9 f
- el.innerHTML = binding.value.text
% |8 J2 ~- G8 `9 @ - el.style.backgroundColor = binding.value.color
+ _, H. q0 B( o, E - }). ~% ]% b. n {$ O; h0 c6 p- G' ?
- new Vue({
X5 H5 D& \9 K2 ^7 Q# a - el: '#app'
U0 S6 l4 m3 V- n+ P+ ^* H6 D - })
. p" B2 G$ ~* P2 S" h - </script>
复制代码
. ~! h3 C- |3 c/ e& G' T2 p# U, |/ b4 K1 c- c; ?2 n
) |; f" G/ d, A+ F" x
|