v-bind 主要用于响应更新 HTML 元素的属性,将一个或多个组件的 prop 动态绑定到表达式。
例5-9,如下:
DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>title>
head>
<body>
<div id="app">
<img v-bind:src="imgSrc">
<img :src="imgSrc">
<a v-bind:[attrname]="url">链接a>
<img :src="'images/' + fileName">
<form v-bind="formObj">
<input type="text">
form>
div>
<script src="https://unpkg.com/vue@next">script>
<script>
const vm = Vue.createApp({
data() {
return {
attrname: 'href',
url: 'http://www.sina.com.cn/',
imgSrc: 'images/bg.jpg',
fileName: 'bg.jpg',
formObj: {
method: 'get',
action: '#'
}
}
}
}).mount('#app');
script>
body>
html>
v-model 指令用来在表单 input、textarea和select元素上创建双向数据绑定,它会根据空间类型自动选取正确的方法来更新元素。
尽管有些神奇,但 v-model 本质上不过是语法糖,它负责监听用户的输入事件以及更新数据,并对一些极端场景进行特殊处理。
提示:
语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
例5-10,如下:
DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>title>
head>
<body>
<div id="app">
<input type="text" v-model="message">
div>
<script src="https://unpkg.com/vue@next">script>
<script>
const vm = Vue.createApp({
data() {
return {
message: 'Hello World'
}
}
}).mount('#app');
script>
body>
html>
使用浏览器打开页面,可以看到空间中的内容为 Hello World ,在 Console 窗口输入以下内容并按 Enter 键:
vm.message = "Welcome you"
可以看到输入控件中的内容也发生了变化,如图:

接下来在输入框中随意输入一些内容,然后在 Console 窗口输入下面内容
vm.message
可以看到 message 的值也发生了变化,如图:

v-on 指令用于监听 DOM 事件,并在触发时运行一些 JavaScript 代码。v-on 指令的表达式可以是一段 JavaScript 代码,也可以是一个方法的名字或方法调用语句。如下:
例5-11
DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>title>
head>
<body>
<div id="app">
<p>
<button v-on:click="count += 1">Add 1button>
<span>count: {{count}}span>
p>
<p>
<button v-on:click="greet">Greetbutton>
<button @click="greet">Greetbutton>
p>
<p>
<button v-on:click="say('Hi')">Hibutton>
p>
div>
<script src="https://unpkg.com/vue@next">script>
<script>
const vm = Vue.createApp({
data() {
return {
count: 0,
message: 'Hello, Vue.js!'
}
},
//在选项对象的methods属性对象中定义方法
methods: {
greet: function() {
//方法的this值始终指向组件实例
alert(this.message)
},
//对象方法的简写语法
say(msg) {
alert(msg)
}
}
}).mount('#app');
script>
body>
html>
说明:
(1)方法是在选项对象的 methods 选项中定义,该选项是一个对象属性。在 methods 选项中定义的方法,可以直接通过组件实例访问,也可以从组件的模板中访问这些方法。在模板中,方法最常用作事件监听器。
注意:
一定不要使用箭头函数定义方法(如 plus:() => this.a++)。这是因为箭头函数绑定的是父级作用域的上下文,所以 this 将 不会按照期望指向组件实例,this.a 将为 undefined。
(2)虽然 v-on 指令的表达式中可以直接书写 JavaScript 语句(例5-11的①),但在实际开发中,由于事件处理逻辑通常比较复杂,所以常用的还是例5-11的②、③形式。
(3)在渲染的结果中,并不会在 v-on 指令所在元素上出现对应的 JavaScript 事件属性。例 5-11渲染结果如下:

(4)当组件实例销毁时,所有的时间监听器都会被自动删除,所以无须担心如何清理它们。
如果在事件绑定的方法中需要访问原始的 DOM 事件,可以使用特殊的变量 event 把它传入方法。在单击链接的时候,会跳转到链接指向的页面,然而有时候会根据某个条件是否达成来决定是否跳转,如果条件不满足,这时会调用事件对象的 preventDefault() 方法阻止跳转。
**在使用 v-on 指令绑定事件处理器时,就可以用 event 传入原始的 DOM 事件对象,然后在事件处理器方法中访问原生的事件对象。**代码如下所示:
<a href="/login" v-on:click="login($event)">登录a>
//...
methods:{
//...
if(event){
event.preventDefault();
}
}
上述代码也可以使用事件修饰符 .prevent 实现相同的功能。
此外,在事件方法中如果要访问事件绑定的原始 DOM 元素节点对象,可以调用 event .currentTarget 得到。
在使用 v-on 指令绑定的 事件处理器中可以有多个方法,方法之间用逗号运算符分割。如下:
<button @click="one($event),two($event)">
Submit
button>
//...
methods: {
one(event){
//第一个处理程序逻辑
},
two(event){
//第二个处理程序逻辑
}
},
在事件处理程序中调用 event.preventDefault() 方法或 event.stopPropagation() 方法是非常常见的需求,为了解决这个问题,Vue.js 提供了事件修饰符,让我们可以专注于纯粹的数据逻辑,而不需要考虑如何处理 DOM 事件细节。
修饰符是由点开头的指令后缀表示的,紧接在事件名称后书写。针对 v-on 指令,Vue 提供了以下修饰符:
针对前面调用 event.preventDefault() 方法阻止默认的链接跳转行为的需求,使用事件修饰符就可以轻松实现相同的功能。如下:
<a href="/login" v-on:click.prevent="login">登录a>
//...
methods:{
//...
login(){//...}
}
下面是上述部分事件修饰符的用法。
<a v-on:clickc.stop="doThis">a>
<form v-on:submit.prevent="onSubmit">form>
<a v-on:click.stop.prevent="doThat">a>
<form v-on:submit.prevent>form>
<div v-on:click.capture="doThis">...div>
<div v-on:click.self="doThat">...div>
<a v-on:click.once="doThis">a>
<button v-on="{mousedown:doThis,mouseup:doThat}">button>
说明:
(1)DOM 事件规范支持两种事件模型,即捕获型事件和冒泡型事件,捕获型事件从最外层的对象(大部分兼容标准浏览器使用 window 对象最为最外层对象)开始,直到引发事件的对象;冒泡型事件从引发事件的对象开始,一直向上传播,直到最外层的对象结束。任何发生在 DOM 事件模型中的事件,首先进入捕获阶段,直到达到目标对象,再进入冒泡阶段。v-on 指令提供的 .stop 和 .capture 修饰符即与此有关,所以了解了 JavaScript 的 DOM 事件模型,就很容易理解这两个修饰符的作用。
(2)修饰符可以串联在一起使用,但顺序很重要。例如,使用 v-on:click.prevent.self 会阻止所有的单击,而 v-on:click.self.prevent 只会阻止对元素自身的单击。
(3)如果某个事件只需要响应一次,与 addEventListener 的 passive 选项想对应。.passive 修饰符对于提高移动设备的性能特别有用。
在监听键盘事件时,经常需要检查详细的按键,为此,可以在 v-on 监听键盘事件时添加按钮修饰符。
<input v-on:keyup.enter="submit">
Vue 为最常用的按键提供了以下别名:
Vue 还提供了以下系统修饰键,用来实现仅在按下相应按键时才触发鼠标或键盘事件的监听器。
注意:
在 Mac 系统键盘上,meta 对应 command 键;在 Windows 系统键盘上,meta 对应 windows 徽标键;在 Sun 操作系统键盘上,meta 对应实心钻石键。
例如:
<input @keyup.alt.enter="clear">
<div @click.ctrl="doSomething">doSomethingdiv>
注意:
修饰键与常规按键不同,当和 keyup 事件一起使用时,事件触发时修饰键必须处于按下状态,如下面的代码:
<input @keyup.ctrl.c="doSomething">
当同时按下 Ctrl + C 键时 doSomething() 方法并不会被调用,只有在按住 Ctrl 键的情况下释放键 C 才能触发 doSomething() 方法的调用。要想在同时按下 Ctrl + 某个键时触发 keyup.ctrl ,那么需要用 Ctrl 的虚拟键代码 17 代替 Ctrl 修饰键。如下:
<input @keyup.17.c="doSomething">
.exact 修饰符用于精确控制系统修饰符组合触发的事件。
<button @click.ctrl="onClick">1button>
<button @click.ctrl.exact="onClick">2button>
<button @click.exact="onClick">3button>
以下鼠标按键修饰符分别对应的左键、右键、中键
例如,下面的代码只有在鼠标右击的时候才会触发事件处理函数。
<input @click.right="dododo">