VUE监听数组新旧值不变化,请教前辈原因?

发布于 2022-09-07 03:51:57 字数 3477 浏览 16 评论 0

最近在自学vue对于watch监测这块还有点疑问,请教前辈帮忙解答。

具体问题如下:
测试监测不同类型data数据的新旧值,在有数组的情况下,watch监测到了数组的变化但是没监测到变化前的旧值。
在官网也查了文档,问题应该是出在下面这里,无奈对于官网文档给出的解决方法看不懂,求各位大神给与指点!!!

                g: {
                    handler: function (val, oldVal) {
                        console.log("newG:" + val, 'oldG:' + oldVal);
                    }
                }

当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
当你修改数组的长度时,例如:vm.items.length = newLength

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>watch</title>
    <script src="https://cdn.jsdelivr.net/npm/vue "></script>
</head>

<body>
    <fieldset>
        <legend>实例1</legend>
        <div id="app">
            <span>A:</span>
            <input type="text" v-model:value="a" />
            <span>B:</span>
            <input type="text" v-model:value="b" />
            <div>
                <span>Cname:</span>
                <input type="text" v-model:value="c.name">
            </div>
            <div>
                <span>Dname:</span>
                <input type="text" v-model:value="d.e.f.age">
            </div>
            <div>
                <span>arry:</span>
                <input type="text" v-model:value="g[0]">
            </div>
        </div>
    </fieldset>
    <script> 
        new Vue({
            el: '#app',
            data: {
                a: '',
                b: '',
                c: {
                    name: ''
                },
                d: {
                    e: {
                        f: {
                            nage: ''
                        }
                    }
                },
                g: []
            },
            watch: {
                //普通watch监听
                a: function (val, oldVal) {
                    console.log("newA:" + val, 'oldA:' + oldVal);
                },
                //通过方法名在methods内监听
                b: 'anothermethod',
                //对象深度监听
                c: {
                    handler: function (val, oldVal) {
                        console.log('newname:' + val, 'oldname:' + oldVal);
                    },
                    deep: true,
                    immediate: true
                },
                'c.name': {
                    handler: function (val, oldVal) {
                        console.log('newC:' + val, 'oldC:' + oldVal);
                    }
                },
                'd.e.f.age': {
                    handler: function (val, oldVal) {
                        console.log('newD:' + val, 'oldD:' + oldVal);
                    }
                },
                g: {
                    handler: function (val, oldVal) {
                        console.log("newG:" + val, 'oldG:' + oldVal);
                    }
                }
            },
            methods: {
                anothermethod: function (val, oldVal) {
                    console.log("newB:" + val, 'oldB:' + oldVal);
                }
            }
        })


    </script>
</body>

</html>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

旧时光的容颜 2022-09-14 03:51:57
   'g.0': {// g -> g.0
                    handler: function (val, oldVal) {
                        console.log("newG:" + val, 'oldG:' + oldVal);
                    }
                }
对你的占有欲 2022-09-14 03:51:57

知道怎么用但是说不出来o(╯□╰)o

数组本身有值: oldArr = [1,2,3],渲染到html上显示1,2,3;
现在需求来了,要改一下数组的值,变成newArr = [1,3,5],并让html渲染成1,3,5;
怎么办?
1. 替换数组;
2. 变异方法;
你都不想用,就要通过index改变数组的值,让html显示1,3,5.然后就出现了你看到的那个问题。
通过改index什么的,怎么解决?
1. Vue.set(vm.items, indexOfItem, newValue);
2. vm.items.splice(indexOfItem, 1, newValue);
大概就是这么个意思
指尖上得阳光 2022-09-14 03:51:57
            g: {
                handler: function (val, oldVal) {
                    console.log("newG:" + val, 'oldG:' + oldVal);
                },
                deep:true//加上这个
            }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文