Appearance
表单输入绑定
本节目标:理解“表单输入绑定”的核心思路,并能把它用于实际开发或面试表达。 通过 Vue School 的免费课程了解如何处理表单输入的问题 ==#====基础用法== ==你可以用 v-model 指令在表单== ==<input>====、====<textarea>== ==及== ==<select>== ==元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但== ==v-model== ==本质上不过是语法糖。它负责监听用户的输入事件来更新数据,并在某种极端场景下进行一些特殊处理。== 提示 v-model 会忽略所有表单元素的 value、checked、selected attribute 的初始值。它将始终将当前活动实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。 ==v-model== ==在内部为不同的输入元素使用不同的 property 并抛出不同的事件:==
- ==text 和 textarea 元素使用== ==value== ==property 和== ==input== ==事件;==
- ==checkbox 和 radio 使用== ==checked== ==property 和== ==change== ==事件;==
- ==select 字段将== ==value== ==作为 prop 并将== ==change== ==作为事件。==
提示 对于需要使用输入法 (如中文、日文、韩文等) 的语言,你会发现 v-model 不会在输入法组织文字过程中得到更新。如果你也想响应这些更新,请使用 input 事件监听器和 value 绑定来替代 v-model。 ==#====文本 (Text)== <inputv-model="message"placeholder="edit me"/><p>Message is: {{ message }}</p> 1 2 ==#====多行文本 (Textarea)== <span>Multiline message is:</span><pstyle="white-space:pre-line;">{{ message }}</p><br/><textareav-model="message"placeholder="add multiple lines"></textarea> 1 2 3 4 ==插值在 textarea 中不起作用,请使用== ==v-model== ==来代替。== <!-- bad --><textarea>{{ text }}</textarea><!-- good --><textareav-model="text"></textarea> 1 2 3 4 5 ==#====复选框 (Checkbox)== ==单个复选框,绑定到布尔值:== <inputtype="checkbox"id="checkbox"v-model="checked"/><labelfor="checkbox">{{ checked }}</label> 1 2 ==多个复选框,绑定到同一个数组:== <divid="v-model-multiple-checkboxes"><inputtype="checkbox"id="jack"value="Jack"v-model="checkedNames"/><labelfor="jack">Jack</label><inputtype="checkbox"id="john"value="John"v-model="checkedNames"/><labelfor="john">John</label><inputtype="checkbox"id="mike"value="Mike"v-model="checkedNames"/><labelfor="mike">Mike</label><br/><span>Checked names: {{ checkedNames }}</span></div> 1 2 3 4 5 6 7 8 9 10 Vue.createApp({data(){return{checkedNames:[]}}}).mount('#v-model-multiple-checkboxes') 1 2 3 4 5 6 7 ==#====单选框 (Radio)== <divid="v-model-radiobutton"><inputtype="radio"id="one"value="One"v-model="picked"/><labelfor="one">One</label><br/><inputtype="radio"id="two"value="Two"v-model="picked"/><labelfor="two">Two</label><br/><span>Picked: {{ picked }}</span></div> 1 2 3 4 5 6 7 8 9 Vue.createApp({data(){return{picked:''}}}).mount('#v-model-radiobutton') 1 2 3 4 5 6 7 ==#====选择框 (Select)== ==单选时:== <divid="v-model-select"class="demo"><selectv-model="selected"><optiondisabledvalue="">Please select one</option><option>A</option><option>B</option><option>C</option></select><span>Selected: {{ selected }}</span></div> 1 2 3 4 5 6 7 8 9 Vue.createApp({data(){return{selected:''}}}).mount('#v-model-select') 1 2 3 4 5 6 7 注意 如果 v-model 表达式的初始值未能匹配任何选项,<select> 元素将被渲染为“未选中”状态。在 iOS 中,这会使用户无法选择第一个选项。因为这样的情况下,iOS 不会触发 change 事件。因此,更推荐像上面这样提供一个值为空的禁用选项。 ==多选时 (绑定到一个数组):== <selectv-model="selected"multiple><option>A</option><option>B</option><option>C</option></select><br/><span>Selected: {{ selected }}</span> 1 2 3 4 5 6 7 ==用== ==v-for== ==渲染的动态选项:== <divid="v-model-select-dynamic"class="demo"><selectv-model="selected"><optionv-for="option in options":value="option.value">{{ option.text }} </option></select><span>Selected: {{ selected }}</span></div> 1 2 3 4 5 6 7 8 Vue.createApp({data(){return{selected:'A',options:[{text:'One',value:'A'},{text:'Two',value:'B'},{text:'Three',value:'C'}]}}}).mount('#v-model-select-dynamic') 1 2 3 4 5 6 7 8 9 10 11 12 ==#====值绑定== ==对于单选按钮,复选框及选择框的选项,====v-model== ==绑定的值通常是静态字符串 (对于复选框也可以是布尔值):== <!-- 当选中时,picked 为字符串 "a" --><inputtype="radio"v-model="picked"value="a"/><!-- toggle 为 true 或 false --><inputtype="checkbox"v-model="toggle"/><!-- 当选中第一个选项时,selected 为字符串 "abc" --><selectv-model="selected"><optionvalue="abc">ABC</option></select> 1 2 3 4 5 6 7 8 9 10 ==但是有时我们可能想把值绑定到当前活动实例的一个动态 property 上,这时可以用== ==v-bind== ==实现,此外,使用== ==v-bind== ==可以将输入值绑定到非字符串。== ==#====复选框 (Checkbox)== <inputtype="checkbox"v-model="toggle"true-value="yes"false-value="no"/> 1 // 当选中时:vm.toggle ==='yes'// 当未选中时:vm.toggle ==='no' 1 2 3 4 提示 这里的 true-value 和 false-value attribute 并不会影响输入控件的 value attribute,因为浏览器在提交表单时并不会包含未被选中的复选框。如果要确保表单中这两个值中的一个能够被提交,(即“yes”或“no”),请换用单选按钮。 ==#====单选框 (Radio)== <inputtype="radio"v-model="pick"v-bind:value="a"/> 1 // 当选中时vm.pick ===vm.a 1 2 ==#====选择框选项 (Select Options)== <selectv-model="selected"><!-- 内联对象字面量 --><option:value="{ number: 123 }">123</option></select> 1 2 3 4 // 当选中时typeofvm.selected // => 'object'vm.selected.number // => 123 1 2 3 ==#====修饰符== ==#====.lazy== ==在默认情况下,====v-model== ==在每次== ==input== ==事件触发后将输入框的值与数据进行同步 (除了====上述====输入法组织文字时)。你可以添加== ==lazy== ==修饰符,从而转为在== ==change== ==事件之后进行同步:== <!-- 在“change”时而非“input”时更新 --><inputv-model.lazy="msg"/> 1 2 ==#====.number== ==如果想自动将用户的输入值转为数值类型,可以给== ==v-model== ==添加== ==number== ==修饰符:== <inputv-model.number="age"type="text"/> 1 ==当输入类型为== ==text== ==时这通常很有用。如果输入类型是== ==number====,Vue 能够自动将原始字符串转换为数字,无需为== ==v-model== ==添加== ==.number== ==修饰符。如果这个值无法被== ==parseFloat()== ==解析,则返回原始的值。== ==#====.trim== ==如果要自动过滤用户输入的首尾空白字符,可以给== ==v-model== ==添加== ==trim== ==修饰符:== <inputv-model.trim="msg"/> 1 ==#====在组件上使用== ==v-model== ==如果你还不熟悉 Vue 的组件,可以暂且跳过这里。== ==HTML 原生的输入元素类型并不总能满足需求。幸好,Vue 的组件系统允许你创建具有完全自定义行为且可复用的输入组件。这些输入组件甚至可以和== ==v-model== ==一起使用!== ==要了解更多,请参阅组件指南中的====自定义输入====组件。== > 来自 <https://v3.cn.vuejs.org/guide/forms.html#%E5%9F%BA%E7%A1%80%E7%94%A8%E6%B3%95>
