vue watch() 数组中的对象,获取变化的对象,请教

const arr = [ {},{},{},{}]
vue  watch()   可以监听到变化
问题:  我只想取到发生变化的对象,  而非整个arr

当然我可以先copy一下,再遍历对比,拿到 发生改变的对象
或者也可以, 记录每个操作
但感觉有点....

要怎么样才可以更简单,更好看地 完成这任务



这是我现在的写法

watch(() => groupStore.value.member_list, (newValue) => {
    memberChange.add = []
    memberChange.del = []
    memberChange.change = []
    allowReset.value = !_.isEqual(copyMemberList, groupStore.value.member_list)
    for (let i of copyMemberList) {
        const del = newValue.every(item => item.username !== i.username)
        if (del) { memberChange.del.push(i); continue }
        const change = newValue.find(item => item.username == i.username && !_.isEqual(item, i))
        if (change) { memberChange.change.push(i) }
    }

    for (let i of groupStore.value.member_list) {
        const add = copyMemberList.every(item => item.username !== i.username)
        if (add) { memberChange.add.push(i);console.log('add=====================',add); continue }
    }

    console.log('copyMemberList=====================', copyMemberList)
    console.log('memberChange=======================', memberChange)
}, { deep: true })

不监听整个数组,for遍历生成数组项监听Proxy,然后将新Proxy实例压入数组项中,通过数组项变量来更新内容,也会同时更新arr中的值并触发set操作,但是push或者splice删除项需要同时操proxy代理数组变量


<script src="https://unpkg.com/vue@next" data-ver="3"></script>
<div id="app">
    <div v-for="item in arr">{{item}}</div>
</div>
<script>
    var config = {
        data() {
            return { arr: [{}, {}, {}, {}], arrproxy: [] };
        },
        mounted() {
            for (let item of this.arr) {
                this.arrproxy.push(this.createItemProxy(item))
            }
            this.arrproxy[0].x = 11;
            this.arr.splice(1, 1)
            this.arrproxy.splice(1, 1);//要同时删除
            this.arrproxy[1].b = 11;
        },
        methods: {
            createItemProxy(item) {
                return new Proxy(item, {
                    set: (target, prop, value) => {
                        console.log(prop, value)
                        target[prop] = value;
                    }
                });
            }
        }
    };
    Vue.createApp(config).mount('#app')
</script>


您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632