v-model
指令与普通 JavaScript 相比,在 Vue 中使用表单更容易,因为v-model
指令以相同的方式与所有类型的输入元素连接。
v-model
在输入元素之间创建链接value
Vue 实例中的属性和数据值。当您更改输入时,数据会更新;当数据更改时,输入也会更新(双向绑定)。
正如我们在上一页的购物清单示例中已经看到的,v-model
为我们提供了双向绑定,这意味着表单输入元素更新 Vue 数据实例,并且 Vue 实例数据的更改更新输入。
下面的示例还演示了双向绑定v-model
。
双向绑定:尝试在输入字段内写入以查看 Vue 数据属性值是否已更新。也可以尝试直接在代码中编写来更改 Vue 数据属性值,运行代码,看看输入字段是如何更新的。
<div id="app">
<input type="text" v-model="inpText">
<p> {{ inpText }} </p>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
inpText: 'Initial text'
}
}
})
app.mount('#app')
</script>
亲自试一试 »
笔记:这个v-model
双向绑定功能实际上可以通过组合来实现v-bind:value
和v-on:input
:
v-bind:value
从 Vue 实例数据更新输入元素,v-on:input
从输入更新 Vue 实例数据。但v-model
更容易使用,所以这就是我们要做的。
我们在上一页的购物清单中添加了一个复选框,以标记某件商品是否重要。
在复选框旁边,我们添加一个始终反映当前“重要”状态的文本,在“true”或“false”之间动态变化。
我们用v-model
添加此动态复选框和文本以改善用户交互。
我们需要:
下面是与购物清单分离的“重要”功能的外观。
复选框文本是动态的,以便文本反映当前的复选框输入值。
<div id="app">
<form>
<p>
Important item?
<label>
<input type="checkbox" v-model="important">
{{ important }}
</label>
</p>
</form>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
important: false
}
}
})
app.mount('#app')
</script>
亲自试一试 »
让我们在购物清单示例中包含此动态功能。
<div id="app">
<form v-on:submit.prevent="addItem">
<p>Add item</p>
<p>Item name: <input type="text" required v-model="itemName"></p>
<p>How many: <input type="number" v-model="itemNumber"></p>
<p>
Important?
<label>
<input type="checkbox" v-model="itemImportant">
{{ important }}
</label>
</p>
<button type="submit">Add item</button>
</form>
<hr>
<p>Shopping list:</p>
<ul>
<li v-for="item in shoppingList">{{item.name}}, {{item.number}}</li>
</ul>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
itemName: null,
itemNumber: null,
important: false,
shoppingList: [
{ name: 'Tomatoes', number: 5, important: false }
]
}
},
methods: {
addItem() {
let item = {
name: this.itemName,
number: this.itemNumber
important: this.itemImportant
}
this.shoppingList.push(item)
this.itemName = null
this.itemNumber = null
this.itemImportant = false
}
}
})
app.mount('#app')
</script>
亲自试一试 »
让我们添加功能,以便将添加到购物清单中的商品标记为已找到。
我们需要:
我们创建一个列表,其中包含我们需要查找的所有项目,下面创建一个列表,其中找到的项目已被删除。我们实际上可以将所有项目放入第一个列表中,并将所有项目放入第二个列表中,然后使用v-show
使用 Vue 数据属性 'found' 来定义是否在第一个或第二个列表中显示该项目。
将商品添加到购物清单后,我们可以假装去购物,找到商品后单击鼠标即可。如果我们错误地单击了某个项目,我们可以通过再次单击该项目将其带回“未找到”列表。
<div id="app">
<form v-on:submit.prevent="addItem">
<p>Add item</p>
<p>Item name: <input type="text" required v-model="itemName"></p>
<p>How many: <input type="number" v-model="itemNumber"></p>
<p>
Important?
<label>
<input type="checkbox" v-model="itemImportant">
{{ important }}
</label>
</p>
<button type="submit">Add item</button>
</form>
<p><strong>Shopping list:</strong></p>
<ul id="ulToFind">
<li v-for="item in shoppingList"
v-bind:class="{ impClass: item.important }"
v-on:click="item.found=!item.found"
v-show="!item.found">
{{ item.name }}, {{ item.number}}
</li>
</ul>
<ul id="ulFound">
<li v-for="item in shoppingList"
v-bind:class="{ impClass: item.important }"
v-on:click="item.found=!item.found"
v-show="item.found">
{{ item.name }}, {{ item.number}}
</li>
</ul>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
itemName: null,
itemNumber: null,
important: false,
shoppingList: [
{ name: 'Tomatoes', number: 5, important: false, found: false }
]
}
},
methods: {
addItem() {
let item = {
name: this.itemName,
number: this.itemNumber,
important: this.itemImportant,
found: false
}
this.shoppingList.push(item)
this.itemName = null
this.itemNumber = null
this.itemImportant = false
}
}
})
app.mount('#app')
</script>
亲自试一试 »
我们可以制作一个表格,供客户从菜单中订购。为了方便顾客,我们只在顾客选择点饮料后才呈现可供选择的饮料。可以说,这比一次向顾客展示菜单中的所有菜品更好。在这个例子中我们使用v-model
和v-show
使表单本身动态化。
我们需要:
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!