【发布时间】:2018-09-18 20:12:51
【问题描述】:
在将绑定的项目对象移动到不同的数据数组时,我试图让组件保持活动状态。因为它被移动了,所以默认的 keep-alive 标签不起作用。
当我的应用中的动态组件使用外部库时,我需要它来缩短加载时间。
简化示例: (https://jsfiddle.net/eywraw8t/24419/)
HTML:
<div id="app">
<div v-for="list in lists">
<h1>{{ list.title }}</h1>
<ul>
<draggable v-model="list.items" :options="{group: 'list-items'}">
<list-item
v-for="item in list.items"
:key="item.key"
:content="item.content">
</list-item>
</draggable>
</ul>
</div>
</div>
JS:
Vue.component('list-item', {
props: {
content: {
required: true
}
},
mounted () {
document.body.insertAdjacentHTML('beforeend', 'Mounted! ');
},
template: '<li>{{ content }}</li>'
})
new Vue({
el: "#app",
data: {
lists: [
{
title: 'List 1',
items: [
{ key: 'item1', content: 'Item 1' },
{ key: 'item2', content: 'Item 2' },
{ key: 'item3', content: 'Item 3' }
]
},
{
title: 'List 2',
items: [
{ key: 'item4', content: 'Item 4' },
{ key: 'item5', content: 'Item 5' },
{ key: 'item6', content: 'Item 6' }
]
}
]
}
})
【问题讨论】:
-
我没有看到任何组件破坏,也没有看到任何库。你的问题很不清楚。我还看到了一些道具,但没有父组件和一些 Vanilla JS:document.body.insertAdjacentHTML('beforeend', 'Mounted!') 我相信即使我不知道你是什么,也有更好的方法来做到这一点正在努力实现。
-
这只是一个复制问题的快速模型,而不是我的实际代码。在此示例中,当您将项目拖动到不同的列表时,它会重新渲染组件,从而再次安装它。 (因此肮脏的 js 代码,以显示它确实如此)
-
似乎
draggable暴露的事件对于您想要做的事情来说太早或太晚了。使用滴答声可能会做一些事情,但在我想知道为什么要让组件保持活动之前。因为如果是为了保存数据,我觉得可以使用draggable的componentData选项。 -
这是为了保存被 WYSIWYG 和图像编辑器等外部库更改的 DOM,因为这些可能需要一些时间来加载。数据没有问题,因为我在我的应用程序中使用 Vuex :)
-
似乎 Vue.Draggable 在拖动时会在“放置区”中添加一个新组件并删除之前的组件。看来你需要修改他们的代码才能得到你需要的东西。
标签: javascript vue.js vuejs2 vue-component