满口金牙 2022-12-16 18:13 采纳率: 91.5%
浏览 30
已结题

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 })

  • 写回答

3条回答 默认 最新

  • CSDN专家-showbo 2022-12-16 21:45
    关注

    不监听整个数组,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>
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月25日
  • 已采纳回答 12月17日
  • 修改了问题 12月16日
  • 修改了问题 12月16日
  • 展开全部

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题