插入 v-for 中的组件列表会导致所有剩余的重新创建
Inserting into a component list within v-for cause all remaining recreateed
我在使用 Vue#2.1.6 创建页面内容编辑器时遇到问题。我使用 Vue 动态组件来处理每篇文章。当我将一篇新文章插入 v-for 列表时,所有剩余的文章都被重置为它们的初始状态。这是例子
https://jsfiddle.net/3jowy381/
Vue.component('type-a', {
template: '<div class="style-a" @click="ready">{{context.name}} prepared: {{prepared}}</div>',
props: ['context'],
data: function () {
return {
prepared: false
}
},
methods: {
ready: function () {
this.prepared = true;
}
}
});
Vue.component('type-b', {
template: '<div class="style-b" @click="ready">{{context.name}} prepared: {{prepared}}</div>',
props: ['context'],
data: function () {
return {
prepared: false
}
},
methods: {
ready: function () {
this.prepared = true;
}
}
});
Vue.component('type-c', {
template: '<div class="style-c" @click="ready">{{context.name}} prepared: {{prepared}}</div>',
props: ['context'],
data: function () {
return {
prepared: false
}
},
methods: {
ready: function () {
this.prepared = true;
}
}
});
new Vue({
el: '#main',
data: {
position: 0,
modules: [
{context: {name: 'article-init-a'}, type: 'type-a'},
{context: {name: 'article-init-b'}, type: 'type-b'},
{context: {name: 'article-init-c'}, type: 'type-c'}
]
},
methods: {
insertA: function () {
this.modules.splice(this.position, 0, {context: {name: 'new-article-a'}, type: 'type-a'})
},
insertB: function () {
this.modules.splice(this.position, 0, {context: {name: 'new-article-b'}, type: 'type-b'})
},
insertC: function () {
this.modules.splice(this.position, 0, {context: {name: 'new-article-c'}, type: 'type-c'})
}
}
})
您可以点击文章进行准备,然后插入新的文章。 new 下的所有文章自动变为未准备状态。 Vue 似乎重新创建了它们。有没有办法绕过?
每当您在 modules
中添加新的 context
时,它都会重新呈现 modules
数组中的所有文章,并再次初始化所有这些组件,重置ready
变量为 false。
通过在其中一个元素中放置 mounted 生命周期挂钩,这一点很明显。
一个解决方案是将 prepared
属性 移动到上下文本身,因为它看起来像一篇文章的 属性,所以它可以放在文章名称旁边。假设我已经修改了你的fiddler,请check。
new Vue({
el: '#main',
data: {
position: 0,
modules: [
{context: {name: 'article-init-a', prepared: false}, type: 'type-a'},
{context: {name: 'article-init-b', prepared: false}, type: 'type-b'},
{context: {name: 'article-init-c', prepared: false}, type: 'type-c'}
]
},
methods: {
insertA: function () {
this.modules.splice(this.position, 0, {context: {name: 'new-article-a', prepared: false}, type: 'type-a', prepared: false})
},
....
....
我在使用 Vue#2.1.6 创建页面内容编辑器时遇到问题。我使用 Vue 动态组件来处理每篇文章。当我将一篇新文章插入 v-for 列表时,所有剩余的文章都被重置为它们的初始状态。这是例子 https://jsfiddle.net/3jowy381/
Vue.component('type-a', {
template: '<div class="style-a" @click="ready">{{context.name}} prepared: {{prepared}}</div>',
props: ['context'],
data: function () {
return {
prepared: false
}
},
methods: {
ready: function () {
this.prepared = true;
}
}
});
Vue.component('type-b', {
template: '<div class="style-b" @click="ready">{{context.name}} prepared: {{prepared}}</div>',
props: ['context'],
data: function () {
return {
prepared: false
}
},
methods: {
ready: function () {
this.prepared = true;
}
}
});
Vue.component('type-c', {
template: '<div class="style-c" @click="ready">{{context.name}} prepared: {{prepared}}</div>',
props: ['context'],
data: function () {
return {
prepared: false
}
},
methods: {
ready: function () {
this.prepared = true;
}
}
});
new Vue({
el: '#main',
data: {
position: 0,
modules: [
{context: {name: 'article-init-a'}, type: 'type-a'},
{context: {name: 'article-init-b'}, type: 'type-b'},
{context: {name: 'article-init-c'}, type: 'type-c'}
]
},
methods: {
insertA: function () {
this.modules.splice(this.position, 0, {context: {name: 'new-article-a'}, type: 'type-a'})
},
insertB: function () {
this.modules.splice(this.position, 0, {context: {name: 'new-article-b'}, type: 'type-b'})
},
insertC: function () {
this.modules.splice(this.position, 0, {context: {name: 'new-article-c'}, type: 'type-c'})
}
}
})
您可以点击文章进行准备,然后插入新的文章。 new 下的所有文章自动变为未准备状态。 Vue 似乎重新创建了它们。有没有办法绕过?
每当您在 modules
中添加新的 context
时,它都会重新呈现 modules
数组中的所有文章,并再次初始化所有这些组件,重置ready
变量为 false。
通过在其中一个元素中放置 mounted 生命周期挂钩,这一点很明显。
一个解决方案是将 prepared
属性 移动到上下文本身,因为它看起来像一篇文章的 属性,所以它可以放在文章名称旁边。假设我已经修改了你的fiddler,请check。
new Vue({
el: '#main',
data: {
position: 0,
modules: [
{context: {name: 'article-init-a', prepared: false}, type: 'type-a'},
{context: {name: 'article-init-b', prepared: false}, type: 'type-b'},
{context: {name: 'article-init-c', prepared: false}, type: 'type-c'}
]
},
methods: {
insertA: function () {
this.modules.splice(this.position, 0, {context: {name: 'new-article-a', prepared: false}, type: 'type-a', prepared: false})
},
....
....