- N9 q$ P m( n8 y K
除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令。 下面我们注册一个全局指令 v-focus, 该指令的功能是在页面加载时,元素获得焦点: 实例1 u4 h/ J3 w. D! ^% z; n$ l
, E$ S4 i! S7 N; p2 r) X- <div id="app">- s6 Z. t: `# o. ?0 e0 B
- <p>页面载入时,input 元素自动获取焦点:</p>
7 h! Q, K6 ]& m# z% a% f6 k' _ - <input v-focus>
6 q1 ]2 W& c$ j7 Z1 L; R3 ^; l - </div>
# _, _: g# s8 [1 s* c- g" B - ' S x% F% M3 ~) W8 O6 c
- <script>
/ F. F7 \$ j/ Z; |, G - // 注册一个全局自定义指令 v-focus8 ?+ R1 H9 y( X) o3 x
- Vue.directive('focus', {
0 q# @6 e& \5 l, s, y, k - // 当绑定元素插入到 DOM 中。
h, ]% t! Q/ b; T' J1 l% z - inserted: function (el) {
9 [5 o: C+ Q& V' B& q5 Y - // 聚焦元素
1 z( P5 d& i: E+ ^ - el.focus(). E; S7 F/ |, @5 c' h; D3 P; c
- }+ @( g4 f# h5 y8 s! X
- }). `( ~: f6 w( J7 F, v3 d
- // 创建根实例, ]0 s$ R& E% X3 ?
- new Vue({; v+ ^' \) C2 } ?; x. u
- el: '#app'
/ E9 G- b# S/ h/ G% } - })
4 f3 ^$ r# w5 L - </script>
复制代码我们也可以在实例使用 directives 选项来注册局部指令,这样指令只能在这个实例中使用: 实例
- Q3 ]! B r ^0 }% n+ @& S5 I0 T
- <div id="app">- D0 l! f7 x Z6 E5 b! `/ N' k
- <p>页面载入时,input 元素自动获取焦点:</p>
* _. W+ x/ t: w ? - <input v-focus>
$ A* q+ p, w" w8 e" A6 B - </div>
. Q" B2 _/ E, C1 v* R* {5 q+ V - / Z2 G9 X6 O; ?/ j0 m
- <script>
; h) r% {) [' o+ k& b* _- D - // 创建根实例
|5 `5 U% K1 J; j" \/ `7 M - new Vue({
4 f- C* D$ t" h - el: '#app',
, M* [7 ^4 u, o - directives: {
2 [! f p1 c8 ?- }5 V' o - // 注册一个局部的自定义指令 v-focus
; _+ g& P8 r( B9 }5 I* P - focus: {/ X% d+ D4 w+ `
- // 指令的定义
) J$ D% k+ |) ? - inserted: function (el) {
6 j9 s- @+ Q' d7 u7 _ - // 聚焦元素. E; c4 {+ m8 M0 S+ v& K M
- el.focus()
/ B- q* @3 B5 O! C% E% ^! e3 \0 ~ - }
9 e0 g. d# V" l, k5 S: E - }
Q* R! w8 q2 \8 j4 T9 Y7 ^3 ] - }
. q% n/ I* P: L* u7 N- N - })
5 J3 L$ p2 f3 V- A1 v$ i( f - </script>
复制代码 钩子钩子函数指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。 update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。 componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。 unbind: 只调用一次, 指令与元素解绑时调用。 3 i8 F) S1 i+ Y% d: Q4 f
钩子函数参数钩子函数的参数有: - 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 }。9 Q# I/ A3 u$ I4 A- F' U
- vnode: Vue 编译生成的虚拟节点。
- oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。
4 L+ @. a, e; R1 Q
以下实例演示了这些参数的使用: 实例
+ @ M( m; G: y) p4 |
2 M. g, @6 C5 E+ ^1 u; u- <div id="app" v-runoob:hello.a.b="message">
/ A% i" y$ r9 m0 n - </div>: Z7 t1 B7 ~" q: s1 {6 e @/ r
-
' Q4 I- f% x8 E - <script>2 i" d1 C% |$ z* V. ~9 ]
- Vue.directive('runoob', {
( g, X' ], ~ m# ^' g - bind: function (el, binding, vnode) {( {; n) m7 C, y! k' P# ~
- var s = JSON.stringify1 V# p) d8 Q$ V$ ?& _* W
- el.innerHTML =
8 q* y' W. m% X W - 'name: ' + s(binding.name) + '<br>' +
# \; z: r) \. H8 _; o - 'value: ' + s(binding.value) + '<br>' +
+ y6 ]0 l/ I+ [; M - 'expression: ' + s(binding.expression) + '<br>' +
# p" ?+ K( A5 p2 e4 ~. H - 'argument: ' + s(binding.arg) + '<br>' +
* A* D5 H J/ ?! Z - 'modifiers: ' + s(binding.modifiers) + '<br>' +% W# Y6 J! Z2 n
- 'vnode keys: ' + Object.keys(vnode).join(', ')
4 t- L" t4 c1 n( D - }
. [3 q: ^5 S% R1 Y; J. Z - })6 Z( k- g4 `4 H* K: F$ x
- new Vue({* I* a' F# S f: s6 i L
- el: '#app'," z$ ]& R& M% x7 n/ c5 K
- data: {
: c! G9 E. O" [6 X" q/ ]$ D L - message: '菜鸟教程!'
) R; b* T; d( C" V - } [2 \ v9 T& M2 l3 q# [9 w
- })
' {; y/ x! r. Y) d5 l0 ^ - </script>
复制代码 有时候我们不需要其他钩子函数,我们可以简写函数,如下格式:8 q7 w: s% ^& }3 n
- Vue.directive('runoob', function (el, binding) {
9 z8 Q* |1 s- o# f: m6 t+ } - // 设置指令的背景颜色
) o' F! ], Y- A7 f: S+ t! v - el.style.backgroundColor = binding.value.color
' H: G: V8 ]& b6 d" h - })
复制代码 8 W9 ]& ~4 J2 ?) ] M; _" p
! E: _; _3 `. C" U指令函数可接受所有合法的 JavaScript 表达式,以下实例传入了 JavaScript 对象: 实例
% N0 q" h, \6 i" o. `* A2 v/ s, m5 q! u' B: y2 g
- <div id="app">
1 ?2 z; Q) E6 u8 M; U$ b3 S - <div v-runoob="{ color: 'green', text: '菜鸟教程!' }"></div>
0 i- B& A$ N+ T( P0 j - </div> |0 x( O& C! s5 ~) U
-
* l+ k. i, c/ p - <script>9 g7 Y8 W0 K/ ^9 p* |
- Vue.directive('runoob', function (el, binding) {
' v5 S8 {& r3 T$ n - // 简写方式设置文本及背景颜色; u- g6 d( h% Y4 N
- el.innerHTML = binding.value.text4 D6 l0 A. i, v% g
- el.style.backgroundColor = binding.value.color8 E6 N% V0 D$ p; r$ X3 V' B
- }), |) \' W+ U9 g* c" O9 Q: m7 ~. X2 ?
- new Vue({
) a2 s0 ?* Y/ @ - el: '#app'
1 k0 k( ~* R) |7 Z3 ?9 ? - }), P2 \+ e% K% w( w
- </script>
复制代码 4 }. H8 ~" V6 l. T
# y, |) P: Q& M( n
% _6 A3 O6 U5 B6 C( _1 x
|