Vue3-表单输入绑定

基础用法

v-model 指令用于在表单的 、 及 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。

v-model 本质上是语法糖。它负责监听用户的输入事件来更新数据,并在某种极端场景下进行一些特殊处理。

v-model 会忽略所有表单元素的 value、checked、selected 属性的初始值而总是将当前活动实例的数据作为数据来源。我们要在组件的 data 选项中声明表单的初始值。

v-model 在内部为不同的输入元素使用不同的属性并抛出不同的事件:

  • text 和 textarea 元素使用 value 属性和 input 事件;
  • checkbox 和 radio 使用 checked 属性和 change 事件;
  • select 使用 value 属性和 change 事件。

v-model 不会在输入法组织文字过程中实时响应。如果你想响应这些动作,请使用 input 事件监听器和 value 绑定,而不是使用 v-model。

文本(Text)

<input v-model="message" placeholder="edit me" />   //数据绑定
<p>Message is: {{ message }}</p>         // 数据展示

多行文本 (Textarea)

在textarea标签中,插值语法不起作用,要使用 v-model 。

<span>Multiline message is:</span>
<p style="white-space: pre-line;">{{ message }}</p>
<br />
<textarea v-model="message" placeholder="add multiple lines"></textarea>
<!-- 错误 -->
<textarea>{{ text }}</textarea>

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

复选框 (Checkbox)

单个复选框, 绑定到布尔值

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

多个复选框,绑定到同一个数组(将选中的数据添加到一个数组中):

<div
        id="app"
    >
        <input type="checkbox" id="jack" value="Jack" v-model="checkNames"/>
        <label for="jack">jack</label>

        <input type="checkbox" id="Mike" value="Mike" v-model="checkNames"/>
        <label for="Mike">Mike</label>

        <input type="checkbox" id="John" value="John" v-model="checkNames"/>
        <label for="jack">John</label>
        <br />
        <span>
            Checkednames: {{checkNames}}
        </span>
    </div>
const app = Vue.createApp({
     data(){
         return {
             checkNames: [
                1, 2, 3, 4, 5
             ],
         }
     }
 })
 app.mount("#app")

单选框

<div
        id="app"
    >
        <input
            type="radio" id="one" value="one" v-model="picked"
        />

        <label
        for="one"
        >one</label>

        <br/>

        <span>
            Picked: {{picked}}
        </span>
    </div>
const app = Vue.createApp({
   data(){
        return {
            picked: ""
        }
    }
})

app.mount("#app")

选择框(select)

<div
  id="app"
  >
      <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>
 const app = Vue.createApp({
    data(){
        return {
            selected: ''
        }
    }
})

app.mount('#app')

单选的下拉选择框, 选择完成之后通过双向联动修改指定位置数据.

如果 v-model 表达式的初始值未能匹配任何选项, 元素将被渲染为“未选中”状态。因此,更推荐像上面这样提供一个值为空的禁用选项。

多选时 (绑定到一个数组), 结合v-for 渲染的动态选项:

<div id="app" class="demo">
    <select v-model="selected">
        <option v-for="option in options" :value="option.value">
            {{option.text}}
        </option>
    </select>

    <span>Selected: {{selected}}</span>
</div>
const app = Vue.createApp({
     data(){
         return {
             selected: "A1",
             options: [
                 {text: "A", value: "A1"},
                 {text: "B", value: "B1"},
                 {text: "C", value: "C1"},
                 {text: "D", value: "D1"},
             ]
         }
     }
 })
 app.mount("#app")

值绑定

对于单选按钮,复选框及选择框的选项,v-model 绑定的值通常是静态字符串 (对于复选框也可以是布尔值):

<!-- 当选中时,`picked` 为字符串 "a" -->
<input type="radio" v-model="picked" value="a" />

<!-- `toggle` 为 true 或 false -->
<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" />

// 选中时:
//vm.toggle === 'yes'
// 未选中时:
//vm.toggle === 'no'

单选框 (Radio)

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

// 当选中时
// vm.pick === vm.a

选择框选项 (Select Options)

<select v-model="selected">
  <!-- 内联对象字面量 -->
  <option :value="{ number: 123 }">123</option>
</select>

// 当被选中时
//typeof vm.selected // => 'object'
// vm.selected.number // => 123

修饰符

.lazy

在默认情况下, v-model 在每次 input 事件触发后将输入框的值与数据进行同步 。
我们可以添加 lazy 修饰符,从而转为在 change 事件_之后_进行同步:

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

.number

如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符

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

这很有用,因为即使在 type=“number” 时,HTML 输入元素的值也总会返回字符串。如果这个值无法被 parseFloat() 解析,则会返回原始的值。

.trim

如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符:

<input v-model.trim="msg" />
  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值