React-dnd: HTML5Backend berhenti menyeret ketika ada elemen di DOM yang muncul/menghilang di acara seret: CHROME

Dibuat pada 1 Apr 2020  ·  3Komentar  ·  Sumber: react-dnd/react-dnd

Jelaskan bugnya
Kami memiliki masalah serius dengan html5backend. Kami perlu membuat beberapa celah untuk memandu pengguna di mana harus meletakkan elemen yang diseret, kami ingin celah itu hanya terlihat saat elemen sedang diseret.
Di firefox berfungsi sempurna tetapi di chrome, kartu meluncurkan acara berhenti menyeret segera setelah acara mulai menyeret.

Reproduksi
https://codesandbox.io/s/react-dnd-sortable-holes-bq2oe
Setiap kartu dapat diseret dan ketika pengguna mulai menyeret celah oranye muncul.
image

image

Di firefox berfungsi seperti pesona, tetapi di chrome acara berhenti diluncurkan segera setelah acara mulai.

Seperti yang Anda lihat di konsol:
image

  • OS: [misalnya iOS]
  • Browser: Bug di Chrome Versión 80.0.3987.162, bekerja sempurna di firefox 74.0 (64-bit)

Bantuan apa pun akan sangat dihargai, kami sangat membutuhkan fungsionalitas ini.

Komentar yang paling membantu

Tim kami telah meningkatkan solusi keadaan dengan membuat kait khusus untuk penyedia seret dan lepas, jika ada di antara Anda yang menghadapi masalah ini, berikut adalah solusi saat bug diselesaikan.

https://codesandbox.io/s/react-dnd-sortable-gaps-custom-9tl13

Bagian utama terdiri dari menentukan Konteks dan Penyedia untuk menyimpan status seret.

const DndContext = React.createContext([{}, () => {}]);

const DndCustomProvider = props => {
  const [state, setState] = useState({ dragging: false });

  return (
    <DndProvider backend={props.backend}>
      <DndContext.Provider value={[state, setState]}>
        {props.children}
      </DndContext.Provider>
    </DndProvider>
  );
};

Kedua, menggunakan setTimeout dalam fungsi drag start, end yang dikirim dihindari.

  const [context, setContext] = useContext(DndContext);

  const [collected, dragRef] = useDrag({
    ...,
    begin: monitor => {
      setTimeout(() => {
        setContext(() => ({ dragging: true }));
      }, 0);

      if (begin) {
        begin(monitor);
      }
    },
    end: (item, monitor) => {
      setContext(() => ({ dragging: false }));

      if (end) {
        end(item, monitor);
      }
    },
    ...
  });

  return [
    {
      ...collected,
      isDragging: context.dragging
    },
    dragRef
  ];

Dan akhirnya, isDragging mengumpulkan nilai ditimpa dengan nilai konteks.

Semua 3 komentar

Saya telah menemukan solusi, banyak membaca, untuk masalah ini, menetapkan batas waktu dan variabel status yang saya lewati melalui komponen, saya tidak terlalu menyukainya, karena dalam kasus sederhana ini mudah dilakukan, tetapi dalam kompleks kasus saya harus menggunakan konteks atau sesuatu yang serupa untuk membuat semuanya bekerja.
https://codesandbox.io/s/react-dnd-sortable-holes-vxeus

Saya harap Anda dapat membimbing saya melalui solusi yang lebih baik, saya ingin menggunakan isDragging dari perpustakaan alih-alih solusi ini.

Tim kami telah meningkatkan solusi keadaan dengan membuat kait khusus untuk penyedia seret dan lepas, jika ada di antara Anda yang menghadapi masalah ini, berikut adalah solusi saat bug diselesaikan.

https://codesandbox.io/s/react-dnd-sortable-gaps-custom-9tl13

Bagian utama terdiri dari menentukan Konteks dan Penyedia untuk menyimpan status seret.

const DndContext = React.createContext([{}, () => {}]);

const DndCustomProvider = props => {
  const [state, setState] = useState({ dragging: false });

  return (
    <DndProvider backend={props.backend}>
      <DndContext.Provider value={[state, setState]}>
        {props.children}
      </DndContext.Provider>
    </DndProvider>
  );
};

Kedua, menggunakan setTimeout dalam fungsi drag start, end yang dikirim dihindari.

  const [context, setContext] = useContext(DndContext);

  const [collected, dragRef] = useDrag({
    ...,
    begin: monitor => {
      setTimeout(() => {
        setContext(() => ({ dragging: true }));
      }, 0);

      if (begin) {
        begin(monitor);
      }
    },
    end: (item, monitor) => {
      setContext(() => ({ dragging: false }));

      if (end) {
        end(item, monitor);
      }
    },
    ...
  });

  return [
    {
      ...collected,
      isDragging: context.dragging
    },
    dragRef
  ];

Dan akhirnya, isDragging mengumpulkan nilai ditimpa dengan nilai konteks.

Adakah yang punya solusi atau ide untuk tambalan untuk masalah ini yang tidak melibatkan solusi seperti itu?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat