рдмрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
рд╣рдореЗрдВ html5рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╣рдореЗрдВ рдбреНрд░реИрдЧ рдХрд┐рдП рдЧрдП рддрддреНрд╡ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдВрддрд░рд╛рд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЕрдВрддрд░рд╛рд▓ рдХреЗрд╡рд▓ рддрднреА рджрд┐рдЦрд╛рдИ рджреЗрдВ рдЬрдм рддрддреНрд╡ рдЦреАрдВрдЪ рд░рд╣рд╛ рд╣реЛред
рдлрд╛рдпрд░рдлреЙрдХреНрд╕ рдореЗрдВ рд╕рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреНрд░реЛрдо рдореЗрдВ, рдХрд╛рд░реНрдб рд╕реНрдЯрд╛рд░реНрдЯ рдбреНрд░реИрдЧрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕реНрдЯреЙрдк рдбреНрд░реИрдЧрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рдЬрдирди
https://codesandbox.io/s/react-dnd-sortable-holes-bq2oe
рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдб рдЦреАрдВрдЪрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдФрд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦреАрдВрдЪрдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдирд╛рд░рдВрдЧреА рдЕрдВрддрд░рд╛рд▓ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред
рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдПрдХ рдЖрдХрд░реНрд╖рдг рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд░реЛрдо рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯ рдЗрд╡реЗрдВрдЯ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕реНрдЯреЙрдк рдЗрд╡реЗрдВрдЯ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрдВрд╕реЛрд▓ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рдФрд░ рдПрдХ рд░рд╛рдЬреНрдп рдЪрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдЬреЛ рдореИрдВ рдШрдЯрдХреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдпрд╣ рдмрд╣реБрдд рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдЯрд┐рд▓ рдореЗрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореБрдЭреЗ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдпрд╛ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
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
];
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХрддреНрд░рд┐рдд рдореВрд▓реНрдп рдХреЛ рдЦреАрдВрдЪрдХрд░ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХрд╛рдордХрд╛рдЬ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ?
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣рдорд╛рд░реА рдЯреАрдо рдиреЗ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд╣реБрдХ рдмрдирд╛рддреЗ рд╣реБрдП рд░рд╛рдЬреНрдп рдХреЗ рдХрд╛рдордХрд╛рдЬ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдмрдЧ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп рдпрд╣рд╛рдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИред
https://codesandbox.io/s/react-dnd-sortable-gaps-custom-9tl13
рдбреНрд░реИрдЧрд┐рдВрдЧ рд╕реНрдЯреЗрдЯрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдФрд░ рдПрдХ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред
рджреВрд╕рд░реЗ, рдбреНрд░реИрдЧ рд╕реНрдЯрд╛рд░реНрдЯ рдлрдВрдХреНрд╢рди рдореЗрдВ рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрдВрддрд┐рдо рдкреНрд░реЗрд╖рдг рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдПрдХрддреНрд░рд┐рдд рдореВрд▓реНрдп рдХреЛ рдЦреАрдВрдЪрдХрд░ рд╕рдВрджрд░реНрдн рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред