У меня есть список v-for
, который содержит компонент. Внутри компонента я отображаю либо <div>
, либо <input>
в зависимости от значения свойства. Проблема в том, что когда я изменяю значение свойства, обновляются все элементы в v-for, а не только компонент, который был изменен. Это не проблема для небольших приложений, но я заметил значительное снижение производительности при работе с большими наборами данных.
Итак, основной вопрос:
Как можно избежать рендеринга всех компонентов при обновлении только одного компонента?
Я положил все это в JSFiddle здесь . Обратите внимание, что когда вы нажимаете кнопку, чтобы показать ввод компонента C, все компоненты перерисовываются (отображаются в консоли), а не только компонент C.
HTML
<div id="app">
<button @click="showinput = 'C'">
Show C input
</button>
<br>
<br>
<div v-for="item in list" :key="item.id">
<list-item :item=item :showinput="showinput"></list-item>
</div>
</div>
<template id="list-item"> <span> <div v-if="showinput !== item.name">
{{item.name}}</div>
<input v-else
type="text"
v-model.lazy="item.name" >
</span>
</template>
JS
Vue.component('list-item', {
template: '#list-item',
props: ['item', 'showinput'],
data () {
return {
}},
beforeUpdate() {
console.log("Updating " + this.item.name)
}
});
// create a new Vue instance and mount it to our div element above with the id of app
var vm = new Vue({
el: '#app',
data: {
list: [{name: "A", id: 1}, {name: "B", id: 2}, {name: "C", id: 3},],
showinput: "X"
}
});