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 也解决了,但是总是不甘心,晚上继续研究终于让我解决了;

引以为戒;

 

posted @   Grewer  阅读(1213)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示