Menu
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

Vue 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: '初始文本'
      }
    }
  })
  app.mount('#app')
</script>
自己试试 »

注意:v-model 双向绑定功能实际上可以使用 v-bind:valuev-on:input 的组合来实现。

  • v-bind:value 用于从 Vue 实例数据更新输入元素,
  • v-on:input 用于从输入更新 Vue 实例数据。

v-model 更易于使用,所以我们会使用它。


动态复选框

我们在上一页的购物清单中添加了一个复选框,用于标记商品是否重要。

在复选框旁边,我们添加了一个文本,该文本始终反映当前的“重要”状态,在“true”或“false”之间动态变化。

我们使用 v-model 添加此动态复选框和文本,以改善用户交互。

我们需要:

  • 一个名为“important”的 Vue 实例数据属性中的布尔值
  • 一个复选框,用户可以在其中选中商品是否重要
  • 一个动态反馈文本,以便用户可以看到商品是否重要

以下是“重要”功能的隔离于购物清单的演示方式。

示例

复选框文本被设置为动态的,以便文本反映当前复选框输入值。

<div id="app">
  <form>
    <p>
      重要商品?
      <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>添加商品</p>
    <p>商品名称:<input type="text" required v-model="itemName"></p>
    <p>数量:<input type="number" v-model="itemNumber"></p>
    <p>
      重要?
      <label>
        <input type="checkbox" v-model="itemImportant">
        {{ important }}
      </label>
    </p>
    <button type="submit">添加商品</button>
  </form>
  <hr>
  <p>购物清单:</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: '番茄', 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>
自己试试 »

标记购物清单中的找到的商品

让我们添加功能,以便可以将添加到购物清单中的商品标记为已找到。

我们需要:

  • 使列表项对点击做出反应
  • 将点击的商品的状态更改为“found”,并使用它通过 CSS 将商品视觉上移开并删除线

我们可以创建一个包含所有需要找到的商品的列表,并在下面创建一个包含已找到商品的列表,并删除线。实际上,我们可以将所有商品放在第一个列表中,并将所有商品放在第二个列表中,并只使用 v-show 与 Vue 数据属性“found”一起定义是否在第一个或第二个列表中显示商品。

示例

在将商品添加到购物清单后,我们可以假装去购物,在找到商品后点击将其移开。如果我们误点击了商品,可以通过再次点击将商品放回“未找到”列表。

<div id="app">
  <form v-on:submit.prevent="addItem">
    <p>添加商品</p>
    <p>商品名称:<input type="text" required v-model="itemName"></p>
    <p>数量:<input type="number" v-model="itemNumber"></p>
    <p>
      重要?
      <label>
        <input type="checkbox" v-model="itemImportant">
        {{ important }}
      </label>
    </p>
    <button type="submit">添加商品</button>
  </form>

  <p><strong>购物清单:</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: '番茄', 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-modelv-show 来使表单本身动态。

我们需要:

  • 一个带有相关输入标签和“订购”按钮的表单。
  • 单选按钮,用于选择“晚餐”、“饮料”或“甜点”。
  • 选择类别后,会出现一个下拉菜单,其中包含该类别中的所有商品。
  • 选择商品后,您会看到商品的图片,您可以选择数量并将其添加到订单中。商品添加到订单后,表单将重置。

示例

此表单是动态的。它根据用户选择进行更改。用户必须先选择类别,然后选择商品和数量,然后订购按钮才会可见,用户才能订购。

自己试试 »

Vue 练习

通过练习测试自己

练习

提供正确的代码,以便防止提交时默认的浏览器刷新。

此外,提供代码,以便输入字段值与 Vue 数据实例属性“itemName”和“itemNumber”进行双向绑定。

<form v-on:="addItem">
  <p>Add item</p>
  <p>
    Item name: 
    <input type="text" required ="itemName">
  </p>
  <p>
    How many: 
    <input type="number" ="itemNumber">
  </p>
  <button type="submit">Add item</button>
</form>

开始练习



×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.