一、事件处理
在 Vue 3 中,事件处理是组件间通信的重要机制。Vue 提供了 v-on
指令(或其缩写 @
)来监听 DOM 事件,并在事件触发时执行特定的 JavaScript 代码。以下是 Vue 3 事件处理的详细说明:
1、基本用法
使用 v-on
或 @
监听事件,并指定一个方法来处理事件:
<script setup>
import { ref } from 'vue'const message = ref(true)
function handleClick() {message.value = !message.value
}</script><template><button @click="handleClick">Click me </button><p> {{message}}</p>
</template>
在这个例子中,当按钮被点击时,handleClick
方法将被调用。
2、事件修饰符
在 Vue.js 中,事件修饰符是用来修改事件监听器的行为的的特殊后缀,可以添加到 v-on
或 @
指令的参数中。这些修饰符为事件处理提供了更多的控制,以下是 Vue 3 中常用的事件修饰符及其作用:
.stop
阻止事件冒泡。这意味着事件将不会继续传播到父元素。
<script setup>
import { ref } from 'vue'const parent = ref(true)
const Button = ref(true)function handleDivClick() {parent.value = !parent.value}function handleButtonClick() {Button.value = !Button.value
}</script><template><div @click="handleDivClick"><button @click.stop="handleButtonClick">Click me</button><p>{{"handleDivClick:" + parent }}</p><p>{{"handleButtonClick:" + Button}}</p></div></template>
在这个例子中,点击按钮时,handleDivClick
不会被触发,而handleButtonClick
会被触发, 因为 .stop
修饰符阻止了事件冒泡。
.prevent
阻止事件的默认行为。例如,阻止表单提交或链接跳转。
<template><form @submit.prevent="handleSubmit"><input type="submit" value="Submit"></form>
</template><script>
import { defineComponent } from 'vue';export default defineComponent({setup() {function handleSubmit() {console.log('Form submitted without actual submit');}return {handleSubmit};}
});
</script>
在这个例子中,点击提交按钮时,表单不会实际提交,因为 .prevent
修饰符阻止了默认行为。
.capture
:使用事件捕获模式而不是冒泡模式。.self
:仅当事件在该元素本身触发时才触发处理函数。.once
:事件处理函数只执行一次。
3、按键修饰符
在 Vue.js 中,按键修饰符是用来监听特定的键盘事件,并在用户按下特定键时触发相应的处理函数。这些修饰符可以让你指定一个键或一组键来触发事件处理器。
基本用法
Vue 为 v-on
或 @
指令提供了一些内置的按键修饰符,例如 .enter
、.tab
、.delete
(捕获“删除”和“退格”键)、.esc
、.space
、.up
、.down
、.left
、.right
等。
<script setup>
import { ref } from 'vue'const EnterKey = ref(true)
const TabKey = ref(true)
const EscKey = ref(true)
const DeleteKey = ref(true)const SpaceKey = ref(true)function handleEnter() {EnterKey.value = !EnterKey.value;}function handleTab() {TabKey.value = !TabKey.value;}function handleDelete() {DeleteKey.value = !DeleteKey.value;}function handleEsc() {EscKey.value = !EscKey.value;}function handleSpace() {SpaceKey.value = !SpaceKey.value;}</script><template><input @keyup.enter="handleEnter" /><input @keydown.tab="handleTab" /><input @keyup.delete="handleDelete" /><input @keyup.esc="handleEsc" /><input @keyup.space="handleSpace" /><p>{{"handleEnter:" + EnterKey }}</p><p>{{"handleTab:" + TabKey }}</p><p>{{"handleDelete:" + DeleteKey }}</p><p>{{"handleEsc:" + EscKey }}</p><p>{{"handleSpace:" + SpaceKey }}</p></template>
在这个例子中,每个 input
元素都监听了不同的键盘事件,并在用户按下相应的键时触发了对应的处理函数。
4、鼠标按键修饰符
Vue 提供了鼠标按键修饰符,允许你监听特定的鼠标按钮事件。
.left
:监听鼠标左键点击事件。.right
:监听鼠标右键点击事件。.middle
:监听鼠标中键点击事件。
<script setup>import { ref } from 'vue'let keyLeftname =ref('1');function onClickLeft() {keyLeftname.value= `onClickLeft`
}function onClickRight() {keyLeftname.value= `onClickRight`
}function onClickMiddle() {keyLeftname.value= `onClickMiddle`
}</script><template><button @click.left="onClickLeft">Left click me</button><button @click.right="onClickRight">Right click me</button><button @click.middle="onClickMiddle">Middle click me</button><p>{{"onClickLeft:" + keyLeftname }}</p></template>
系统按键修饰符
你可以使用以下系统按键修饰符来触发鼠标或键盘事件监听器,只有当按键被按下时才会触发。
.ctrl
.alt
.shift
.meta
<!-- Alt + Enter -->
<input @keyup.alt.enter="clear" /><!-- Ctrl + 点击 -->
<div @click.ctrl="doSomething">Do something</div>
二、表单输入绑定
v-model
是 Vue.js 中的一个指令,用于在表单输入和应用状态之间创建双向数据绑定。它不仅简化了数据绑定的过程,还自动处理了用户输入的更新。
1、文本输入
对于 <input>
、<textarea>
和 <select>
元素,v-model
可以创建一个响应式的值,当用户输入时自动更新。
<script setup>import { ref } from 'vue'const message = ref('');</script><template><input v-model="message" placeholder="Edit me" /><p>Message is: {{ message }}</p>
</template>
在这个例子中,message
是一个响应式引用,它会在用户输入时自动更新。
2、多行文本
对于 <textarea>
,v-model
同样适用。
<script setup>import { ref } from 'vue'
const message = ref('');</script><template><textarea v-model="message" placeholder="Type something..."></textarea><p>Message is: {{ message }}</p></template>
3、选择框
对于 <select>
元素,v-model
会更新所选选项的值。
<script setup>import { ref } from 'vue'const selected = ref('');</script><template><select v-model="selected"><option disabled value="">Please choose an option</option><option>Option 1</option><option>Option 2</option><option>Option 3</option></select><p>Selected: {{ selected }}</p></template>
4 、单选按钮
对于单选按钮 <input type="radio">
,v-model
会更新选中的值。
<script setup>import { ref } from 'vue'const picked = ref('one');</script><template><input type="radio" v-model="picked" value="one"> One<input type="radio" v-model="picked" value="two"> Two<p>Picked: {{ picked }}</p>
</template>
5、复选框
对于复选框 <input type="checkbox">
,v-model
可以绑定到一个数组或一个布尔值。
<script setup>import { ref } from 'vue'const checked = ref(false);</script><template><input type="checkbox" v-model="checked"> Check me<p>Checked: {{ checked }}</p>
</template>
6、修饰符
v-model
可以接受修饰符来改变其行为:
.lazy
:代替input
事件,使用change
事件来更新数据。.number
:将用户的输入转换为数值类型。.trim
:去除用户输入的首尾空白。
<script setup>import { ref } from 'vue'const msg = ref('');const age = ref(0);</script><template><input v-model.lazy="msg" debounce="300"><input v-model.number="age"><input v-model.trim="msg">
</template>