React-dnd: monitor.isDragging() terkadang mengembalikan false ketika seharusnya mengembalikan true

Dibuat pada 9 Jul 2015  ·  12Komentar  ·  Sumber: react-dnd/react-dnd

Saat menggunakan dua atau lebih daftar yang dapat diurutkan yang dapat dioperasikan, monitor.isDragging() terkadang mengembalikan false ketika seharusnya mengembalikan true saat menyeret item dari satu wadah ke wadah lainnya.

Setup: mulai dari demo sortable sederhana, tambahkan container lain dan set objek sortable. Kartu harus dapat ditarik dari satu wadah ke wadah lainnya, dapat diurutkan di dalam wadahnya sendiri, dan dapat diurutkan saat diseret dari satu wadah ke wadah lainnya.

Masalah terjadi saat memindahkan kartu dari satu wadah ke wadah lainnya. Komponen kartu bergantung pada properti isDragging (disuntikkan oleh dekorator DragSource) untuk menentukan opacity, namun, ketika item diseret dari satu wadah ke wadah lainnya, monitor global mengubah sourceId yang tidak lagi cocok dengan komponen yang diseret dan akhirnya kembali false untuk panggilan ke isDragging ketika seharusnya mengembalikan true.

Karena sumber seret sudah memerlukan kunci unik global yang konsisten per objek yang dapat diseret (hal-hal lain benar-benar tidak berfungsi jika kunci komponen yang dapat diseret berubah kapan saja), dapatkah kode menggunakan kunci itu saat menetapkan sourceId sehingga menyeret dari satu wadah berfungsi dengan benar?

Beri tahu saya jika Anda perlu melihat kode contoh. Kode saya yang menunjukkan masalah ini didasarkan pada demo sederhana yang dapat diurutkan.

Komentar yang paling membantu

Agar isDragging bekerja di seluruh pohon komponen, harap terapkan isDragging secara manual pada sumber seret Anda.

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

Lihat DragSource dokumen :

isDragging(props, monitor) : Opsional. Secara default, hanya sumber seret yang memulai operasi seret yang dianggap menyeret. Anda dapat mengganti perilaku ini dengan mendefinisikan metode isDragging kustom. Mungkin mengembalikan sesuatu seperti props.id === monitor.getItem().id . Lakukan ini jika komponen asli mungkin dilepas selama menyeret dan kemudian "dibangkitkan" dengan induk yang berbeda. Misalnya, saat memindahkan kartu melintasi daftar di papan Kanban, Anda ingin kartu tersebut mempertahankan tampilan yang diseret—meskipun secara teknis, komponen dilepas dan komponen yang berbeda dipasang setiap kali Anda memindahkannya ke daftar lain. _Catatan: Anda tidak boleh memanggil monitor.isDragging() di dalam metode ini._

Apakah ini membantu?

Semua 12 komentar

@amoenk Ya, kami membutuhkan kode contoh untuk membantu Anda.

Terima kasih atas bantuan Anda! Inilah contoh kerjanya: http://notlouieagain.com/~amoenk/dnd/

Dan tautan ini untuk menelusuri kode yang tidak dibundel: http://notlouieagain.com/~amoenk/dnd/js/

Oh, saya menyertakan kode demo sederhana yang dapat diurutkan di sana juga saat saya melakukan debug, tetapi komponen penting adalah Ingredient dan IngredientGroup.

Saya telah melihat kode Anda dan sepertinya saya tidak dapat menemukan komponen DnDStudy . Bisakah Anda menunjukkan kode lengkap Anda dan hanya milik Anda. Anda dapat menghapus kode demo.

Kode demo dihapus, komponen DnDStudy adalah komponen halaman di sini: http://notlouieagain.com/~amoenk/dnd/js/pages/DnDStudy.react.js

Ok saya sudah melihat dan saya yakin itu mungkin masalah karena kunci IngredientGroup di dalam DnDStudy . Daripada mengandalkan indeks array, coba gunakan beberapa id unik yang mirip dengan Ingredient inside IngredientGroup .

Kode diperbarui, tetapi masalah masih sama.

Baik. Aku salah saat itu.

@gaearon bisa bantu?

Agar isDragging bekerja di seluruh pohon komponen, harap terapkan isDragging secara manual pada sumber seret Anda.

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

Lihat DragSource dokumen :

isDragging(props, monitor) : Opsional. Secara default, hanya sumber seret yang memulai operasi seret yang dianggap menyeret. Anda dapat mengganti perilaku ini dengan mendefinisikan metode isDragging kustom. Mungkin mengembalikan sesuatu seperti props.id === monitor.getItem().id . Lakukan ini jika komponen asli mungkin dilepas selama menyeret dan kemudian "dibangkitkan" dengan induk yang berbeda. Misalnya, saat memindahkan kartu melintasi daftar di papan Kanban, Anda ingin kartu tersebut mempertahankan tampilan yang diseret—meskipun secara teknis, komponen dilepas dan komponen yang berbeda dipasang setiap kali Anda memindahkannya ke daftar lain. _Catatan: Anda tidak boleh memanggil monitor.isDragging() di dalam metode ini._

Apakah ini membantu?

Bekerja dengan sempurna! Pasti melewatkan itu di dokumen.

Terima kasih atas seluruh bantuan Anda! Saya akan menutup tiketnya.

Tidak masalah. Saya senang bisa membantu.

meh! Tautan ke http://notlouieagain.com/ tidak merespons ...

Saya menemukan akar penyebab masalah saya. Saya harus berhenti menggunakan DragDropContextProvider untuk membungkus DropTargets dan DragSources saya. Lihat contoh di bawah ini.
http://react-dnd.github.io/react-dnd/docs-drag-drop-context-provider.html

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

Sebagai gantinya, saya harus menggunakan DragDropContext untuk membungkus seluruh kelas saya seperti di bawah ini.
http://react-dnd.github.io/react-dnd/docs-drag-drop-context.html

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

Ini segera memperbaiki masalah bagi saya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat