React-dnd: HTML5рдмреИрдХрдПрдВрдб рддрдм рдЦреАрдВрдЪрдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬрдм DOM рдореЗрдВ рдРрд╕реЗ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдбреНрд░реИрдЧ рдЗрд╡реЗрдВрдЯ рдореЗрдВ рдкреНрд░рдХрдЯ/рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ: CHROME

рдХреЛ рдирд┐рд░реНрдорд┐рдд 1 рдЕрдкреНрд░реИрд▓ 2020  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: react-dnd/react-dnd

рдмрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
рд╣рдореЗрдВ html5рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╣рдореЗрдВ рдбреНрд░реИрдЧ рдХрд┐рдП рдЧрдП рддрддреНрд╡ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдВрддрд░рд╛рд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗрд╡рд▓ рддрднреА рджрд┐рдЦрд╛рдИ рджреЗрдВ рдЬрдм рддрддреНрд╡ рдЦреАрдВрдЪ рд░рд╣рд╛ рд╣реЛред
рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдореЗрдВ рд╕рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреНрд░реЛрдо рдореЗрдВ, рдХрд╛рд░реНрдб рд╕реНрдЯрд╛рд░реНрдЯ рдбреНрд░реИрдЧрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕реНрдЯреЙрдк рдбреНрд░реИрдЧрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВред

рдкреНрд░рдЬрдирди
https://codesandbox.io/s/react-dnd-sortable-holes-bq2oe
рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рдЦреАрдВрдЪрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдФрд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦреАрдВрдЪрдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдирд╛рд░рдВрдЧреА рдЕрдВрддрд░рд╛рд▓ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред
image

image

рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд░реЛрдо рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯ рдЗрд╡реЗрдВрдЯ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕реНрдЯреЙрдк рдЗрд╡реЗрдВрдЯ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрдВрд╕реЛрд▓ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
image

  • рдУрдПрд╕: [рдЬреИрд╕реЗ рдЖрдИрдУрдПрд╕]
  • рдмреНрд░рд╛рдЙрдЬрд╝рд░: рдХреНрд░реЛрдо рд╕рдВрд╕реНрдХрд░рдг 80.0.3987.162 рдореЗрдВ рдмрдЧ, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 74.0 (64-рдмрд┐рдЯ) рдореЗрдВ рд╕рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рдорд╛рд░реА рдЯреАрдо рдиреЗ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд╣реБрдХ рдмрдирд╛рддреЗ рд╣реБрдП рд░рд╛рдЬреНрдп рдХреЗ рдХрд╛рдордХрд╛рдЬ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдмрдЧ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп рдпрд╣рд╛рдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИред

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

рдбреНрд░реИрдЧрд┐рдВрдЧ рд╕реНрдЯреЗрдЯрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдФрд░ рдПрдХ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред

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>
  );
};

рджреВрд╕рд░реЗ, рдбреНрд░реИрдЧ рд╕реНрдЯрд╛рд░реНрдЯ рдлрдВрдХреНрд╢рди рдореЗрдВ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрдВрддрд┐рдо рдкреНрд░реЗрд╖рдг рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред

  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
  ];

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХрддреНрд░рд┐рдд рдореВрд▓реНрдп рдХреЛ рдЦреАрдВрдЪрдХрд░ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рдФрд░ рдПрдХ рд░рд╛рдЬреНрдп рдЪрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЬреЛ рдореИрдВ рдШрдЯрдХреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдЯрд┐рд▓ рдореЗрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореБрдЭреЗ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдпрд╛ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
https://codesandbox.io/s/react-dnd-sortable-holes-vxeus

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдореБрдЭреЗ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрдЬрд╛рдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ isDraging рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рд╣рдорд╛рд░реА рдЯреАрдо рдиреЗ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд╣реБрдХ рдмрдирд╛рддреЗ рд╣реБрдП рд░рд╛рдЬреНрдп рдХреЗ рдХрд╛рдордХрд╛рдЬ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдмрдЧ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп рдпрд╣рд╛рдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИред

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

рдбреНрд░реИрдЧрд┐рдВрдЧ рд╕реНрдЯреЗрдЯрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдФрд░ рдПрдХ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред

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>
  );
};

рджреВрд╕рд░реЗ, рдбреНрд░реИрдЧ рд╕реНрдЯрд╛рд░реНрдЯ рдлрдВрдХреНрд╢рди рдореЗрдВ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрдВрддрд┐рдо рдкреНрд░реЗрд╖рдг рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред

  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
  ];

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХрддреНрд░рд┐рдд рдореВрд▓реНрдп рдХреЛ рдЦреАрдВрдЪрдХрд░ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рдордХрд╛рдЬ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

gaearon picture gaearon  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dant00ine picture dant00ine  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rubayethossain picture rubayethossain  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

croraf picture croraf  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

antoineBernard picture antoineBernard  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ