【问题标题】:update item in two dimensional array within the Vuex store更新 Vuex 商店中二维数组中的项目
【发布时间】:2019-10-24 06:15:16
【问题描述】:

我想进入 VueJs 开发并创建了一个简单的扫雷游戏。二维网格由 Vuex 状态管理。单击单元格时,我想显示它,因此我当前的代码是

  [MutationTypes.REVEAL_CELL]: (state, { rowIndex, columnIndex }) => {
    state.board[rowIndex][columnIndex].isRevealed = true;
  }

很遗憾,这对 UI 没有影响。这个问题是已知的并在此处描述

https://vuejs.org/v2/guide/list.html#Caveats

文档告诉我使用这样的东西

import Vue from "vue";

  [MutationTypes.REVEAL_CELL]: (state, { rowIndex, columnIndex }) => {
    const updatedCell = state.board[rowIndex][columnIndex];
    updatedCell.isRevealed = true;

    Vue.set(state.board[rowIndex], columnIndex, updatedCell);
    Vue.set(state.board, rowIndex, state.board[rowIndex]);
  }

但它没有帮助。最后,我尝试创建板的副本,修改值并将该副本分配给板。

  [MutationTypes.REVEAL_CELL]: (state, { rowIndex, columnIndex }) => {
    const newBoard = state.board.map((row, mapRowIndex) => {
      return row.map((cell, cellIndex) => {
        if (mapRowIndex === rowIndex && cellIndex === columnIndex) {
          cell = { ...cell, isRevealed: true };
        }
        return cell;
      });
    });

    state.board = newBoard;
  }

这也不起作用。有人有想法吗?

我创建了一个 Codesandbox 来显示我的项目

https://codesandbox.io/s/vuetify-vuex-and-vuerouter-d4q2b

但我认为唯一相关的文件是 /store/gameBoard/mutations.js 和函数 REVEAL_CELL

【问题讨论】:

标签: javascript vue.js vuejs2 vuex computed-properties


【解决方案1】:

问题在于Cell.vue,问题在于您正在检查一个不变的变量以确定显示状态。您已将 this.cell.isRevealed 抽象为一个名为 isUnrevealed 的变量,在初始加载后从未告知如何更改。

选项 1

isUnrevealed 似乎是一个不必要的便利变量。如果您去掉 isUnrevealed 并将对它的引用更改为 !cell.isRevealed,代码将按预期工作。

选项 2

如果您打算使用此变量,请将其更改为计算变量,以便在 Vuex 状态将更改传播到 cell isRevealed 属性时不断更新自身:

computed: {
  isUnrevealed() {
    return !this.cell.isRevealed;
  }
}

如果你走这条路,别忘了从data 中删除属性并删除mounted 中的分配(第一行)。


isMinecellStyle 也会遇到同样的问题。因此,完全删除 datamounted 并同时计算它们。

computed: {
  isMine() {
    return this.cell.isMine;
  },
  cellStyle() {
    if (!this.cell.isRevealed) {
      return "unrevealedCell";
    } else {
      if (this.isMine) {
        return "mineCell";
      } else {
        let neighbourCountStyle = "";
        ... // Switch statement
        return `neutralCell ${neighbourCountStyle}`;
      }
    }
  }
}

【讨论】:

  • 不错的发现!这让我很好奇......所以我测试了选项 1 - 除了每当点击炸弹或中性单元格(样式不会改变 - 样式只会改变被点击的单元格),它工作得很好..我想弄清楚为什么会发生这种情况……有什么建议吗?看起来Grid.vue 没有对电路板的更改做出反应..(如果单击炸弹或中性单元格并且需要同时显示多个单元格 - 它们仍然显示,只是样式不正确)..
  • @MattOestreich - 谢谢。这是因为样式永远不会被告知要更改——mounted 中的所有代码仅在组件加载时运行一次。为了解决这个问题,他可以创建另一个计算来确定类,并将所有相关代码从mounted 移到其中。
  • 这是我尝试过的一件事。我将挂载的代码变成了一个函数,并在挂载期间以及单击单元格时调用它。我想我明白你的意思了。需要将cell.style 更改为计算道具,以便它对更改做出反应?感谢您的输入。我会试着从这里弄清楚。感谢您的回复!
  • @MattOestreich - 没问题。我刚刚编辑了我的答案以表明这一点
  • 我希望我能不止一次地为你投票,哈哈 - 我希望 OP 对此给予了肯定,并选择你的答案作为接受的答案。哦...还...继续@ 987654321@ 你的劳动大声笑 - 它完美无瑕。我不知道为什么我让Vuex 阻塞了我的思路......呃......无论如何,你帮助我学到了一些东西,我很感激!干杯
猜你喜欢
  • 2017-06-30
  • 2021-06-21
  • 2017-11-09
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 2018-02-08
相关资源
最近更新 更多