vue.js - Vuejs-更新数组中对象的数组

标签 vue.js vue-reactivity

我正在开发一个帮助台工具,其中有看板 View 。

enter image description here

我之前在后端使用了嵌套序列化器,我设法让所有内容都可以使用单个查询,但它不可扩展(而且很丑),所以我切换到另一个模式:

  1. 我询问我的帮助台团队(屏幕截图中的“测试”)
  2. 我查询该团队的阶段("new"、“进行中”)
  3. 我分阶段查询每个阶段的门票

因此,当我安装组件时,我会执行以下操作:

async mounted () {
  if (this.helpdeskTeamId) {
    await this.getTeam(this.helpdeskTeamId)
    if (this.team) {
      await this.getTeamStages(this.helpdeskTeamId)
      if (this.stages) {
        for (let stage of this.stages) {
          await this.getStageTickets(stage)
        }
      }
    }
  }
},

其中 getTeamgetTeamStagesgetStageTickets 是:

async getTeam (teamId) {
  this.team = await HelpdeskTeamService.getTeam(teamId)
},

async getTeamStages (teamId) {
  this.stages = await HelpdeskTeamService.getTeamStages(teamId)
  for (let stage of this.stages) {
    this.$set(stage, 'tickets', [])
  }
},

async getStageTickets (stage) {
  const tickets = await HelpdeskTeamService.getTeamStageTickets(this.helpdeskTeamId, stage.id)
  // tried many things here below but nothing worked.
  // stage.tickets = stage.tickets.splice(0, 0, tickets)
  // Even if I try to only put one :
  // this.$set(this.stages[this.stages.indexOf(stage)].tickets, 0, tickets[0])
  // I see it in the data but It doesn't appear in the view...
  // Even replacing the whole stage with its tickets :
  // stage.tickets = tickets
  // this.stages.splice(this.stages.indexOf(stage), 1, stage)
},

getTeamStages 中,我将每个阶段的属性“tickets”添加到空列表中。问题是当我查询每个阶段的所有门票时。我知道如何通过拼接在数组中插入单个对象,或者如何从数组中删除一个对象,但我不知道如何在触发 Vue react 性时将整个数组分配给数组中对象的属性。在这里,我想将所有门票(这是一个列表)放入 stage.tickets

有可能实现这个目标吗?

如果不是,实现类似目标的正确设计是什么?

提前致谢!

编辑:

原来是模板部分产生了错误。我不认为这是根本原因,因为 View 的一部分已渲染。我认为如果是这样的话,它会阻止整个 View 的渲染。但最后,在我的模板中,我有一部分正在执行 stage.tickets.length ,这在使用单个查询填充我的 View 时起作用。当使我的 API 更加精细并独立于阶段查询门票时,有时 stage 没有 tickets 属性,直到我使用 this.$set 手动设置它(舞台,'门票',[])。因此,模板会停止渲染并引发问题。但是,如果没有该模板问题,更新我的 stage.tickets 的方法就可以正常工作。

最佳答案

我可以 react 性地更新阶段。这是我的完整代码;我使用了数组对象的 push 方法,它有效:

<template>
  <div>
    <li v-for="item in stages" :key="item.stageId">
      {{ item }}
    </li>
  </div>
</template>

<script>
export default {
  data() {
    return {
      stages: [],
    };
  },
  methods: {
    async getTeamStages() {
      this.stages = [{ stageId: 1 }, { stageId: 2 }];
      for (let stage of this.stages) {
        this.$set(stage, "tickets", []);
      }
      for (let stage of this.stages) {
        await this.getStageTickets(stage);
      }
    },
    async getStageTickets(stage) {
      const tickets = ["a", "b", "c"];
      for (let ticket of tickets) {
        this.stages[this.stages.indexOf(stage)].tickets.push(ticket);
      }
    },
  },
  mounted() {
    this.getTeamStages();
  },
};
</script>

需要注意的是,我使用了数组对象的 concat 方法,并且也有效:

this.stages[this.stages.indexOf(stage)].tickets = this.stages[this.stages.indexOf(stage)].tickets.concat(tickets);

我尝试了你的方法,其中一些工作正常:

不起作用

this.$set(this.stages[this.stages.indexOf(stage)].tickets, tickets)

工作了

this.$set(this.stages[this.stages.indexOf(stage)].tickets, 0, tickets[0]);

工作了

  stage.tickets = tickets
  this.stages.splice(this.stages.indexOf(stage), 1, stage)

我确定这是 XY 问题..

关于vue.js - Vuejs-更新数组中对象的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71921359/

相关文章:

vue.js - 在 Vue 中重新渲染组件的最简洁方法

javascript - v-for 不重新渲染数组 vue js

vue.js - 如何使用组合清除 Vue3 中的响应式(Reactive)数组?

javascript - Vue js在ajax调用后设置数据

vue.js - Vue.js 中不需要的动画错误

javascript - Testcafe Vue Selectors 无法抓取 Vue 组件

javascript - 如何为未定义的窗口对象编写测试用例 | Vue 测试工具 | Jest 框架

javascript - Nuxt JS 环境文件

javascript - 基于 bool 值数组在 Vue.js 中绑定(bind)类

vue-component - vee-validate 错误对象 - _vm.errors 未定义