Vue第一部分(4):表单的双向数据绑定:v-model指令

v-model简介

之前数据绑定都是单向绑定,数据影响了视图渲染,但是反过来就不行(视图的变化不会影响模型数据),而对于表单中的控件而言,我们需要数据的绑定是双向的,即:模型数据的变化会影响视图,同时视图发生变化也会同步到模型数据。

接下来学习的v-model是双向绑定,视图(View)和模型(Model)之间会互相影响。既然是双向绑定,一定是在视图中可以修改数据的组件,这样就限定了视图的元素类型。

目前v-model的可使用元素有:

input        radio        checkbox        select        textarea        components(Vue中的自定义组件)

基本上除了最后一项,其它都是表单的输入项。 首先我们先看一个简单的示例:

<div id="app">
    <form action="">
        姓名: <input type="text" name="name" v-model="person.name"> <br>
        性别: <input type="radio" name="sex" value="1" v-model="person.sex"> 男
        <input type="radio" name="sex" value="0" v-model="person.sex"> 女 <br>
        爱好:<input type="checkbox" name="favorites" value="0" v-model="person.favorites"> 唱
        <input type="checkbox" name="favorites" value="1" v-model="person.favorites"> 跳
        <input type="checkbox" name="favorites" value="2" v-model="person.favorites"> Rap
        <input type="checkbox" name="favorites" value="3" v-model="person.favorites"> 打篮球 <br>
        学历:<select name="education" v-model="person.education">
        <option value="0">小学</option>
        <option value="1">中学</option>
        <option value="2">大学</option>
        <option value="3">Java练习生</option> 
        </select> <br>
        个性签名: <textarea name="signature" v-model="person.signature" cols="30" rows="10"></textarea> <br>
        <input type="submit" value="提交">
    </form>
    <hr>
    <button @click="updatePerson">点我修改person改变表单</button>
    <button @click="getPerson">点我获取表单同步后的person</button>
</div>
<script>
    const vm = new Vue({
        el:"#app",
        data:{
            person:{}
        },
        methods:{
            updatePerson(){
                this.person = {
                    name:"xiaohei",
                    sex:1,
                    favorites:[0,1,2,3],
                    education:3,
                    signature:"小黑不是一般的黑"
                };
            },
            getPerson(){
                console.log(this.person);
            }
        }
    })
</script>
  • inputtextarea 默认对应是字符串

  • radio对应的input的value值是预先定义好的,model中对应的值匹配哪个就选中哪个

  • 多个 checkbox 对应的类型是一个数组

  • select 根据option子元素的value属性进行匹配选择

实战案例

 

<div id="app">
        <form action="" @submit.prevent="addNewTodo">
            Add a todo
            <input type="text" v-model="newTodoText">
            <button type="submit">Add</button>
        </form>

         <ul v-if="todos.length > 0">
            <li v-for="(todo,index) in todos">{{todo}} <button @click="removeTodo(index)">Remove</button></li>
        </ul>
        <h4 v-else>
            当前没有待办事项
        </h4>
    </div>

    <script>
        const vm = new Vue({
            el:"#app",
            data:{
                newTodoText:"",
                todos:[]
            },
            methods:{
                addNewTodo(){
                    if(this.newTodoText.trim().length > 0){
                        this.todos.push(this.newTodoText);
                        this.newTodoText="";
                    }
                },
                removeTodo(index){
                    //从指定下标开始,删除1个元素
                    this.todos.splice(index,1);
                }
            }
        })
    </script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值