2-8 事件绑定 事件修饰符
事件修饰符
老规矩先贴个代码^ ^
<script>
const app = Vue.createApp({
data () {
return {
count: 0
}
},
methods: {
handleBtnClick() {
this.count += 1
}
},
template: `
<div>
{{count}}
<button @click="handleBtnClick">click</button>
</div>
`
})
const vm = app.mount('#root');
</script>
这个就是简单的绑定一个click
事件,点击按钮,左边的数字+1
我们还可以这样写<button @click="count += 1">click</button>
这样写看似简洁一点,但是用这种方式能执行的逻辑太少了,所以建议还是调用方法好一点
然后就是一个click
事件是可以触发多个方法的
<div >
{{count}}
<button @click="handleBtnClick(), handleDivClick()">click</button>
</div>
记得要加括号!!
然后再介绍一些修饰符
-
stop
methods: { handleBtnClick() { this.count += 1 }, handleDivClick() { alert('hi') } }, template: ` <div @click="handleDivClick"> {{count}} <button @click="handleBtnClick">click</button> </div>
这样子写,当我们点击按钮的时候,不仅
count
会+1,还会弹出'hi',这个就是事件冒泡,我们点击button
的时候向上冒泡也触发了div
上绑定的点击事件,所以要阻止事件冒泡,我们只需要<button @click.stop="handleBtnClick">click</button>
,这样点击按钮不会向父元素冒泡了 -
self
<div @click.self="handleDivClick"> {{count}} <button @click="handleBtnClick">click</button> </div>
.self
就是会判断点击的是不是自己本身的内容,假如点击的是子元素,就不会触发handleDivClick
,如果点击的count
就会触发 -
prevent
阻止默认行为,前面应该写到过这里省略
-
capture
事件的触发是按照冒泡模式来的,也就是先触发里面的元素,加
.capture
就是让事件的触发反着来,也就是按照捕获模式来触发(用的不太多) -
once
前面应该也写到过,
.once
这个事件只执行一次
按键修饰符
<input @keydown.enter="handleKeydown">
其他的按键修饰符:tab
、delete
、esc
、up
、down
、left
、right
鼠标修饰符
<button @click="handleBtnClick">click</button>
这样写的话,其实鼠标上的三个键点击都会触发handleBtnClick
的,我们可以加.left
、.right
、.middle
指定鼠标按键
精确修饰符
<button @click.ctrl="handleBtnClick">click</button>
这样写,当我们按住ctrl
点击就能触发,但是我们如果按下ctrl
和其他键盘上的键,也能触发事件,所以我们可以添加一个.exact
精确修饰符,这样只能按下ctrl
点击才能触发事件
2-9 表单中双向绑定指令的使用
先看一个简单点的:
<script>
const app = Vue.createApp({
data () {
return {
message: 'hi'
}
},
template: `
<span>{{message}}</span>
<input v-model="message" />
`
})
const vm = app.mount('#root');
</script>
这个是一个简单的数据双向绑定,当input
框里的内容发生改变,前面span
元素里的内容也会发生变化同样的前面span
里的内容变化,input
框里的内容也会跟着变化。这种情况input
标签上就不用写value
了
同样的textarea
也能这样使用
<span>{{message}}</span>
<textarea v-model="message" />
checkbox
也能使用(多选框)
<script>
const app = Vue.createApp({
data () {
return {
message: []
}
},
template: `
<div>{{message}}</div>
apple <input type="checkbox" v-model="message" value="apple" />
orange <input type="checkbox" v-model="message" value="orange" />
peach <input type="checkbox" v-model="message" value="peach" />
`
})
const vm = app.mount('#root');
</script>
需要注意的是:
message
是一个数组,因为checkbox
是多选框,所以要用数组存值,里面存的值即是input
框上面绑定的value
接着是radio(单选框)
<script>
const app = Vue.createApp({
data () {
return {
message: ''
}
},
template: `
<div>{{message}}</div>
apple <input type="radio" v-model="message" value="apple" />
orange <input type="radio" v-model="message" value="orange" />
peach <input type="radio" v-model="message" value="peach" />
`
})
const vm = app.mount('#root');
</script>
注意:message
是一个空字符串,因为radio
是单选框,只需要存放一个数据,所以用字符串就可以了
最后是select
<script>
const app = Vue.createApp({
data () {
return {
message: '',
options: [
{
text: 'A',
value: 'A'
}, {
text: 'B',
value: 'B'
}, {
text: 'C',
value: 'C'
}
]
}
},
template: `
<div>
{{message}}
<select v-model="message">
<option v-for="item in options" :value="item.value">{{item.text}}</option>
</select>
</div>
`
})
const vm = app.mount('#root');
</script>
自己看代码吧其实也没什么好说的捏,如果设置成多选就把message
改为数组,然后select
标签上加一个multiple
最最最后一点
<script>
const app = Vue.createApp({
data () {
return {
message: 'orange',
}
},
template: `
<div>
{{message}}
<input type="checkbox" v-model="message" true-value="apple" false-value="orange" />
</div>
`
})
const vm = app.mount('#root');
</script>
input
标签上可以自定义事件true-value
和false-value
还有几个修饰符
.lazy
,没有加之前,看下图
蓝色是输入框,输入框在输入内容的时候,红色区域就立即跟着改变,这样比较消耗性能,我们可以加一个.lazy
修饰符<input v-model.lazy="message" />
,当输入框失去焦点的时候,左边红色区域的内容才会更新
.number
,就是将输入的内容转换为number
类型然后再存到message
里面
<input v-model.number="message" />
.trim
,去除输入内容前后的空格
只会去除前后的空格,中间的空格是不会去除的^ ^