Оригинальный ответ на основе более ранней версии вопроса
Если вы сделаете windows
вычисляемое свойство, оно может зависеть от tableData
:
export default {
data() {
return {
tableData: [
{
id: '0',
name: 'dog'
},
{
id: '1',
name: 'cow'
},
{
id: '2',
name: 'cat'
}
]
}
},
computed: {
windows () {
return [
{
id: 0,
name: 'Component1',
props: {
dataT: this.tableData
}
}, {
id: 1,
name: 'Component2',
props: {}
}
]
}
}
}
Если вы не можетесделайте все это вычисляемым свойством, например, потому что вам нужно иметь возможность изменить его, затем сохраните его как data
и просто используйте вычисленное свойство для создания массива, необходимого в вашем шаблоне.В этом случае вычисляемое свойство будет просто объединять различные части данных в правильную форму.
В исходном коде строка dataT: this.tableData
не будет работать, поскольку this.tableData
еще не существуетэто будет просто undefined
.Здесь нет ленивых вычислений, нужно разрешить правильный объект в том месте, где он попадает в эту строку.
Даже если бы ему удалось получить доступ к правильному объекту, это не помогло бы, потому что в handleDeleteRow
Вы переназначаете tableData
, чтобы указать на другой объект.Передача «по ссылке» не имеет ничего общего с именем, которое вы используете для идентификации объекта, это относится к ссылке в памяти.
Кстати, v-on
также поддерживает синтаксис объекта, как и v-bind
,так что вы можете сделать onDeleteRow
необязательным аналогичным образом.
Обновление на основе отредактированного вопроса
Когда вы пишете это в addWindows
:
props: {
dataT: this.tableData
}
Этоназначит current значение this.tableData
для dataT
.Это текущее значение будет массивом, и так как массивы являются ссылочными типами, любые изменения, внесенные в этот массив, будут применяться независимо от того, какой идентификатор используется для ссылки на него.
Однако эта строка ...
this.tableData = this.tableData.filter(r => r.id != id);
... не изменяет этот массив.Вместо этого он присваивает совершенно новый массив this.tableData
.Это не повлияет на массив, на который ссылается dataT
, который не изменился.
Существует несколько способов решения этой проблемы, включая использование вычисляемого свойства.Однако получатель свойства может обеспечить удобную ловкость рук:
addWindows () {
const vm = this;
this.windows = [
{
id: 0,
name: 'Component1',
props: {
get dataT () {
return vm.tableData
}
}
},
{
id: 1,
name: 'Component2',
props: {}
}
];
}
Это всегда будет иметь текущее значение tableData
.Реакционная способность Vue должна быть в порядке с этим дополнительным косвенным указанием, она просто считает, что это эквивалентно прямому доступу к tableData
.