мне кажется, что проблема здесь в этом => cell.isActive()
Поскольку вы возвращаете функцию вместо реактивной переменной, там нет ничего, что указывало бы на изменение. Теперь вы можете принудительно обновить forceUpdate()
, но тогда вы будете перерисовывать все ячейки, что ужасно неэффективно. Вы должны стараться не использовать функции как часть рендеринга, если это возможно, особенно внутри циклов, так как они запускаются при каждом отрисовке.
Мой предпочтительный способ состоял бы в том, чтобы отдельные компоненты не управляли своим собственным состоянием, а использовали вложенные состояние объекта / массива, которое может обрабатывать данные столбцов, строк и / или ячеек. Но я предполагаю, что это не то, что вы ищете.
Если бы вы могли использовать вычисленные значения, то вы можете реализовать реактивность без вызова функции. Вы можете добавить это с помощью DIY, если вы используете vue 2.6+. Начиная с Vue 2.6 появилась возможность определять автономные наблюдаемые, которые можно использовать для хранения и изменения состояния, а также для создания вычисляемого поля.
Это также следует применять к другим фабрикам, например row.getCells()
регенерирует все данные, так как не содержит состояния.
непроверенный код:
const TableCell = (parent, rowIndex, columnIndex) => {
const state = Vue.Observable({
active: false
});
const computed= {
isActive: () => state.active,
}
const methods = {
hover: () => {
active = !active;
},
};
// return all merged (need to watch for overlapping names)
return {...state, ...computed, ...methods};
};
При этом вы сможете использовать cell.isActive
и реагировать на изменения.
В дополнение к этому, если вы хотите использовать Vue таким образом, вы, вероятно, извлечете выгоду из изменений, внесенных в Vue 3 (недавно выпущенный в бета-версии), а именно в состав API, который предоставляет компонентный состав.