Vue关于对象数组的双向数据绑定(props与watch)

这篇博客介绍了如何在Vue中实现对象数组的双向数据绑定。通过一个使用vue-cli构建的例子,展示了父组件如何通过props传递对象到子组件进行单项绑定。子组件接收props并创建数据副本,用v-model绑定,同时利用watch监听数据变化,当数据修改时通知父组件更新,实现了双向绑定的效果。作者邀请读者讨论可能存在的不足和疑问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue的数据双向绑定例子 

可以参考该网址https://www.cnblogs.com/xxcanghai/p/6124699.html

我写的这个是使用vue-cli编写的一个例子。

以下是父组件源码,绑定了一个对象然后使用props在子组件获取(此为单项绑定)。

<template>
    <div>
        <table id="person-message">
            <tr>
                <th>姓名</th>
                <th>年龄</th>
                <th>性别</th>
                <th>操作</th>
            </tr>
            
            <tr v-for="(person,index) in persons" 
                :key="person.id"
                is="sideler"
                :person="{ 
                    name:person.name,
                    age:person.age,
                    sex:person.sex,
                    isEdit:person.show,
                }"
                @edit="contentEdit"
                @remove="persons.splice(index,1)" 
                @update="updateData"
            >    
            </tr>
        </table>
    </div>
</template>

<script>
import Sideler from "./Sideler"

export default {
    name: 'bulbmain',
    components:{
        Sideler
    },
    methods:{
        contentEdit(event){
            
            if(event.target.textContent == '编辑')
            {
                event.target.textContent = '保存'
            }
            else if(event.target.textContent  == '保存')
            {
                event.target.textContent = '编辑'
            }
           
        },
        updateData(val){
            this.persons = val  //外层调用组件方注册变更方法,将组件内的数据变更,同步到组件外的数据状态中
        }
    },
    data(){
        return {
            persons:[
                {        
                    name: 'Nick',
                    age: 26,
                    sex: '男',
                    show: true
                },
                {                  
                    name: 'Nick',
                    age: 26,
                    sex: '男',
                    show: true
                },
                {                 
                    name: 'Nick',
                    age: 26,
                    sex: '男',
                    show: true
                },
                {               
                    name: 'Nick',
                    age: 26,
                    sex: '男',
                    show: true
                },
                {
                    name: 'Nick',
                    age: 26,
                    sex: '男',
                    show: true
                },
                {              
                    name: 'Nick',
                    age: 26,
                    sex: '男',
                    show: true
                },
                {                   
                    name: 'Nick',
                    age: 26,
                    sex: '男',
                    show: true
                },
            ]
        }
    }
}
</script>

<style >
#person-message{
     text-align: center;
}
#person-message th{
    width: 100px;
}
#person-message tr input{
    text-align: center;
    width: 50px;
}
</style>

以下是子组件源码:

通过props接收父组件传递过来的data,并建立一个data副本,v-model绑定了data副本,修改其中的数据并不会影响到props中传递过来的数据,所以创建一个watch对象监听子组件中data的修改并将变更向其父组件通知。由父组件修改data

<template>
    <tr>  
        <td>
            <span v-if="childData.isEdit">{{ childData.name }}</span>
            <input v-else type="text" v-model="childData.name">
        </td>
        <td>
            <span v-if="childData.isEdit">{{ childData.age }}</span>
            <input v-else type="number" v-model="childData.age">
        </td>
        <td>
            <span v-if="childData.isEdit">{{ childData.sex }}</span>
            <input v-else type="text" v-model="childData.sex">
        </td>  
        <td>
            <button @click="$emit('edit',$event,childData.isEdit = !childData.isEdit)">编辑</button>
            <button @click="$emit('remove')">删除</button>
        </td> 
    </tr>
</template>

<script>
export default {
    name: 'sideler',
    props:{
        person:{
            type: Object,
            required: true
        }
    },
    data(){
        return {
            childData: this.person  //创建props属性person的副本
        }
    },
    watch:{
        'person'(val){  
            this.childData = val  //监听外部对props属性person的变更,并同步到组件内的data属性childData中
        },
        'childData'(val){
            this.$emit('update',val)  //组件内对childData变更后向外部发送事件通知
        }
    }
}
</script>

 以上为个人的理解,如果有不足之处或者不解之处欢迎探讨。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值