React-dnd: monitor.isDragging () أحيانًا ترجع القيمة false عندما يجب أن تعيد القيمة true

تم إنشاؤها على ٩ يوليو ٢٠١٥  ·  12تعليقات  ·  مصدر: react-dnd/react-dnd

عند استخدام قائمتين قابلتين للتشغيل المتبادل أو أكثر ، فإن monitor.isDragging () ترجع القيمة false أحيانًا عندما يجب أن تعود صحيحة عند سحب عنصر من حاوية إلى أخرى.

الإعداد: بدءًا من العرض التوضيحي البسيط القابل للفرز ، أضف حاوية أخرى ومجموعة من الكائنات القابلة للفرز. يجب أن تكون البطاقات قابلة للسحب من حاوية إلى أخرى ، وقابلة للفرز داخل الحاوية الخاصة بها ، وقابلة للفرز حيث يتم سحبها من حاوية إلى أخرى.

تحدث المشكلة عند نقل بطاقة من حاوية إلى أخرى. يعتمد مكون البطاقة على خاصية isDragging (التي يتم حقنها بواسطة مصمم DragSource) لتحديد التعتيم ، ومع ذلك ، عندما يتم سحب العنصر من حاوية إلى أخرى ، تقوم الشاشة العالمية بتغيير sourceId الذي لم يعد يطابق المكون المسحوب وينتهي بالعودة خطأ بالنسبة للمكالمات إلى isDragging عندما يجب أن يعود صحيحًا.

نظرًا لأن مصدر السحب يتطلب بالفعل مفتاحًا فريدًا عالميًا متسقًا لكل كائن قابل للسحب (الأشياء الأخرى تسيء التصرف حقًا إذا تغيرت مفاتيح المكون القابل للسحب في أي وقت) ، فهل يمكن للرمز استخدام هذا المفتاح عند تعيين sourceId بحيث يعمل السحب من حاوية واحدة بشكل صحيح؟

اسمحوا لي أن أعرف إذا كنت بحاجة لرؤية رمز المثال. يستند الكود الخاص بي الذي يوضح هذه المشكلة إلى العرض التوضيحي البسيط القابل للفرز.

التعليق الأكثر فائدة

لكي يعمل isDragging عبر شجرة المكونات ، يرجى تنفيذ isDragging يدويًا على مصدر السحب.

const ingredientSource = {
    beginDrag(props) {
        return { ingredient: props.ingredient };
    },
    isDragging(props, monitor) {
        return props.ingredient === monitor.getItem().ingredient;
    }
};

راجع مستندات DragSource :

isDragging(props, monitor) : اختياري. بشكل افتراضي ، يعتبر مصدر السحب الذي بدأ عملية السحب فقط بمثابة سحب. يمكنك تجاوز هذا السلوك بتحديد طريقة isDragging مخصصة. قد يُرجع شيئًا مثل props.id === monitor.getItem().id . قم بذلك إذا كان من الممكن إلغاء تثبيت المكون الأصلي أثناء السحب ثم "إحيائه" لاحقًا مع أحد الوالدين المختلفين. على سبيل المثال ، عند تحريك بطاقة عبر القوائم في لوحة Kanban ، فأنت تريدها أن تحتفظ بالمظهر المسحوب - على الرغم من أنه من الناحية الفنية ، يتم إلغاء تثبيت المكون ويتم تثبيت بطاقة مختلفة في كل مرة تقوم بنقلها إلى قائمة أخرى. _ ملاحظة: لا يمكنك استدعاء monitor.isDragging() داخل هذه الطريقة ._

هل هذا يساعد؟

ال 12 كومينتر

amoenk نعم ، سنحتاج إلى مثال على كود لمساعدتك.

شكرا لمساعدتك! هذا مثال عملي: http://notlouieagain.com/~amoenk/dnd/

وهذا الرابط لتصفح الكود المفكك: http://notlouieagain.com/~amoenk/dnd/js/

أوه ، لقد قمت بتضمين الكود التجريبي الأصلي البسيط القابل للفرز هناك أيضًا أثناء تصحيح الأخطاء ، لكن المكونات المهمة هي Ingredient و IngredientGroup.

لقد ألقيت نظرة على الكود الخاص بك ولا يمكنني العثور على مكون DnDStudy . هل يمكنك أن تريني رمزك الكامل وشفرتك فقط. يمكنك إزالة الكود التجريبي.

تمت إزالة الكود التجريبي ، مكون DnDStudy هو أحد مكونات الصفحة هنا: http://notlouieagain.com/~amoenk/dnd/js/pages/DnDStudy.react.js

حسنًا ، لقد ألقيت نظرة وأعتقد أنها قد تكون مشكلة بسبب المفاتيح IngredientGroup داخل DnDStudy . بدلاً من الاعتماد على فهرس المصفوفة ، حاول استخدام معرّف فريد مشابه لمعرّف Ingredient داخل IngredientGroup .

تم تحديث الرمز ، ولكن لا تزال نفس المشكلة.

موافق. كنت مخطئا حينها.

gaearon يمكنك المساعدة؟

لكي يعمل isDragging عبر شجرة المكونات ، يرجى تنفيذ isDragging يدويًا على مصدر السحب.

const ingredientSource = {
    beginDrag(props) {
        return { ingredient: props.ingredient };
    },
    isDragging(props, monitor) {
        return props.ingredient === monitor.getItem().ingredient;
    }
};

راجع مستندات DragSource :

isDragging(props, monitor) : اختياري. بشكل افتراضي ، يعتبر مصدر السحب الذي بدأ عملية السحب فقط بمثابة سحب. يمكنك تجاوز هذا السلوك بتحديد طريقة isDragging مخصصة. قد يُرجع شيئًا مثل props.id === monitor.getItem().id . قم بذلك إذا كان من الممكن إلغاء تثبيت المكون الأصلي أثناء السحب ثم "إحيائه" لاحقًا مع أحد الوالدين المختلفين. على سبيل المثال ، عند تحريك بطاقة عبر القوائم في لوحة Kanban ، فأنت تريدها أن تحتفظ بالمظهر المسحوب - على الرغم من أنه من الناحية الفنية ، يتم إلغاء تثبيت المكون ويتم تثبيت بطاقة مختلفة في كل مرة تقوم بنقلها إلى قائمة أخرى. _ ملاحظة: لا يمكنك استدعاء monitor.isDragging() داخل هذه الطريقة ._

هل هذا يساعد؟

يعمل بشكل مثالي! لابد أنه فاتك ذلك في المستندات.

شكرا لجميع التعليمات الخاصة بك! سأغلق التذكرة.

لا مشكلة. سررت بالمساعدة.

مه! الروابط إلى http://notlouieagain.com/ لا تستجيب ...

لقد وجدت السبب الجذري لمشكلتي. اضطررت إلى التوقف عن استخدام DragDropContextProvider لالتفاف DropTargets و DragSources. انظر المثال أدناه.
http://react-dnd.github.io/react-dnd/docs-drag-drop-context-provider.html

export default class YourApp {
    render() {
        return (
            <DragDropContextProvider backend={HTML5Backend}>
                /* ... */
            </DragDropContextProvider>
        )
    }
}

بدلاً من ذلك ، كان علي استخدام DragDropContext لإغلاق صفي بالكامل كما هو موضح أدناه.
http://react-dnd.github.io/react-dnd/docs-drag-drop-context.html

class YourApp {
    /* ... */
}
export default DragDropContext(HTML5Backend)(YourApp)

هذا على الفور حل المشكلة بالنسبة لي.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات