Javascript 移动到其他阵列时Vue保持活动组件

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=

当将绑定项对象移动到不同的数据数组时,我试图使组件保持活动状态。因为它被移动了,所以默认的keep-alive标记不起作用

当我的应用程序中的动态组件使用外部库时,我需要它来缩短加载时间

简化示例:()

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>

{{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' }
            ]
          }
        ]
      }
    })