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。
核心代码如下:
<input type="text" v-model="formData.name" @keyup.enter="addData">
|
注意,如果写成@keyup="addData"
,效果却是:只要键盘的任何键位打了字(还没来得及按enter键),就会执行addData()方法,这种效果显然不是我们想要的。所以要加上修饰符.enter
,表示只针对enter键。
自定义的按键修饰符
如果我们直接在代码的<input>
标签里写@keyup.f2="addData"
,那么,按住「F2键」后,是没有效果的,因为「F2键」不是内置的按键修饰符(如果F2不能验证,你可以试一下F7)。
我们知道,每个按键都有一个键盘码。参考链接:
通过查阅,我们知道了「F2键」的键盘码为113
,那代码可以这样写:(按住F2键后,执行 addData 方法)
<input type="text" v-model="formData.name" @keyup.113="addData">
|
虽然键盘码很全,但是不好记呀。于是,接下来,我们给键盘码定义别名。
自定义全局按键修饰符:
//自定义全局按键修饰符 Vue.config.keyCodes.f2 = 113;
|
上方代码的书写位置,与自定义全局过滤器的位置,是并列的。
然后,我们就可以使用键盘码的别名了。
自定义全局指令
自定义全局指令的举例1
举例1:让指定文本框自动获取焦点
如果我们想实现这个例子,原生js的写法是:
document.getElementById('search').focus()
|
代码的位置:
但我们不建议这样做。我们可以通过Vue中的自定义指令来实现这个例子。步骤如下。
(1)使用Vue.directive()
自定义全局指令:
Vue.directive('focus', { bind: function (el) { }, inserted: function (el) { el.focus() }, updated: function (el) {
} })
|
上方的代码中,如果我们把el.focus()
这行代码写在bind
方法里,是没有效果的(但不会报错)。没有效果是因为,在执行到bind
方法的时候,元素还没有插入到dom中去。
由此可以看看出:bind
、inserted
、updated
这三个钩子函数的执行时机不同,且执行的次数有区别。
(2)在指定的文本框上加``:
<input type="text" id="search" v-model="keywords" v-focus>
|
完整版代码如下:
<!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="vue2.5.16.js"></script> </head>
<body>
<div id="app"> 搜索框: <input type="text" id="search" v-model="name" v-focus> </div>
<script>
Vue.directive('focus', { bind: function (el) { }, inserted: function (el) { el.focus() }, updated: function (el) { } })
new Vue({ el: '#app', data: { name: 'smyhvae' } }) </script> </body>
</html>
|
自定义全局指令:使用钩子函数的第二个binding参数拿到传递的值
举例2:设置DOM元素的color样式
参考举例1中的写法,我们可能会这样给DOM元素设置样式:
<!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="vue2.5.16.js"></script> </head>
<body>
<div id="app"> 搜索框: <input type="text" id="search" v-model="name" v-color> </div>
<script>
Vue.directive('color', { bind: function (el) { el.style.color = 'red'; }, inserted: function (el) { }, updated: function (el) { } })
new Vue({ el: '#app', data: { name: '' } }) </script> </body>
</html>
|
如上方代码所示,我们自定义了一个指令v-color
,然后在input
标签中用上了这个指令,就给元素设置了color属性。但是这个代码有个弊端是:color的属性值在定义指令的时候,被写死了。如何完善呢?我们可以在DOM元素中传参。一起来看看。
代码如下:【荐】
<!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="vue2.5.16.js"></script> </head>
<body>
<div id="app"> 搜索框1: <input type="text" id="search" v-model="name" v-color="'green'"> </div>
<script>
Vue.directive('color', { bind: function (el, binding) {
console.log(binding.name); console.log(binding.value); console.log(binding.expression);
el.style.color = binding.value
}, inserted: function (el) { }, updated: function (el) { } })
new Vue({ el: '#app', data: { name: 'smyhvae' } }) </script> </body>
</html>
|
上方代码中,bind方法里传递的第二个参数binding
,可以拿到DOM元素中v-color
里填的值。注意,v-color="'green'"
,这里面写的是字符串常量;如果去掉单引号,就成了变量,不是我们想要的。
效果:
自定义全局指令的简写形式:
在很多时候,你可能想在 bind 和 update 时触发相同行为,而不关心其它的钩子。比如上面的代码中,我们可以写成简写形式:
Vue.directive('color', function (el, binding) { el.style.color = binding.value })
|
自定义私有指令
自定义私有指令:在某一个 vue 对象内部自定义的指令称之为私有指令。这种指令只有在当前vue对象的el指定的监管区域有用。
代码举例:(设置文字的font-weight属性)
<!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="vue2.5.16.js"></script> </head>
<body>
<div id="app"> <span v-fontweight="600">生命壹号</span> </div> <script>
new Vue({ el: '#app', data: { name: 'smyhvae' }, directives: { 'fontweight': { bind: function (el, binding) { el.style.fontWeight = binding.value; } } } }) </script> </body>
</html>
|
效果:
注意, el.style.fontWeight设置属性值,至少要600,否则看不到加粗的效果。
自定义私有指令的简写形式:
在很多时候,你可能想在 bind 和 update 时触发相同行为,而不关心其它的钩子。比如上面的代码中,我们可以写成简写形式:
//自定义私有指令(简写形式) directives: { 'fontweight': function (el, binding) { //注意,这个function等同于把代码写到了 bind 和 update 中去 el.style.fontWeight = binding.value; } }
|