获取表单输入的值方式:
手动连接值绑定和更改事件监听器
v-model 指令 (常用)
<script?lang="ts"?setup>
import?{?ref?}?from?"vue"
//?定义个变量接收输入的内容:
const?text?=?ref("111")
const?text2?=?ref("222")
</script>
<template>
????<div?class="container">
????????<section>
????????????<!--?输入内容通过事件绑定值:?-->
????????????<p>默认的value是?111</p>
????????????<input?:value="text"?@input="event?=>?text?=?event?.target?.value"?/>
????????????<div>这是输入的值{{?text?}}</div>
????????</section>
????????<section>
????????????<!--?v-model?指令帮我们简化了这一步骤?-->
????????????<p>默认的value是?222</p>
????????????<input?v-model="text2"?value="888">
????????????<div>这是输入的值{{?text2?}}</div>
????????</section>
????</div>
</template>
<style?lang="scss"?scoped>
.container?{
????section?{
????????margin-bottom:?20px;
????}
}
</style>
示例:
v-model 还可以用于各种不同类型的输入元素。它会根据所使用的元素自动使用对应的 DOM 属性和事件组合
表单类型 | 绑定属性值 | 绑定事件 |
---|---|---|
input | value | input |
textarea | value | input |
checkbox | checked | change |
radio | checked | change |
select | value | change |
v-model 会忽略任何表单元素上初始的 value、checked 或 selected attribute。它将始终将当前绑定的 JavaScript 状态视为数据的正确来源。
比如下面 888 值不显示 无效的
<input?v-model="text2"?value="888">
文本
多行文本
复选框
单选按钮
选择器
<script?lang="ts"?setup>
import?{?ref?}?from?"vue"
//?定义个变量接收输入的内容:
const?f1?=?ref("f1的默认值")
const?f2?=?ref("f2的默认值")
const?f3?=?ref(true)
const?f4?=?ref([])
const?f5?=?ref('女')
const?f6?=?ref('深圳')
</script>
<template>
????<div?class="container">
????????<section>
????????????<p>input输入框</p>
????????????<p>f1的值是:?{{?f1?}}</p>
????????????<input?v-model="f1"?placeholder="请输入"?/>
????????</section>
????????<section>
????????????<p>多行文本</p>
????????????<!--?错误?-->
????????????<!--?<textarea>{{?text?}}</textarea>?-->
????????????<p>f2的值是:?{{?f2?}}</p>
????????????<!--?正确?-->
????????????<textarea?v-model="f2"?rows="3"></textarea>
????????</section>
????????<section>
????????????<p>复选框</p>
????????????<p>单个</p>
????????????<input?type="checkbox"?id="checkbox"?v-model="f3"?/>?<label?for="checkbox">统一协议</label>
????????????<br>
????????????<label?for="checkbox">f3的值是:{{?f3?}}</label>
????????????<br>
????????????<br>
????????????<p>多个</p>
????????????<input?type="checkbox"?id="h1"?value="篮球"?v-model="f4"?/>?<label?for="h1">篮球</label>
????????????<input?type="checkbox"?id="h2"?value="足球"?v-model="f4"?/>?<label?for="h2">足球</label>
????????????<input?type="checkbox"?id="h3"?value="排球"?v-model="f4"?/>?<label?for="h3">兵乓球</label>
????????????<br>
????????????<label?for="checkbox">f4的值是:{{?f4?}}</label>
????????</section>
????????<section>
????????????<p>单选按钮</p>
????????????<p>f5的值是:?{{?f5?}}</p>
????????????<input?type="radio"?id="one"?value="男"?v-model="f5"?/>
????????????<label?for="one">男</label>
????????????<input?type="radio"?id="two"?value="女"?v-model="f5"?/>
????????????<label?for="two">女</label>
????????</section>
????????<section>
????????????选择器
????????????<div>f6的值是?:?{{?f6?}}</div>
????????????<select?v-model="f6"?multiple>
????????????????<option?disabled?value="">请选择一个你喜欢的城市</option>
????????????????<option>北京</option>
????????????????<option>上海</option>
????????????????<option>深圳</option>
????????????????<option>广州</option>
????????????</select>
????????</section>
????</div>
</template>
<style?lang="scss"?scoped>
.container?{
????section?{
????????margin-bottom:?20px;
????}
????label?{
????????margin-right:?10px;
????}
????select?{
????????margin:?20px;
????????padding:?20px;
????}
}
</style>
示例:
<input
??type="checkbox"
??v-model="toggle"
??true-value="yes"
??false-value="no"?/>
??//?动态渲染
<input
??type="checkbox"
??v-model="toggle"
??:true-value="dynamicTrueValue"
??:false-value="dynamicFalseValue"?/>
true-value 和 false-value 是 Vue 特有的 attributes,仅支持和 v-model 配套使用。
这里 toggle 属性的值会在选中时被设为 'yes',取消选择时设为 'no'。你同样可以通过 v-bind 将其绑定为其他动态值:
...
...
const?selected?=?ref({?number:?111?})
...
...
<section>
?????<p>selected?的值是:{{?selected?}}</p>
?????<select?v-model="selected">
?????????<!--?内联对象字面量?-->
?????????<option?:value="{?number:?111?}">111</option>
?????????<option?:value="{?number:?222?}">222</option>
?????</select>
?</section>
示例:
.lazy 每次 change 事件后更新数据 (节流)
.number 用户输入自动转换为数字
.trim 自动去除用户输入内容中两端的空格
<!--?在?"change"?事件后同步更新而不是?"input"?-->
<input?v-model.lazy="msg"?/>
<input?v-model.number="age"?/>
<input?v-model.trim="msg"?/>