Javascript 移动到其他阵列时Vue保持活动组件
当将绑定项对象移动到不同的数据数组时,我试图使组件保持活动状态。因为它被移动了,所以默认的keep-alive标记不起作用 当我的应用程序中的动态组件使用外部库时,我需要它来缩短加载时间 简化示例:() HTML:Javascript 移动到其他阵列时Vue保持活动组件,javascript,vue.js,vuejs2,vue-component,Javascript,Vue.js,Vuejs2,Vue Component,当将绑定项对象移动到不同的数据数组时,我试图使组件保持活动状态。因为它被移动了,所以默认的keep-alive标记不起作用 当我的应用程序中的动态组件使用外部库时,我需要它来缩短加载时间 简化示例:() HTML: <div id="app"> <div v-for="list in lists"> <h1>{{ list.title }}</h1> <ul> <draggable v-model=
<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>
{{list.title}}
JS:
Vue.component('list-item'{
道具:{
内容:{
必填项:true
}
},
挂载(){
document.body.insertAdjacentHTML('beforeend','Mounted!');
},
模板:“{{content} ”
})
新Vue({
el:“应用程序”,
数据:{
清单:[
{
标题:“列表1”,
项目:[
{键:'item1',内容:'item1'},
{键:'item2',内容:'item2'},
{键:'item3',内容:'item3'}
]
},
{
标题:“列表2”,
项目:[
{键:'item4',内容:'item4'},
{键:'item5',内容:'item5'},
{键:'item6',内容:'item6'}
]
}
]
}
})
我调查了你的问题,我想我可能找到了解决方案,我不能用js fiddle来解决,但我会尝试解释一下:
在js fiddle中,挂载的事件挂接在列表项组件中,因此每次状态更改(拖动时)都会触发事件
我使用一个主模板组件(componentX)创建了一个安装程序,并安装了一个函数,然后创建了一个单独的列表项组件
在我的示例中,您将在开始时看到挂载的两次,这是正常的,因为我们有两个列表!但是,当您开始拖放时,将不会获得额外的装载事件
您可以从以下位置下载zip格式的解决方案:
这是一个vue cli项目,因此您只需
npm运行dev
即可启动本地服务器如果问题只是缓存昂贵的html构建,您可以通过从模板中删除列表项
组件并提前在app.mounted()
中构建它们来实现
这在真实场景中的效果取决于item.content
的性质及其生命周期
console.clear()
常量ListItem=Vue.component('list-item'{
道具:{
内容:{
必填项:true
}
},
挂载(){
document.body.insertAdjacentHTML('beforeend','Mounted!');
},
模板:“{{content} ”
})
新Vue({
el:“应用程序”,
方法:{
getHtml(内容){
const li=新列表项({propsData:{content}});
李。$mount()
返回li.$el.outerHTML
}
},
挂载(){
this.lists.forEach(list=>{
list.items.forEach(item=>{
const cacheHtml=this.getHtml(item.content)
set(项目'cacheHtml',cacheHtml)
})
})
},
数据:{
清单:[
{
标题:“列表1”,
项目:[
{键:'item1',内容:'item1'},
{键:'item2',内容:'item2'},
{键:'item3',内容:'item3'}
]
},
{
标题:“列表2”,
项目:[
{键:'item4',内容:'item4'},
{键:'item5',内容:'item5'},
{键:'item6',内容:'item6'}
]
}
]
}
})
ul{
边缘底部:20px;
}
李:悬停{
颜色:蓝色;
光标:移动;
}
h1{
字体大小:20px;
字体大小:粗体;
}
{{list.title}}
我没有看到任何组件损坏,也没有看到任何库。你的问题很不清楚。我也看到了一些道具,但没有父组件和一些普通的JS:document.body.insertAdjacentHTML('beforeend','Mounted!')。我确信有更好的方法来做到这一点,即使我不知道您试图实现什么。这只是一个复制问题的快速模型,而不是我的实际代码。在本例中,当您将项目拖动到不同的列表时,它会重新呈现组件,从而再次装载它。(因此是脏js代码,表明它确实如此)对于您想要做的事情,draggable
暴露fire的事件似乎太早或太迟。也许可以使用ticks做一些事情,但是在我想知道为什么要让组件保持活动之前。因为如果要保留数据,我认为可以使用draggable
的componentData
选项。这是为了保留被外部库(如WYSIWYG和图像编辑器)更改的DOM,因为加载这些库可能需要一些时间。数据没有问题,因为我在应用程序中使用Vuex:)看起来Vue.Draggable在拖动时会在“拖放区域”中添加一个新组件并删除以前的组件。看来你需要修改他们的代码才能得到你想要的东西。你能重新上传吗?404找不到。@Stanniebeer,你的问题有进展吗,因为赏金明天就要结束了?看来在我的情况下,在模板之外加载组件是唯一的方法。哦,好的,谢谢!我将对此进行一次尝试,否则我将创建自己对Vue.Draggable的理解,它只会在视觉上发生变化,并在数据中保存顺序。这可能不是唯一的方法,但我以前看过Vue可拖动和可排序的代码,这有点费时。我目前在一个Vue项目中使用了dragula,该项目将通过添加一个内部组件(目前是上的v-for)使其适应您的场景。如果有任何不同,将发布。找到了一种方法来实现它,远非理想,但它可以工作:-从DragTable中删除v-model,使更改仅可见-克隆初始列表,使用v-for的克隆-手动捕获@sort,根据事件startIndex、endIndex、from元素和to元素手动更改实际列表。-如果你从列表中添加或删除项目,那么对两个列表都这样做。这听起来是个好主意-bu
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' }
]
}
]
}
})