zoukankan      html  css  js  c++  java
  • vue 组件中数组的更新

    今天写项目时遇到的问题,瞬间就卡在那了

    来还原一下:

    parent.vue:

    <template>
      <div>
            <button @click="change">change</button>
            <input type="text" v-model="list" name="">
            <child v-for="item in list" :key="item.id" :list="item.list"></child>
      </div>
    </template>
    
    <script>
    import child from './child.vue'
    export default {
      name: 'parent',
      data () {
        return {
          list:[{id:1,type:1},{id:2,type:2},{id:3,type:3}]
        }
      },methods:{
          change(){
              console.log(this)
              console.log(this.$set)
              setTimeout(()=>{
                   this.list[1]['list'] = {a:1,b:2,c:3}
              },1000)
          }
      },
      components:{
          child
      },
      watch:{
          // list:{
       //    handler: function (val, oldVal) { console.log(val,oldVal) },
       //    deep: true
       //  }
      },computed:{
          // test:function(){
          //     console.log(this.list)
          //     return this.list
          // }
      }
    }
    </script>
    
    <style scoped>
    </style>

    child.vue

    <template>
        <div class="border">
            {{list.a}}<br />
            {{list.b}}<br />
            {{list.c}}
        </div>
    </template>
    <script>
        export default{
            props:{
                list:{
                    default:()=>{return{a:0,b:0,c:0}}
                }
            },
            data(){
                return{
                    // newList:this.list
                }
            },
            computed:{
                // newList:()=>{
                //     console.log(this.list)
                //     return this.list
                // }
            }
        }
    </script>
    <style>
        .border{
            border:1px solid #ddd;
        }
    </style>

    我预想中的正常情况应该是点击按钮,,然后 页面上的 000 000 000 变成 000 123 000 ,

    但是就是没有变化看了下 vue 文档先试试是不是子组件检测的值出了问题,

    然后我在子组件中添加了 watch和 computed 结果都是无效的;

    后来我搜索了页面,发了了一个全局函数 :

    Vue.set();

    他的效果:

    Vue.set( target, key, value )

    • 参数:

      • {Object | Array} target
      • {string | number} key
      • {any} value
    • 返回值:设置的值。

    • 用法:

      设置对象的属性。如果对象是响应式的,确保属性被创建后也是响应式的,同时触发视图更新。这个方法主要用于避开 Vue 不能检测属性被添加的限制。

    终于被我找到了关键的地方了,但是在组件中怎么使用全局指令呢?

    我后面又发现了 this.$set这个函数是完全一样的;

    所以高兴的用上了:

    正确用法:

    methods:{
          change(){
              setTimeout(()=>{
            this.list[1]['list'] = {a:1,b:2,c:3}//这样写 data 并不会检测
            this.$set(this.list[1],'list',{a:1,b:2,c:3})//正确的写法
              },1000)
          }

    这个坑,浪费了我几个小时,虽然我用 v-if 也解决了,但是总是不甘心,晚上继续研究终于让我解决了;

    引以为戒;

  • 相关阅读:
    Mysql与Sql Server查询数据库中表以及表字段
    linux系统常用命令
    linux tomcat安装以及配置
    mysql 5.7 设置root远程访问
    linux jdk安装
    ubuntu系统阅读CHM文档的最终解决方案
    ubuntu18.04完全卸载mysql的命令
    linux下使用cd命令进入wine容器中的windows路径
    Python中yield关键字的用法及运行逻辑
    Ubuntu18..04.2服务器版设置redis开机启动遇到的问题
  • 原文地址:https://www.cnblogs.com/Grewer/p/7664259.html
Copyright © 2011-2022 走看看