1、私有指令语法:
directives:{
'focus(指令名称)':{
bind(el) {},
inserted(el,binding){},
updated(el) {},
},
}
引用方式:
<input type="text" v-model="id" name="id" v-focus>
注意:在定义的时候,指令的名称前面,不需要加 v- 前缀,但是,在调用的时候,必须 在指令名称前 加上 v- 前缀来进行调用
2、 钩子函数,只介绍常用
| 只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。 和style有关的操作,最好在bind中去执行 |
inserted | 被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。 和JS行为有关的操作,最好在 inserted 中去执行,否者 JS行为不生效 |
update | 当VNode更新的时候,会执行 updated, 可能会触发多次 |
3、钩子函数参数,只介绍常用
el
:指令所绑定的元素,可以用来直接操作 DOM 。binding
:一个对象,包含以下属性:name
:指令名,不包括v-
前缀。value
:指令的绑定值,例如:v-my-directive="1 + 1"
中,绑定值为2
。oldValue
:指令绑定的前一个值,仅在update
和componentUpdated
钩子中可用。无论值是否改变都可用。expression
:字符串形式的指令表达式。例如v-my-directive="1 + 1"
中,表达式为"1 + 1"
。
4、实例
- v-focus指令定义:
directives:{
'focus':{
bind(el) {
},
inserted(el){
el.focus()
},
updated(el) {
},
},
- v-focus指令引用:
<input type="text" v-model="id" name="id" v-focus>
- 效果
源码:
<template>
<div class="root">
<label for="id">
id:
<input type="text" v-model="id" name="id" v-focus>
</label>
<label for="name">
name:
<input type="text" v-model="name" name="name" @keyup.13="add()" ref="name">
</label>
<input type="button" value="添加" class="btn btn-primary" @click="add()" >
<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<tr v-for="item in list" :key="item.id">
<td>{{ item.id }}</td>
<td>{{ item.name }}</td>
</tr>
</tbody>
</table>
</div>
</template>
<script>
export default {
data() {
return {
id: "",
name: "",
list: [{ id: 1, name: "奔驰" }, { id: 2, name: "宝马" }]
};
},
methods: {
add() {
// 添加的方法
var car = { id: this.id, name: this.name };
this.list.push(car);
this.id = this.name = "";
},
},
directives:{
'focus':{
bind(el) {
},
inserted(el){
el.focus()
},
updated(el) {
},
},
}
};
</script>
<style lang="stylus" scoped>
.root {
margin: 20px 100px;
}
</style>