Vue数据和视图不同步的原因

news/2024/7/10 2:46:04 标签: vue

vue中在data中的对象赋予新的属性是不能响应式的更新数据的。

在这里插入代码片
    var vm = new Vue({
            el: '#app',
            data: {
                tempArr: [
                    { name: "Tom", age: "11" },
                    { name: "Marry", age: "21" },
                    { name: "Jack", age: "18" },
                ],

                newArr: []
            },
            mounted() {
                this.handelData();
            },
            methods: {
                showAge(item) {
                    item.isShow = !item.isShow;
                    // console.log(item)
                },
                handelData() {
                    this.tempArr.forEach(item => {
                        item.isShow = false;
                        // Vue.set(item, "isShow", false);
                    })
                    console.log(this.tempArr)
                }
            }
        })

我们想实现一个功能: 在点击 对应的 行数时 显示某个字段
在这里插入图片描述
点击第一行显示他的年龄, 再次点击隐藏的效果. 由于数据设置是否显示的变量是用对象重写的方式写进去的

  this.tempArr.forEach(item => {
              item.isShow = false;
          })

你会发现你点击后打印出来的数据更新了
在这里插入图片描述
但是视图上却没有显示出来.
原因就是:
vue的dom更新是异步的,即当setter操作发生后,指令并不会立马更新,指令的更新操作会有一个延迟,当指令更新真正执行的时候,此时.text属性已经赋值,所以指令更新模板时得到的是新值。
具体流程如下:

self.dataObj = {};发生setter操作
vue监测到setter操作,通知相关指令执行更新操作
self.dataObj[‘text’] = ‘new text’;赋值语句
指令更新开始执行
所以真正的触发更新操作是self.dataObj = {};这一句引起的,所以单看上述例子,具有响应式特性的数据只有dataObj这一层,它的子属性是不具备的。

想要解决也很简单
就是我们在对象重写时用vue提供的方法
Vue.set(“对象”, ‘你的新字段’, “value值”)
脚手架
用 this.$set(“对象”, ‘你的新字段’, “value值”);

插代码检验下效果

 <div id="app">
        <ul>
            <li v-for="item in tempArr" @click="showAge(item)">
                {{item.name}}---------<span v-if="item.isShow">{{item.age}}</span></li>
        </ul>

    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                tempArr: [
                    { name: "Tom", age: "11" },
                    { name: "Marry", age: "21" },
                    { name: "Jack", age: "18" },
                ],

                newArr: []
            },
            mounted() {
                this.handelData();
            },
            methods: {
                showAge(item) {
                    item.isShow = !item.isShow;
                    // console.log(item)
                },
                handelData() {
                    this.tempArr.forEach(item => {
                        // item.isShow = false;
                        Vue.set(item, "isShow", false);
                    })
                    console.log(this.tempArr)
                }
            }
        })

在这里插入图片描述
很简答的一个demo,在实际工作上难了一天,希望能帮到你们.
当然数据不更新还有其他因素
key值不唯一
依赖外部变量等等.


http://www.niftyadmin.cn/n/1845897.html

相关文章

找回Reshaprer的Alt+Enter快捷键的方法

用过Reshaprer一段时间发现这个Visual Studio插件确实是个好东东&#xff0c;特别是神级快捷键AltEnter更是好用至极&#xff0c;可以解决大部分代码问题&#xff0c;不过会发现装上Reshaprer后VS自带的快捷键就被打乱了&#xff0c;特别是喜欢的CtrlE,D设置文档格式等&#xf…

《Flutter 控件大全》第二十三个:ClipRect、ClipRRect、ClipOval、ClipPath、CustomClipper

如果你对Flutter还有疑问或者技术方面的疑惑,欢迎加入Flutter交流群(微信:laomengit)。同时也欢迎关注我的Flutter公众号【老孟程序员】,公众号首发Flutter的相关内容。Flutter地址:http://laomengit.com 里面包含160多个组件的详细用法。ClipRect ClipRect组件使用矩形…

《Flutter 控件大全》第二十四个:ColorFiltered

如果你对Flutter还有疑问或者技术方面的疑惑,欢迎加入Flutter交流群(微信:laomengit)。同时也欢迎关注我的Flutter公众号【老孟程序员】,公众号首发Flutter的相关内容。Flutter地址:http://laomengit.com 里面包含160多个组件的详细用法。Flutter中大部分多组件都有color…

Koa洋葱圈模型源码浅析(`await next()`为什么能够形成洋葱圈模型?)

Koa洋葱圈模型源码浅析写在前面什么是中间件&#xff1f;为什么要使用中间件&#xff1f;auth中间件源码Koa源码浅析我们先来康一张gif图片我们的探索流程图listen函数callback函数createContext函数handleRequest函数middleware是什么&#xff1f;--- use函数compose函数&…

vue 的htm里面写三目运算方法.

{{position 0 ? ‘a情况’:‘b情况’}} {{position0?‘相似图片’:‘相关影片’}}

《Flutter 控件大全》第二十五个:Row和Column

如果你对Flutter还有疑问或者技术方面的疑惑,欢迎加入Flutter交流群(微信:laomengit)。同时也欢迎关注我的Flutter公众号【老孟程序员】,公众号首发Flutter的相关内容。Flutter地址:http://laomengit.com 里面包含160多个组件的详细用法。在Row和Column中有一个非常重要的…

ps ps aux 和ps -aux和 ps -ef的选择

Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照&#xff0c;就是执行ps命令的那个时刻的那些进程&#xff0c;如果想要动态的显示进程信息&#xff0c;就可以使用top命令。 要对进程进行监测和控制&#x…

[ES6学习笔记]‘ES7-11‘浅层次梳理,点到为止

ES7-11写在前面ES7Array.prototype.includes幂运算**ES8async和awaitasync函数await表达式Object.values,keys和Object.entriesObject.getOwnPropertyDescriptorsES9扩展运算符与rest参数正则扩展&#xff1a;命名捕获分组正则扩展: 反向断言正则扩展&#xff1a;dotAll模式ES1…