表单
双向绑定:data 中的属性值变了,input 里的值也变;input 里输入的值改变了,data 里对于的属性值也变<form>
里面包含 <button>
,则按回车键相当于点击了 button
<template>
<div id="app">
<form>
<div>
<input type="text" v-model="message" />
<br /><br />
<button @click.prevent="message = 1">set message to 1</button>
<p>Message is: {{ message }}</p>
</div>
</form>
</div>
</template>
<script>
export default {
data() {
return {
message: "",
};
},
};
</script>
<style lang="scss">
</style>
修饰符
.lazy
v-model
默认在每次 input
事件触发后将输入框的值与数据进行同步, lazy
修饰符改为在 change
事件后进行同步:
<!-- 在“change”时而非“input”时更新 -->
<input v-model.lazy="msg">
.number
将用户输入的值转换为 number 类型,相当于 parseFloat
<input v-model.number="age" type="number">
.trim
删除用户输入值首位的空白字符
<input v-model.trim="msg">
v-model 双向绑定原理
v-model 实际上是 v-bind:value 和 v-on:input 的语法糖
data 属性值改变 -> input 内容改变:v-bind:value
input 内容改变 -> data 属性值改变:v-on:input
<!-- 两者等价 -->
<input type="text" v-model="message" />
<input type="text" :value="message" @input="message = $event.target.value" />
手写 ,与 .sync 原理一样
MyInput.vue:
<template>
<div>
<input :value="value" @input="onInput" />
</div>
</template>
<script>
export default {
name: "MyInput",
props: {
value: "",
},
methods: {
onInput(e) {
const event = e.target.value;
this.$emit("input", event);
},
},
};
</script>
<style></style>
使用:
<MyInput type="text" v-model="message" />
<MyInput :value="message" @input="message = $event" />