У меня есть группа объектов, которые визуализируются с помощью v-for.
<div v-for = "answer in answers" :key = "answer.id" class = "field has-addons">
<p class = "control">
<button @click = "addNewAnswer" class = "button is-primary">
<span class = "icon">
<i class = "fas fa-plus"></i>
</span>
<span>Добавить</span>
</button>
</p>
<p class = "control">
<input
@input = "answers[answerCount - 1].answer = $event.target.value"
type = "text"
class = "input"
>
</p>
</div>
Это модели, которые я использую для рендеринга
data() {
return {
answers: [
{
id: 0,
answer: '',
isEntered: false,
}
],
answerCount: 1,
}
},
А это код добавления новой строки для ввода ответа
addNewAnswer() {
const newAnswer = {
id: Date.now(),
answer: '',
isEntered: false,
};
this.answers.push(newAnswer);
this.answers[this.answerCount - 1].isEntered = true;
this.answerCount += 1;
},
Мне нужно добавить класс is-static к вводу после добавления введенного ответа. Как мне это сделать правильно?
Если я добавлю это к элементу ввода
:class = "{ 'is-static':answers[answerCount - 1].isEntered }"
Тогда класс не будет добавлен к прошлому элементу как положено, потому что я буду ссылаться на уже новый объект ответа массива. Я не мог придумать никаких альтернатив



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте с v-моделью:
const app = Vue.createApp({
data() {
return {
answers: [
{
id: 0,
answer: '',
isEntered: false,
}
],
answerCount: 1,
}
},
methods: {
addNewAnswer() {
const newAnswer = {
id: Date.now(),
answer: '',
isEntered: false,
};
this.answers.push(newAnswer);
this.answers[this.answerCount - 1].isEntered = true;
this.answerCount += 1;
},
}
})
app.mount('#demo').is-static {
color: red;
}<script src = "https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<div id = "demo">
<div v-for = "answer in answers" :key = "answer.id" class = "field has-addons">
<p class = "control" >
<button @click = "addNewAnswer" class = "button is-primary">
<span class = "icon">
<i class = "fas fa-plus"></i>
</span>
<span>Добавить</span>
</button>
</p>
<p class = "control">
<input
v-model = "answer.answer"
type = "text"
class = "input"
:class = "{ 'is-static':answer.isEntered }"
>
</p>
</div>
{{ answers }}
</div>Согласно вашему постановлению о проблеме, нет необходимости управлять отдельной переменной answerCount. Поскольку вы повторяете массив ответов в самом верхнем элементе. Вы можете получить доступ к его свойствам объекта напрямую, используя запись через точку (.).
Предложения :
@input = "answers[answerCount - 1].answer = $event.target.value" на v-model = "answer.answer"answer.id в качестве параметра в методе addNewAnswer, а затем обновите значение свойства переданного идентификатора объекта.Живая демонстрация:
const app = Vue.createApp({
data() {
return {
answers: [
{
id: 0,
answer: '',
isEntered: false,
}
],
answerCount: 1,
}
},
methods: {
addNewAnswer(answerId) {
const newAnswer = {
id: Date.now(),
answer: '',
isEntered: false,
};
this.answers.push(newAnswer);
this.answers.forEach(obj => {
if (obj.id === answerId) {
obj.isEntered = true;
}
})
},
}
})
app.mount('#app').is-static {
color: red;
}<script src = "https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<div id = "app">
<div v-for = "answer in answers" :key = "answer.id" class = "field has-addons">
<p class = "control" >
<button @click = "addNewAnswer(answer.id)" class = "button is-primary">
<span class = "icon">
<i class = "fas fa-plus"></i>
</span>
<span>Добавить</span>
</button>
</p>
<p class = "control">
<input
v-model = "answer.answer"
type = "text"
class = "input"
:class = "{ 'is-static': answer.isEntered }"
>
</p>
</div>
</div>