vue.draggable.next 中文文档 - itxst.com
问题描述 :在draggable标签中定义的组件,通过ref不能正确拿到相应数组
一、代码-验证过程
在vue3中定义组件的ref,如果有多个相同名称的组件,会将ref.value的值变为数组。
在vue.draggable.next提供的draggable标签中定义组件,如果有多个相同名称的组件,ref.value的值为循环后的最后一个数据。
1、index.vue中的代码
html
<template>
<div class="">
<draggable
:list="perList"
ghost-class="ghost"
chosen-class="chosenClass"
animation="300"
@start="onStart"
@end="onEnd"
>
<template #item="{ element,index }">
<div class="item">
<TestChild :index="index" :info="element" ref="dragRef"/>
</div>
</template>
</draggable>
<hr>
<div v-for="i in 3" class="item">
<TestChild :index="i" :info="perList[i]" ref="vforChild"/>
</div>
</div>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import draggable from "vuedraggable";
import TestChild from "./children/00-test.vue";
let dragRef = ref([])
let vforChild = ref([])
const perList = reactive([
{name:'薛薛',age:18},
{name:'婷婷',age:18},
{name:'大大',age:1},
{name:'小小',age:1},
])
function onStart(){
console.log(dragRef,'dragRef')
console.log(vforChild,'vforChild')
}
function onEnd(){
console.log('拖拽结束');
}
</script>
<style lang="scss" scoped>
.item{
width: 200px;
border: 1px solid #333;
margin: 3px auto;
}
</style>
2、子组件代码
html
<template>
<div class="">
{{ index }} - {{ info.name }}
</div>
</template>
<script setup lang="ts">
let props = defineProps(["index","info"])
defineExpose({name:props.info.name})
</script>
<style lang="scss" scoped>
</style>
3、页面打印结果
二、解决方式:使用回调函数形式定义组件的ref
代码如下:
html
<draggable
:list="perList"
ghost-class="ghost"
chosen-class="chosenClass"
animation="300"
@start="onStart"
@end="onEnd"
>
<template #item="{ element,index }">
<div class="item">
<TestChild :index="index" :info="element" :ref="r=>dragRef[index] = r"/>
</div>
</template>
</draggable>
//let dragRef = ref([])
打印结果: