27. Using the Native Event Object - daniel-qa/Vue GitHub Wiki
我们可以用v-on添加一个事件监听器,
当然, 我现在不想监听 click 事件, 而是监听每个击键。
我们可以像使用 keyup 或 keydown 那样来实现, 它们都有自己的特殊行为。
在输入HTML元素上监听的最佳事件是 input 事件。
这是输入元素上可用的默认Dom事件, 与Vue无关。
现在, 我们可以在这些双引号之间指定代码,
当输入事件被允许时, 这些代码应该执行, 这将是每次击键的情况。
JavaScript中有一个很酷的行为, 而Vue中没有, Vue也可以使用它。
当您加入事件侦听程式, 然后指向该事件发生时应该执行的函数时。
该函数将自动获取一个参数。
浏览器将确保提供此参数。
例如, 它将给予发生此事件的HTML元素的信息, 即input元素。
setName(event) {
this.name = event.targe.value;
},
这使我们可以访问发生事件的元素。
按 F12 觀察
现在, 这些是实际上在屏幕上重新呈现的部分。
您可以看到, 只有代码中真正更改的部分才会重新呈现在屏幕上,
这一点很重要。
如果 Vue会更新整个屏幕,
那么每当某个地方发生变化时, 这将不利于性能。
相反,
Vue 非常聪明, 它看到这里的每一次击键, 只有名字会改变。
因此, 我们保存了性能或获得了更好的性能
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vue Basics</title>
<link href="https://fonts.googleapis.com/css2?family=Jost:wght@400;700&display=swap"
rel="stylesheet" />
<link rel="stylesheet" href="styles.css" />
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script src="app.js" defer></script>
</head>
<body>
<header>
<h1>Vue Events</h1>
</header>
<section id="events">
<h2>Events in Action</h2>
<button v-on:click="add(10)">Add 10</button>
<button v-on:click="reduce(5)">Reduce 5</button>
<p>Result: {{ counter }}</p>
<input type="text" v-on:input="setName">
<p>Your Name: {{ name }}</p>
</section>
</body>
</html>
app.js
const app = Vue.createApp({
data() {
return {
counter: 0,
name: ''
};
},
methods: {
setName(event) {
this.name = event.target.value;
},
add(sum){
this.counter = this.counter + sum;
},
reduce(sum) {
this.counter = this.counter - sum;
}
}
});
app.mount('#events');
假设您有一个表单HTML元素,
其中有一些输入, 还有一个按钮, 显示“注册”等内容,
即使它位于 Vue控制的HTML部分中, 当您单击此按钮时, 此页面将重新加载!!。
原因是浏览器默认的表单按钮是提交表单并向服务器发送HTTP请求。
<form>
<input type="text">
<button>Sign Up</button>
</form>
当然, 现在我们还没有适当的代码来处理这个请求。
我们将在本课程的稍后部分讨论这一点, 但通常对于Vue等框架, 您希望阻止此浏览器默认设置,
而是希望借助Vue应用程序中的Vue在JavaScript中手动处理此问题, 您希望读取用户输入, 验证它, 然后将其手动发送到后端服务器并存储在数据库中,
所以你想阻止浏览器默认的自动发送。
现在, 有两种方法可以做到。
您可以在这里侦听 submit 事件, 它也是一个默认的浏览器事件,
现在, 问题是我们仍然使用浏览器默认设置。
如果我点击这个,
我会收到警告, 但是页面会重新加载, 当页面重新加载时,
这意味着我们会丢失所有的数据, 对吗?
如果我在这里有一个计数器, 我点击注册, 你会看到所有的数据都丢失了, 因为页面重新加载,
<form v-on:submit="submitForm">
<input type="text">
<button>Sign Up</button>
</form>
methods: {
submitForm() {
alert('Submitted!');
},
...
我们也可以调用 prevent default。
这将告诉浏览器不应该提交表单, 我们不需要该浏览器的默认值。
现在,
如果我重新加载, 我可以更改计数器, 单击“注册”,
我们会看到警报, 计数器仍然存在, 因为现在已阻止了浏览器默认设置。
methods: {
submitForm(event) {
event.preventDefault();
alert('Submitted!');
},
vue 有一個更聰明的做法,可以更節省時間
<form v-on:submit.prevent="submitForm">
但是如果你想让它对右键点击做出反应, 我们也可以在这里添加一个修饰符。
<button v-on:click.right="reduce(5)">Subtract 5</button>
这告诉Vue,在这里, 你只想对右键单击做出反应。
- 監聽 input 上的 keyup, 這裡是監聽 enter
要按下 enter 後,才會被監聽到,進行渲染
<input type="text" v-on:input="setName" v-on:keyup.enter="confirmInput">
<p>Your Name: {{ confirmedName }}</p>
methods: {
confirmInput() {
this.confirmedName = this.name;
},
- v-once
这告诉Vue,
任何动态数据绑定, 比如这个元素上的插值, 都只应该计算一次。
因此, 如果数据值在此之后发生变化, 在此处,
它将不会反映出来, 也不会更新。
<p v-once>Start Counter : {{ counter }}</p>