Я бы предложил немного изменить структуру вашего приложения. Вы можете очистить свой код, используя v-if внутри кнопки вместо двух разных кнопок.
Также хорошей практикой является как можно большее удаление javascript из разметки.
Ниже приведен пример, где это делается.
Относительно вашего вопроса , вам нужно будет добавить ключ к каждому предмету todo.
new Vue({
el: "#app",
data() {
return {
todos: [{
name: 'wash hands',
isHidden: true
},
{
name: 'Stay home',
isHidden: true
}
],
};
},
methods: {
toggleTodo(n, todo) {
const hidden = todo.isHidden;
if (hidden) {
this.modifyTodo(n, todo);
todo.isHidden = false;
} else {
todo.isHidden = true;
}
},
modifyTodo(n, todo) {
//Some logic...
}
},
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<div id="app">
<div v-for="(todo, n) in todos">
<i class="fas fa-minus ml-2"></i>
<li class="mt-2 todo">
{{ todo.name }}
</li>
<li class="button-container">
<input class="ml-5 border border-primary rounded" v-if="!todo.isHidden" v-model="todo.name">
<button @click="toggleTodo(n, todo)">
<i v-if="todo.isHidden" class="THIS-CLICK">click-this</i>
<i v-else class="far fa-save">save</i>
</button>
</li>
</div>
</div>
Если вы не можете этого сделать, вы можете go добавить новый ключ к данным, например: hiddenTodos
, который будет массивом идентификаторов / a уникальный идентификатор задачи, которую вы выбрали, чтобы скрыть.
в шаблоне, это будет примерно так:
<button @click="hiddenTodos.push(todo)">
...
<div v-if="hiddenTodos.includes(todo)"