我们在Vue中绑定表单输入数据主要有两种方法:事件监听和v-model
事件监听
1 2
| <h1>{{ msg }}</h1> <input type="text" @input="handleInput" id="msg" />
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| const app = Vue.createApp({ data() { return { msg: "", }; }, methods: { handleInput(event) { this.msg = event.target.value; }, }, }); app.mount("#app");
|
在这个示例中,我们定义了一个handleInput
方法,@input
即监听输入事件,vue能访问JS原生的事件对象指向值即用event.target.value
,要想在页面中使用需要保存到data
中。
v-model
改写上面的示例代码
1 2 3
| <h1>{{ msg }}</h1> <input type="text" v-model="msg" id="msg" /> <button @click="reset">重置</button>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const app = Vue.createApp({ data() { return { msg: "", }; }, methods: { reset(){ this.msg = ""; } }, }); app.mount("#app");
|
我们添加一个重置方法,当我们点击按钮的时候,我们会发现div和输入框里的值都被清空了,实现了数据的双向绑定(即输入框的数据和data中的msg绑定,两者只要有一个更新,另一个也会更新)
绑定单选框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <div id="app"> <input type="radio" v-model="picked" value="html"> <label>html</label> <input type="radio" v-model="picked" value="css"> <label>css</label> <input type="radio" v-model="picked" value="javascript"> <label>javascript</label> <p>你选择的是:{{picked}}</p> </div> <script> const app = Vue.createApp({ data() { return { picked: '' } } }).mount('#app') </script>
|
要注意的是v-model 绑定的是value的值
绑定多选框
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <div id="app"> <input type="checkbox" v-model="picked" value="html"> <label>html</label> <input type="checkbox" v-model="picked" value="css"> <label>css</label> <input type="checkbox" v-model="picked" value="javascript"> <label>javascript</label> <p>你选择的是:{{picked}}</p> </div> <script> const app = Vue.createApp({ data() { return { picked: [] } } }).mount('#app') </script>
|
未配置value v-model绑定的是checked
配置value v-model初始值为非数组 v-model绑定的是checked
配置value v-model初始值为数组 v-model绑定的是value
在vue中还有一种方法,设置元素的true-value
和 false-value
属性,在选中时v-model
绑定的数据会被设为true-value
的值,取消选择则为false-value
1 2 3 4 5
| <input type="checkbox" v-model="toggle" true-value="yes" false-value="no" />
|
绑定下拉列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <div id="app"> <select v-model="selected"> <option v-for="item in option" :value="item.value">{{item.text}}</option> </select> <p>你选择的是:{{selected}}</p> </div> <script> const app = Vue.createApp({ data() { return { selected: '', option: [ { value: 'html', text: 'html' }, { value: 'css', text: 'css' }, { value: 'javascript', text: 'javascript' } ] }
} }).mount('#app') </script>
|
这里选项用了v-for
进行动态渲染,如果选项可多选,selected需为一个数组
v-model的修饰符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <div id="app"> <input type="text" v-model.lazy="text1"> <input type="text" v-model.number="text2"> <input type="text" v-model.trim="text3"> <p>你输入的是:{{text1}}</p> <p>你输入的是:{{text2}}</p> <p>你输入的是:{{text3}}</p> </div> <script> const app = Vue.createApp({ data() { return { text1: '', text2: '', text3: '' } } }).mount('#app') </script>
|