Webcourse/21-Vue基础/01-06.自定义按键修饰符&自定义指令.md

122 lines
4.1 KiB
Markdown
Raw Normal View History

## v-on的按键修饰符
### Vue 内置的按键修饰符
通俗一点讲指的是监听键盘输入的事件。Vue 允许为 v-on 在监听键盘事件时添加按键修饰符。如下:
Vue内置的按键修饰符
```
.enter
.tab
.delete (捕获 “删除” 和 “退格” 键)
.esc
.space
.up
.down
.left
.right
1.0.8+版本:支持单字母的按键别名。
```
比如说,`keyup`指的是,键盘抬起时的监听事件。`.enter`指的是按enter键的按键修饰符。
**`@keyup.enter`举例**按enter键后的监听事件
`@keyup.enter="addData"`表示按住enter键后执行addData()方法。**全称**是`v-on:key.enter="addData"`。
我们还是拿`01-04`这篇文章中的列表功能来举例。之前是点击“添加”按钮后列表中会添加一个item。现在要求在**输入框**中按enter键后也能添加一个item。
核心代码如下:
```html
<input type="text" v-model="formData.name" @keyup.enter="addData">
```
注意,如果写成`@keyup="addData"`效果却是只要键盘打了字还没来得及按enter键就会执行addData()方法,这种效果显然不是我们想要的。
### 自定义的按键修饰符
如果我们直接在代码的`<input>`标签里写`@keyup.f2="addData"`那么按住「F2键」后是没有效果的因为「F2键」不是内置的按键修饰符如果F2不能验证你可以试一下F7
我们知道,每个按键都有一个键盘码。参考链接:
- [js 里面的键盘事件对应的键码](http://www.cnblogs.com/wuhua1/p/6686237.html)
通过查阅我们知道了「F2键」的键盘码为`113`那代码可以这样写按住F2键后执行 addData 方法)
```html
<input type="text" v-model="formData.name" @keyup.113="addData">
```
虽然键盘码很全,但是不好记呀。于是,接下来,我们给键盘码定义别名。
**自定义全局按键修饰符**
```
//自定义全局按键修饰符
Vue.config.keyCodes.f2 = 113;
```
上方代码的书写位置,与自定义全局过滤器的位置,是并列的。
然后,我们就可以使用键盘码的别名了。
## 自定义指令
2018-05-30 23:15:52 +08:00
### 自定义全局指令的举例
**举例**:网页打开后,让指定文本框自动获取焦点。
如果我们想实现上面的例子原生js的写法是
```javascript
//原生js写法网页一打开就让指定的输入框自动获取焦点
document.getElementById('search').focus()
```
代码的位置:
20180527_2340.png
但我们不建议这样做。我们可以通过Vue中的自定义指令来实现这个例子。步骤如下。
1使用`Vue.directive()`自定义全局指令:
```javascript
//参数1指令的名称。注意在定义的时候指令的名称前面不需要加 v- 前缀;但是:在`调用`的时候,必须在指令名称前 加上 v- 前缀
//参数2是一个对象这个对象身上有一些指令相关的函数这些函数可以在特定的阶段执行相关的操作
Vue.directive('focus', {
2018-05-30 23:15:52 +08:00
//在每个函数中,第一个参数,永远是 el ,表示 被绑定了指令的那个元素,这个 el 参数是一个原生的JS对象DOM对象
bind: function (el) { // 每当指令绑定到元素上的时候,会立即执行这个 bind 函数,只执行一次
// 在元素 刚绑定了指令的时候,还没有 插入到 DOM中去这时候调用 focus 方法没有作用
// 因为一个元素只有插入DOM之后才能获取焦点
// el.focus()
},
inserted: function (el) { // inserted 表示元素 插入到DOM中的时候会执行 inserted 函数【触发1次】
el.focus()
// 和JS行为有关的操作最好在 inserted 中去执行,放置 JS行为不生效
},
updated: function (el) { // 当VNode更新的时候会执行 updated 可能会触发多次
}
})
```
上方的代码中,
2在指定的文本框上加``
```html
<input type="text" id="search" v-model="keywords" v-focus>
```