我正在开发一个帮助台工具,其中有看板视图.

enter image description here

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

  1. 我询问我的帮助台团队(屏幕截图中的"测试")
  2. 我询问该团队的各个阶段("新的"、"进行中的")
  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中,我 for each 阶段添加了一个属性"tickets"到一个空列表中.问题是当我查询每个stage的所有门票时.我知道如何在带有拼接的数组中插入单个对象,或者如何从数组中删除一个对象,但我不知道如何在触发Vue时将整个数组指定给数组中对象的属性.在这里,我想把所有的票(这是一个列表)放到stage.tickets.

有可能做到这一点吗?

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

提前谢谢!

100

事实证明,模板部分生成了一个错误.我不认为这是根本原因,因为部分视图已呈现.我认为如果是这样的话,它会阻止整个视图的呈现.但最后,在我的模板中,我有一个部分在使用单个查询填充我的视图时工作.当我的API变得更细粒度,并独立于阶段查询票据时,有一段时间stage没有tickets属性,直到我手动将其设置为this.$set(stage, 'tickets', []).因此,模板会停止渲染并引发问题.但是,如果没有模板问题,更新我的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);

我try 了你的方法,其中一些方法是正确的:

NOT 工作

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相关问答推荐

如何将$validator实例注入到使用组合API语法的Vue2.7应用程序中

无法在cPanel/SSH上构建 | Laravel + Vue优化

为什么 Pinia/Vuex 比使用服务类的classic 方法更受欢迎?

将 v-calendar 与以时间和日期格式出现的事件一起使用

:deep() 带有嵌套 scss 规则的语法

如何使用 vuejs 在浏览器 url 中获取当前 product.id 的详细信息

如何容器化 Vue.js 应用程序?

带有热重载的 docker 容器上的 Vue.js 应用程序

Vuetify v-select 组件宽度变化

Nuxt 打开链接到模态

SassError:媒体查询表达式必须以(开头

如何将 v-if 与 Vue.js 中的值进行比较

Vue 如何使用 slot 和 slot-props 测试组件

触发子函数

基于媒体查询的vue绑定值

基本 vue.js 2 和 vue-resource http 获取变量赋值

Vue Chart.js - 条形图上的简单点/线

偶数行格式化

Vue js在列表中添加动态字段,删除和排序不起作用

仅在提交时验证 vuetify 文本字段