React-dnd: рдореИрдВ рдбреНрд░реЙрдк рд▓рдХреНрд╖реНрдп рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЕрдкрдиреЗ рдЧрд┐рд░рд╛рдП рдЧрдП рдЖрдЗрдЯрдо рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реВрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдордИ 2015  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: react-dnd/react-dnd

рдореИрдВ 1.0.0-рдЖрд░рд╕реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

drag-around-naive :

const boxTarget = {
  drop(props, monitor, component) {
    const item = monitor.getItem();
    const delta = monitor.getDifferenceFromInitialOffset();
    const left = Math.round(item.left + delta.x);
    const top = Math.round(item.top + delta.y);

    component.moveBox(item.id, left, top);
  }
};

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдореВрд▓ рдЖрдЗрдЯрдо рдХреЗ рдкреГрд╖реНрда рд╕реЗ рдСрдлрд╝рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдореИрдВ рдЙрд╕ рдкреГрд╖реНрда рд╕реЗ рдСрдлрд╝рд╕реЗрдЯ рдвреВрдВрдв рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдЫреЛрдбрд╝рд╛ рдерд╛, рдлрд┐рд░ рдореБрдЭреЗ рдкреГрд╖реНрда рд╕реЗ рдбреНрд░реЙрдк рдХрдВрдЯреЗрдирд░ рдХрд╛ рдСрдлрд╝рд╕реЗрдЯ рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рдХрд░реЗрдВ рд╡рд╣ рдЧрдгрдирд╛ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдбреНрд░реЙрдк рд▓рдХреНрд╖реНрдп рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд┐рддрд┐ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрд╛рдо рд╣реИ ...

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

рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдорд░реВрдкрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЗрд╡рд▓ findDOMNode(component).getBoundingClientRect() рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдзрд┐рдХ рд▓реЛрдЧ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЖрдЗрдП рдЗрд╕реЗ рдЦреБрд▓рд╛ рд░рдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рджреВрд╕рд░реЗ рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВред

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ getClientOffset рдореБрдЭреЗ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд┐рддрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рддреЛ рдореБрдЭреЗ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдбреНрд░реЙрдк рд▓рдХреНрд╖реНрдп рдореЗрдВ рдореЗрд░рд╛ рдСрдлрд╕реЗрдЯ рдорд┐рд▓ рдЬрд╛рдПред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдбреНрд░реЙрдк рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдкрджреНрдзрддрд┐ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ?

рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдорд░реВрдкрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЗрд╡рд▓ findDOMNode(component).getBoundingClientRect() рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдзрд┐рдХ рд▓реЛрдЧ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЖрдЗрдП рдЗрд╕реЗ рдЦреБрд▓рд╛ рд░рдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рджреВрд╕рд░реЗ рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВред

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

рд╕рд╛рдкреЗрдХреНрд╖ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЯреНрд░реЗрд▓реЛ-рдЬреИрд╕реЗ рдРрдк рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдХрд┐рд╕реА рдХрд╛рд░реНрдб рдХреЛ рдХрд┐рд╕реА рд╕реВрдЪреА рдХреЗ рдКрдкрд░ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рдбреНрд░реЙрдк рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдХреЗ рдкрд╛рд╕ рдордБрдбрд░рд╛рддреЗ рд╕рдордп рд╕реВрдЪреА рдиреАрдЪреЗ рдХреА рдУрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреА рд╣реИ, рдФрд░ рд╢реАрд░реНрд╖ рдХреЗ рдкрд╛рд╕ рд╣реЛрд╡рд░ рдХрд░рддреЗ рд╕рдордп рдКрдкрд░ рдХреА рдУрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреА рд╣реИред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрдЪреНрдЫред

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

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ getBoundingClientRect рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЖрдЗрдЯрдо рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдЯреНрд░реЗрд▓реЛ-рдЬреИрд╕реЗ рдРрдк рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдХрд┐рд╕реА рдХрд╛рд░реНрдб рдХреЛ рдХрд┐рд╕реА рд╕реВрдЪреА рдХреЗ рдКрдкрд░ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рдбреНрд░реЙрдк рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд┐рдЪрд▓реЗ рднрд╛рдЧ рдХреЗ рдкрд╛рд╕ рдордБрдбрд░рд╛рддреЗ рд╕рдордп рд╕реВрдЪреА рдиреАрдЪреЗ рдХреА рдУрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреА рд╣реИ, рдФрд░ рд╢реАрд░реНрд╖ рдХреЗ рдкрд╛рд╕ рд╣реЛрд╡рд░ рдХрд░рддреЗ рд╕рдордп рдКрдкрд░ рдХреА рдУрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреА рд╣реИред

рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИред

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

рдпреВрдЬрд░рд▓реИрдВрдб рдореЗрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдЖрдк рдереНрд░реЙрдЯрд▓ getBoundingClientRect рдХреЙрд▓ рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рдПрдиреАрдореЗрд╢рди рдлреНрд░реЗрдо рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП "рдиреАрдЪреЗ рд╣реЛрд╡рд░ рдкрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ" _рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ_ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВред рдЗрд╕рдореЗрдВ рдХрдВрдЯреЗрдирд░ рд╕реНрддрд░ рдкрд░ рдПрдХ рдФрд░ рдбреНрд░реЙрдк рд▓рдХреНрд╖реНрдп рдЬреЛрдбрд╝рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдЬреЛ рдХреЗрд╡рд▓ hover рдХреЛ рд╕реБрдирддрд╛ рд╣реИ рдФрд░ рдПрдХ рдПрдиреАрдореЗрд╢рди рдлреНрд░реЗрдо рдХреЗ рдЕрдВрджрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдбреАрдПрдирдбреА рдореЗрдВ рдбреАрдУрдПрдо рд╕рдордиреНрд╡рдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝реВрдВрдЧрд╛ред

@gaearon рдореБрдЭреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдорд╛рдзрд╛рди рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рд╣рдо рд╕реАрдзреЗ getBoundingClientRect рдмрдЬрд╛рдп react-dnd-html5-backend рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореИрдВрдиреЗ рдЗрд╕реЗ DropTargetMonitor рдлрд╝рдВрдХреНрд╢рди getInitialSourceClientOffset рдФрд░ getSourceClientOffset рдХреЛ рдореЗрд░реЗ onDrop рдИрд╡реЗрдВрдЯ рдХреЗ рдЕрдВрджрд░ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ред рдЗрд╕ рддрд░рд╣, рдореЗрд░рд╛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рд╡реНрдпреВ рдкреЛрд░реНрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╣реА рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

// some code before...

const [, dropRef] = useDrop({
    accept: 'STICKY',
    drop(item, monitor) {
      move(
        item.id,
        monitor.getInitialSourceClientOffset(),
        monitor.getSourceClientOffset()
      );
    },
  });

// I'm updating my state with npm immer (immutable helper) throuthg the produce function...

const move = (id, initialPosition, finalPosition) => {
    setList(
      produce(list, draft => {
        list.map(item => {
          if (item.id === id) {
            item.position = getCorrectDroppedOffsetValue(
              initialPosition,
              finalPosition
            );
          }
          return item;
        });
      })
    );
  };

// and finally, my getCorrectDroppedOffsetValue function
const getCorrectDroppedOffsetValue = (initialPosition, finalPosition) => {
    // get the container (view port) position by react ref...
    const dropTargetPosition = ref.current.getBoundingClientRect();

    const { y: finalY, x: finalX } = finalPosition;
    const { y: initialY, x: initialX } = initialPosition;

    // calculate the correct position removing the viewport position.
   // finalY > initialY, I'm dragging down, otherwise, dragging up
    const newYposition =
      finalY > initialY
        ? initialY + (finalY - initialY) - dropTargetPosition.top
        : initialY - (initialY - finalY) - dropTargetPosition.top;

    const newXposition =
      finalX > initialX
        ? initialX + (finalX - initialX) - dropTargetPosition.left
        : initialX - (initialX - finalX) - dropTargetPosition.left;

    return {
      x: newXposition,
      y: newYposition,
    };
  };

findDOMNode рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ useDrop#drop рдХрд┐рд╕реА рднреА component рдореЗрдВ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдм рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдХрд╛ ref рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреНрд░реЙрдк рдХрдиреЗрдХреНрдЯрд░ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВред рдХреНрдпрд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рддрд░реАрдХрд╛ рд╣реИ?

function useCustomDrop(onDrop: (info: unknown, xy: Point) => void) {

    const ref = useRef<Element>();

    const [, dropTarget] = useDrop<any, void, unknown>({
        accept: 'item-type',
        drop(item, monitor) {
            const offset = monitor.getSourceClientOffset();
            if (offset && ref.current) {
                const dropTargetXy = ref.current.getBoundingClientRect();
                onDrop(item.data, {
                    x: offset.x - dropTargetXy.left,
                    y: offset.y - dropTargetXy.top,
                });
            }
        }
    });

    return (elem) => {
        ref.current = elem;
        dropTarget(ref);
    };
}

@quanganhtran рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдкреВрд░реНрдг рдХреЛрдб рдирдореВрдиреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛?

@dendrochronology

рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЙрджрд╛рд╣рд░рдг: https://codesandbox.io/s/elastic-liskov-00ldf

рдЬрдм рд╣рдореЗрдВ ref рдЦреБрдж ( useGlobalDrop рдмрдирд╛рдо useLocalDrop ) рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рддреЛ рдПрдкреАрдЖрдИ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИред рдЕрдм рдпрджрд┐ рдХреЗрд╡рд▓ ref , рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ react-dnd рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рддреЛ рдХрд╣реАрдВ ~ monitor рдСрдмреНрдЬреЗрдХреНрдЯ~ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ ( drop рдореЗрдВ рд╕реБрд▓рдн, рдореЗрд░реЗ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ рд░рд╛рдп рдХрд╣рд╛рдБ), рдпрд╣ рдЗрд╕реЗ рд╣рд▓ рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬрд╝реВрдо рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рддреЗ рд╣реИрдВред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╕рд╡рд╛рд▓ рд╣реИ @ sepehr09

рдХреБрдЫ Google рдЦреЛрдЬреЛрдВ рдХреЗ рдмрд╛рдж рдмрд╕ рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИ ... рдореВрд▓ рдкреНрд░рд╢реНрди рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? (рдбреНрд░реЙрдк рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдЧрд┐рд░рд╛рдИ рдЧрдИ рд╡рд╕реНрддреБ рдХрд╛ x/y рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдХреЛрдИ рдорджрдж?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдмрд╣реБрдд рдЬрд░реВрд░реА рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЕрднреА, рдХрд┐рд╕реА рдиреЗ рднреА рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдВ!

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

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

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

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

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

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

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