hcg1023 / vue3-dnd

React Dnd implementation in Vue Composition-api.
https://www.vue3-dnd.com
MIT License
642 stars 52 forks source link

[fix]: Cannot have two HTML5 backends at the same time. #89

Closed kn-msz closed 2 weeks ago

kn-msz commented 2 weeks ago

react-dnd 解决方案 https://github.com/react-dnd/react-dnd/issues/186

hcg1023 commented 2 weeks ago

没有理解你的问题,能详细说说吗

kn-msz commented 2 weeks ago

没有理解你的问题,能详细说说吗

应用定制中心-Google-Chrome-2024-10-24-17-32-39

react-dnd 是这么解决的 https://github.com/react-dnd/react-dnd/issues/186

hcg1023 commented 2 weeks ago

懂了。在vue3-dnd里,你也可以通过类似的代码解决这个问题,你可以在全局实例化backend,并传递给DndProvider

hcg1023 commented 2 weeks ago

我们的DndProvider也是支持manager参数的

kn-msz commented 2 weeks ago

useDndContextInjector useDndContextProvider 这个是吗

我们的DndProvider也是支持manager参数的

hcg1023 commented 2 weeks ago
image

用DndProvider组件也可以,用useDndContextProvider也可以

kn-msz commented 2 weeks ago

有实例吗

image 用DndProvider组件也可以,用useDndContextProvider也可以

hcg1023 commented 2 weeks ago

还有一种方法更加简单,你可以传递一个context对象给DndProvider组件

hcg1023 commented 2 weeks ago

或者将你的DndProvider提取到App.vue,均可以解决你的问题

kn-msz commented 2 weeks ago

context

对象内容是什么

hcg1023 commented 2 weeks ago

任意,空对象也可以,最好是在你的两个页面下,分别唯一,即可

hcg1023 commented 2 weeks ago

https://github.com/react-dnd/react-dnd/issues/186#issuecomment-978206387 也可以参考这条,将context传递为上层element对象

hcg1023 commented 2 weeks ago

确保在你的两个页面下,这两个context不相同就可以了

kn-msz commented 2 weeks ago

> react-dnd/react-dnd#186 (comment) 也可以参考该链接,将context传递为上层element对象


参考代码

import {  defineComponent, ref, onMounted, watch } from 'vue'
import { HTML5Backend } from 'react-dnd-html5-backend'
import { DndProvider } from 'vue3-dnd'

const DndWrapper = defineComponent({
    props: {
        id: {
            type: String,
            required: true,
        },
    },
    setup(props, {slots}) {
        const context = ref<HTMLElement | null>(null);

        onMounted(() => {
            context.value = document.getElementById(props.id);
        });

        watch(() => props.id, (newId) => {
            context.value = document.getElementById(newId);
        });

        return () => (
            context.value ? (
                <DndProvider backend={ HTML5Backend } options={ {rootElement: context.value} }>
                    { slots?.default?.() }
                </DndProvider>
            ) : null
        );
    },
})

可以了 多谢老板