Кажется, что вы хотите, чтобы html отражал состояние объекта, который может измениться, и это обычно означает возможность наблюдать это состояние каким-то образом.Это часто означает использование библиотеки / фреймворка, такого как React или Vue, поскольку выполнение такого рода реактивности становится нелегким, когда проект выходит за рамки тривиального размера.
Вот минимальный пример, демонстрирующий проблему:
const el = document.getElementById('output')
const values = [
{
id: 1
},
{
id: 2
},
]
const log = text => {
console.log(text)
}
el.innerHTML = values.map(valueIter => `
<button onclick="log(valueIter)">
${valueIter.id}
</button>
`);
<button onclick="log(valueIter)">Test Button</button>
<div id="output"></div>
В приведенном выше примере текст valueIter
помещается в вызов функции onclick
, фактический объект, который являетсячасть вызова map
.Замена этого на ${valueIter.id}
вместо этого передаст текст свойства id valueIter
.Однако, если это изменится, мы все равно получим исходное значение.
Альтернативой будет доступ к фактическому значению, которое должно быть зарегистрировано:
const el = document.getElementById('output')
const values = [
{
id: 1
},
{
id: 2
},
]
const log = text => console.log(text)
el.innerHTML = values.map((value, i) => `
<button onclick="log(values[${i}])">
${value.id}
</button>
`)
values[0] = {
id: 99
}
<div id="output"></div>
Вы заметите, что текст кнопки не меняется.В этом коде нет ничего, что заставляло бы DOM обновляться при изменении исходного значения, в результате чего все становится немного сложнее.По сути, ничто не связывает вывод DOM с состоянием объекта, который он должен отображать.