Vue3手册译稿 - 基础 - 表单输入绑定

基础用法

你可以通过v-model指令创建与文本框、多行文本框以及选择框等表单输入组件的双向绑定,它会自动根据输入组件不同使用正确的绑定方式。虽然有点神奇的,但v-model本质上是用户输入控件更新数据的语法糖,对一些边界情况进行处理。

[warning]提示v-model会忽略表单单控件初始化的value,checked,selected属性。它总会将当前活动实例数据当成数据源。你应该在组件的javascript代码的data选项中定义这些初始值。

v-model内部针对不同的控件使用不同的属性和不同的事件调用方法:

  • texttextarea使用value属性,事件用input
  • checkbox,radiobutton使用checked属性,事件用change
  • select使用props传递value,事件用change

[notice]多国语言(中文、日文、韩文)等,在你可能注意到在输入过程中v-model是不更新数据的。如果你想跟踪这种更新,使用input事件监听绑定value来代替v-model。(个人感觉没有场景需要这种监听吧!)

文本框(text)

<input v-model="message" placeholder="请输入内容" />
<p>你输入的内容是: {{ message }}</p>

多行文本框(textarea)

<span>多行文本框输入的内容是:</span>
<p style="white-space: pre-line;">{{ message }}</p>
<br />
<textarea v-model="message" placeholder="输入多行内容"></textarea>

textarea中间插入文字不会工作,应该使用v-model代替

<!-- 错误 -->
<textarea>{{ text }}</textarea>

<!-- 正确 -->
<textarea v-model="text"></textarea>

复选框(checkbox)

<input type="checkbox" id="checkbox" v-model="checked" />
<label for="checkbox">{{ checked }}</label>

多个checkbox绑定到一个数组上:

<div id="v-model-multiple-checkboxes">
  <input type="checkbox" id="jack" value="Jack" v-model="checkedNames" />
  <label for="jack">Jack</label>
  <input type="checkbox" id="john" value="John" v-model="checkedNames" />
  <label for="john">John</label>
  <input type="checkbox" id="mike" value="Mike" v-model="checkedNames" />
  <label for="mike">Mike</label>
  <br />
  <span>Checked names: {{ checkedNames }}</span>
</div>
Vue.createApp({
  data() {
    return {
      checkedNames: []
    }
  }
}).mount('#v-model-multiple-checkboxes')

单选框(radio)

<div id="v-model-radiobutton">
  <input type="radio" id="one" value="One" v-model="picked" />
  <label for="one">One</label>
  <br />
  <input type="radio" id="two" value="Two" v-model="picked" />
  <label for="two">Two</label>
  <br />
  <span>Picked: {{ picked }}</span>
</div>
Vue.createApp({
  data() {
    return {
      picked: ''
    }
  }
}).mount('#v-model-radiobutton')

选择框(select)

单选选择框:

<div id="v-model-select" class="demo">
  <select v-model="selected">
    <option disabled value="">Please select one</option>
    <option>A</option>
    <option>B</option>
    <option>C</option>
  </select>
  <span>Selected: {{ selected }}</span>
</div>
Vue.createApp({
  data() {
    return {
      selected: ''
    }
  }
}).mount('#v-model-select')

[info]如果v-model与数组任何一项都没有匹配成功,<select>标签会渲染成unselected状态。IOS环境下会导致默认第一个选项是空的,因为这种情况下IOS不支持改变事件。因此推荐初始一个不可选择的空值选项。
多选选择框(绑定到数组上):

<select v-model="selected" multiple>
  <option>A</option>
  <option>B</option>
  <option>C</option>
</select>
<br />
<span>Selected: {{ selected }}</span>
Vue.createApp({
  data() {
    return {
      selected: ''
    }
  }
}).mount('#v-model-select')

使用v-for动态渲染选项:

<div id="v-model-select-dynamic" class="demo">
  <select v-model="selected">
    <option v-for="option in options" :value="option.value">
      {{ option.text }}
    </option>
  </select>
  <span>Selected: {{ selected }}</span>
</div>
Vue.createApp({
  data() {
    return {
      selected: 'A',
      options: [
        { text: 'One', value: 'A' },
        { text: 'Two', value: 'B' },
        { text: 'Three', value: 'C' }
      ]
    }
  }
}).mount('#v-model-select-dynamic')

绑定值

对于radio,checkbox,select选项,v-model绑定值默认为字符串(或checkbox使用布尔值):

<!-- `picked` 值是一个字符串,当选择后赋值`a` -->
<input type="radio" v-model="picked" value="a" />

<!-- `toggle` 的值是真或假-->
<input type="checkbox" v-model="toggle" />

<!-- `selected` 首项选中后赋值`abc` -->
<select v-model="selected">
  <option value="abc">ABC</option>
</select>

有时候我们希望为当前实例控件绑定动态的值,我们可以通过v-bind实现。另外使用v-bind允许我们绑定一个非字符串的值。

checkbox

<input type="checkbox" v-model="toggle" true-value="yes" false-value="no" />
// checked:
vm.toggle === 'yes'
// unchecked:
vm.toggle === 'no'

[info]true-value,false-value并不影响控件的输入value属性,因为浏览器并不会把未选中的选项在表单中提交。如果想确保两个值只会提交一个(yes 或 no),应该使用radio控件。

radio

<input type="radio" v-model="pick" v-bind:value="a" />
// when checked:
vm.pick === vm.a

select 选项

<select v-model="selected">
  <!-- 内联对象 -->
  <option :value="{ number: 123 }">123</option>
</select>
// selected:
typeof vm.selected // => 'object'
vm.selected.number // => 123

修饰符

.layz

默认v-model同步输入框内容变化同步更改数据(中日韩等输入法除外)。你可以添加.lazy修饰符替代同步更新为change事件之后。

<!-- 在 "change" 更新而非 "input" -->
<input v-model.lazy="msg" />

.number

如果你想将用户输入自动转换为数值型,在v-model添加添加.number修饰符管理用户输入:

<input v-model.number="age" type="number" />

有时这很有用,因为即使为文本框添加了type="number",仍然可能返回一个字符串。如果输入值可以转换为parseFloat(),将原值返回。

.trim

自动删除前后空格。

<input v-model.trim="msg" />

组件使用v-model

[info]如果对组件不熟悉,请先跳过。

HTML自带的组件经常满足不了实际需求,幸运的是Vue可以在可复用的自定文本框上使用v-model并拥有完整的自定义行为。查阅组件手册中自定义输入组件学习更多!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Vue3中,可以使用v-model指令来绑定表单元素,例如input、textarea和select等。在表单元素上使用v-model指令,可以将表单元素的值与Vue实例中的数据进行双向绑定。 例如,我们可以在Vue组件中使用以下代码来绑定一个input元素: ``` <template> <div> <form> <label for="name">姓名:</label> <input type="text" id="name" v-model="name"> </form> </div> </template> <script> export default { data() { return { name: '' } } } </script> ``` 在上面的代码中,我们使用v-model指令将input元素的值与Vue实例中的name属性进行双向绑定。当用户在input元素中输入内容时,Vue实例中的name属性也会随之更新。反之,当Vue实例中的name属性发生变化时,input元素的值也会随之更新。 需要注意的是,在Vue3中,v-model指令的默认行为已经发生了变化。在Vue2中,v-model指令默认会将表单元素的value属性与Vue实例中的数据进行双向绑定。但在Vue3中,v-model指令默认会将表单元素的modelValue属性与Vue实例中的数据进行双向绑定。因此,在使用v-model指令时,需要根据表单元素的类型和属性进行相应的配置。例如,对于checkbox和radio表单元素,需要使用:checked和:value等属性来进行绑定。 ### 回答2: 在Vue 3中,v-model绑定form表单变得更加灵活和易用。使用v-model,可以实现双向绑定,也就是说,当用户在表单输入内容时,表单的值会自动更新到Vue实例中的数据,反之亦然。以下是在Vue 3中绑定form表单的步骤: 1. 在data选项中定义表单中的数据属性。例如,您可以定义一个名为“formData”的对象,其中包含表单中所有输入字段的值。 2. 使用v-model指令将数据属性绑定表单输入组件上。例如,您可以在文本框中使用“v-model = 'formData.username'”将formData对象中的“username”属性与文本框值绑定。 3. 当用户在表单输入内容时,v-model指令会自动更新formData对象中相应的属性值。 4. 如果您还需要在表单提交时执行自定义操作,可以使用@submit事件监听表单提交事件,并在事件处理程序中执行所需的操作。 以下是一个简单的注册表单的示例代码: ``` <template> <form v-on:submit.prevent="onSubmit"> <div> <label for="username">用户名:</label> <input type="text" id="username" v-model="formData.username" /> </div> <div> <label for="password">密码:</label> <input type="password" id="password" v-model="formData.password" /> </div> <button type="submit">注册</button> </form> </template> <script> export default { data() { return { formData: { username: '', password: '', }, }; }, methods: { onSubmit() { // 执行表单提交操作 console.log(this.formData); }, }, }; </script> ``` 在上面的示例中,formData对象用于存储输入字段的值,v-model指令将formData对象中的属性与输入字段值绑定一起,@submit事件监听表单提交事件,并在事件处理程序中输出formData对象的值。 ### 回答3: Vue3中v-model绑定form表单,与Vue2有所不同,Vue3使用了Composition API。处理表单数据的方式也更加智能化,灵活性更高。下面是具体解析: 1. V-model的使用方式 在Vue3中,我们可以使用v-model实现数据的双向绑定。与Vue2相比,Vue3的v-model使用方式有所改变,我们不再传递一个value和update事件,而是使用一个ModelValue对象。同时,在定义组件时,需使用.emits属性指定自定义组件可触发的事件列表。在composition API中也提供了一个useModel函数,可以方便地定义双向绑定数据。 2. Form表单数据的处理 在Vue2中,我们一般使用v-model绑定form表单,通过@submit事件提交form表单数据。在Vue3中,我们可以使用v-model绑定表单元素,然后通过watch监听表单元素的变化。当表单元素发生变化时,watch函数可以自动更新数据。在提交表单时,我们可以直接使用ref获取表单数据,然后通过AJAX请求来提交数据。 3. 使用响应式对象管理表单数据 在Vue3中,我们可以使用reactive对象来管理表单数据,使表单数据变为响应式的。这样,在表单元素发生变化时,实时更新表单数据。同时,我们还可以使用toRefs函数将响应式对象转化为可响应的对象,使得更新表单数据时,可以自动更新视图。 4. 借助第三方组件库优化表单的处理 Vue3的组合式API让我们可以方便地封装逻辑,将表单数据的处理功能封装为一个能够重复使用的组件。借助第三方组件库,如ElementUI或Ant Design Vue等,我们可以在项目中快速地搭建出完备、效果优美的表单组件,进一步提高开发效率。 总之,Vue3中v-model绑定form表单,可以处理表单数据的方式更加智能化,操作灵活性更高。结合响应式对象等特性,我们可以更快地搭建出效率高、可复用的表单组件,减少开发成本和工作量,提高生产力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值