Vue JS поменять :style в v-for

Есть массив, из которого через v-for создаётся таблица.

<div class="table">
            <div class="column"
                v-for="(column, columnIndex) in table"
                >
                <div class="row"
                    v-for="(row, rowIndex) in table[columnIndex]"
                    :style="{ 'background-color': row }"
                    @click="tableClick(columnIndex, rowIndex)">

                </div>
            </div>
        </div>
data() {
        return {
            table: [
                ['white', 'white', 'white', 'white', 'white', 'white', 'white', 'white'],
                ['white', 'white', 'white', 'white', 'white', 'white', 'white', 'white'],
                ['white', 'white', 'white', 'white', 'white', 'white', 'white', 'white'],
                ['white', 'white', 'white', 'white', 'white', 'white', 'white', 'white'],
                ['white', 'white', 'white', 'white', 'white', 'white', 'white', 'white'],
                ['white', 'white', 'white', 'white', 'white', 'white', 'white', 'white'],
                ['white', 'white', 'white', 'white', 'white', 'white', 'white', 'white'],
                ['white', 'white', 'white', 'white', 'white', 'white', 'white', 'white'],
            ]
        }
    },
    methods: {
        tableClick(i, j) {
            this.table[i][j] = 'red';
        }
    }

Через метод tableClick я меняю значения массива на другие цвета. Если просматривать через консоль, массив меняется, но :style в v-for не меняется, должен смениться цвет ячейки. Если менять цвета в массиве с самого начала, например, писать 'red', то ячейка окрашивается.

Необходимо динамически менять цвет ячейки при клике на неё.


Ответы (1 шт):

Автор решения: Дмытрык

const app = new Vue({
  el: "#app",
  data() {
    return {
      table: [
        [
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
        ],
        [
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
        ],
        [
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
        ],
        [
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
        ],
        [
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
        ],
        [
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
        ],
        [
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
        ],
        [
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
          "white",
        ],
      ],
    };
  },
  methods: {
    tableClick(i, j) {
      this.$set(this.table[i], j, 'red')
    },
  },
});
.row {
  width: 30px;
  height: 30px;
  border: 1px solid;
}

.table {
  display: flex;
}
<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>


<div id="app">
  <div class="table">
    <div class="column" v-for="(column, columnIndex) in table">
      <div class="row" v-for="(row, rowIndex) in table[columnIndex]" :style="{ 'background-color': row }" :key="rowIndex" @click="tableClick(columnIndex, rowIndex)">
      </div>
    </div>
  </div>
</div>

→ Ссылка