React-dnd: рдореЙрдиреАрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ редgetClientOffset рдХреЛ рдПрдХ рдбреНрд░реЙрдкрдЯреИрдЧ рд╕реЗ рдкреНрд░реЙрдкрд░ рд░реАрдлреНрд░реЗрд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдЬреВрди 2015  ┬╖  22рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: react-dnd/react-dnd

рдореИрдВрдиреЗ рдПрдХ DropTarget рдмрдирд╛рдпрд╛ рдФрд░ getClientOffset рдХреЛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЬреЛрдбрд╝рд╛:

targetCollect = function (connect, monitor) {
  return {
    connectDropTarget: connect.dropTarget(),
    isOver: monitor.isOver(),
    clientOffset: monitor.getClientOffset()
  }
}

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдШрдЯрдХ рдХреЗ рднреАрддрд░ рдбреНрд░реИрдЧ рдЪрд▓рддреА рд╣реИ, рддреЛ рд▓рдХреНрд╖реНрдп рдХреЛ рдорд╛рдЙрд╕ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдЧрд▓ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯреЗрдб рдкреНрд░реЙрдкрд░ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдХреЗрд╡рд▓ рдкреНрд░рд╡реЗрд╢ рдФрд░ рдирд┐рдХрд╛рд╕ рдкрд░)ред рд▓рдХреНрд╖реНрдп рдХрд▓реНрдкрдирд╛ рдХреЗ рд╣реЛрд╡рд░ _is_ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯрдСрдлрд╝рд╕реЗрдЯ рдкреНрд░реЛрдк рдХреЛ рд╣рд░ рдмрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЗрдВрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

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

+1ред рдЗрд╕рдореЗрдВ рднрд╛рдЧрдирд╛ рдФрд░ рдмрд╣реБрдд рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдирд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдХрд┐ getClientOffset () canDrop () рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЬрд┐рд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... - рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ 'рдЬрд╣рд╛рдВ' рд╣рдо рдЬрд┐рд╕ рдЖрдЗрдЯрдо рдкрд░ рд╣реИрдВ, рдЙрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдПрдХ рдЯреНрд░реАрдиреЛрдб рдХреЗ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдбрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ "рдЙрд╕ рдкрд░"ред canDrop () рдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреВрдБ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдШрдЯрдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдиреЛрдб рдХреЗ рдХрд┐рддрдиреЗ "рдкреНрд░рдХрд╛рд░" рдмреВрдВрджреЛрдВ рдореЗрдВ рд╕реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдореЗрд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рддрджрдиреБрд╕рд╛рд░ рдлрд┐рд░ рд╕реЗ рд╣реЛ рд╕рдХреЗред рдХреИрдирдбреНрд░реЙрдк рдореЗрдВ рдкреНрд░реЛрдк рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИред OnMouseMove рдХреА рд╕рджрд╕реНрдпрддрд╛ рдбреНрд░реИрдЧ рдФрд░ рдбреНрд░реЙрдк рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдпрд╣ рд╕рдордп рдХреА рдПрдХ рдмрдбрд╝реА рдмрд░реНрдмрд╛рджреА рд╣реИ ... рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред

@ рдЖрдЗрдмреИрд╢ , рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдиреЗ рдЬреЛ рдХреБрдЫ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

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

рдУрд╣, рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдпрд╣ рд╕рд╣реА рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдерд╛ред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдлрд╝рд╕реЗрдЯ рдореЗрдВ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ DragLayer ред рдЕрдиреНрдпрдерд╛, рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдпрд╣ рдХреЗрд╡рд▓ рд╕рд╣рд╛рд░рд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИ рдЕрдЧрд░ _drop рд▓рдХреНрд╖реНрдп рдХреЗ рд╡рд┐рд╖рдп рдореЗрдВ рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдПрдкреАрдЖрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдХрдИ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдореЗрдВ рдкрд╣реБрдБрдЪ рди рдХрд░реЗ getClientOffset() рдФрд░ рдЕрдВрджрд░ рд╕реЗ рд╕рдорд╛рди рддрд░реАрдХреЛрдВ collect рд╕рдорд╛рд░реЛрд╣ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрддрд╛ DragLayer рдмрдЬрд╛рдп (рдЖрд╕рд╛рди рд▓реЗрдХрд┐рди рдЧреВрдВрдЧрд╛);
  • рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдСрдлрд╝рд╕реЗрдЯ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдСрдлрд╝рд╕реЗрдЯ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ (рдХрдард┐рди рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рдкреАрдЖрд░ рдХреЛ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред рдЖрдк DragLayer рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдСрдлрд╕реЗрдЯ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИред

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

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЙрди рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдЦреАрдВрдЪ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╡рддрдГ рд╕реНрдерд╛рди рдкрд░ рддрдбрд╝рдХ-рднрдбрд╝рдХ рдореЗрдВ рд╣реИрдВ, рд╕рдВрднрд╡рддрдГ рдЕрдиреНрдп рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЬрдЯрд┐рд▓ рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИ (рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрдЗрдХрдиреЛрдВ рдХреЛ рдЦреАрдВрдЪреЗрдВ)ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдХреНрд╖реНрдп рд╣реИ рдХрд┐ рд╕рдЯреАрдХ рд╣реЛрд╡рд░ рд╕реНрдерд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЦреБрдж рдХреЛ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрдмрдХрд┐ рдбреНрд░реИрдЧ рд╣реА рдПрдЪрдЯреАрдПрдордПрд▓ 5 рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реИред рдореИрдВ рд▓рдХреНрд╖реНрдп рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд▓рдХреНрд╖реНрдп рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░реВрдВрдЧрд╛ред рдПрдХ рдЕрджреНрднреБрдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж; рдореЗрд░реЗ рдкрд╛рд╕ рдХрд╛рдо рдХреЗ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рд╣реИред

рдЪрд▓рд┐рдП рдЕрдм рдЗрд╕реЗ рдЦреБрд▓рд╛ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ # 172 рдХреЗ рд╕рдорд╛рди рд╣реИ: рдореИрдВрдиреЗ canDrop рдпрд╛ рд╕рдВрдЧреНрд░рд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдбреЗрд▓реНрдЯрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдерд╛ред рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдареАрдХ рдХрд░рдиреЗ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдПрдХ-рдПрдХ рдорд╣реАрдиреЗ рдореЗрдВ рдореИрдВ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛ред

рдореИрдВ рднреА рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рднрд╛рдЧ рдЧрдпрд╛ред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдСрдлрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ DropTarget рдореЗрдВ рдзреНрд╡рдЬ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рджреЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреНрдпрд╛ рд╣реИрдВ? рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ "рдЧреЛрдЪрд╛" рд╣реИ, рд▓реЗрдХрд┐рди рдСрдлрд╝рд╕реЗрдЯ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ / рд╕рджрд╕реНрдпрддрд╛ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд░рд▓ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рд╢рд╛рдпрдж RxJS-DOM рдХрд╛ рдЙрдкрдпреЛрдЧ рддрддреНрд╡ рдкрд░ рдбреНрд░реИрдЧрдУрд╡рд░ рдЗрд╡реЗрдВрдЯ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдорд╛рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рд░рд╛рдЬреНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╣реИрдХреА рд╕рдорд╛рдзрд╛рди рд╢рд╛рдпрджред

  componentDidMount() {
    this._events.dragOver = DOM.fromEvent(findDOMNode(this.refs.grid), 'dragover')
                            .throttle(200)
                            .subscribe(this.getMouseCoords)
  }

рдореИрдВрдиреЗ рдореЙрдирд┐рдЯрд░ рдХреЛ рд╣рдерд┐рдпрд╛рдиреЗ рдФрд░ рдбреНрд░реИрдЧрд▓реЗрдпрд░ рдЬреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдСрдлрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреАред рдореИрдВрдиреЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рджреЛрд╣рди рдХреЛ рднреА рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ _too_ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП IMO рдЗрд╕реЗ рд╕рд░рд▓ рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рд╕реЗ рдХреБрдЫ рдЖрдпрд╛ рд╣реИ? рдореИрдВ рдХрд╕реНрдЯрдо рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ DropTarget рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдлрд╕реЗрдЯ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ DropTarget рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЬрдм рдореИрдВ рдХрд╕реНрдЯрдо рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдХреЗ рдмрдЬрд╛рдп DropTarget рд╕реЗ рд╣реЛрд╡рд░ рд╕реНрдерд╛рди рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддрд╛ рд╣реВрдБред

+1 рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ

+1ред рдЗрд╕рдореЗрдВ рднрд╛рдЧрдирд╛ рдФрд░ рдмрд╣реБрдд рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░рдирд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдХрд┐ getClientOffset () canDrop () рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЬрд┐рд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... - рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ 'рдЬрд╣рд╛рдВ' рд╣рдо рдЬрд┐рд╕ рдЖрдЗрдЯрдо рдкрд░ рд╣реИрдВ, рдЙрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдПрдХ рдЯреНрд░реАрдиреЛрдб рдХреЗ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдбрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ "рдЙрд╕ рдкрд░"ред canDrop () рдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХреВрдБ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдШрдЯрдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдиреЛрдб рдХреЗ рдХрд┐рддрдиреЗ "рдкреНрд░рдХрд╛рд░" рдмреВрдВрджреЛрдВ рдореЗрдВ рд╕реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдореЗрд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рддрджрдиреБрд╕рд╛рд░ рдлрд┐рд░ рд╕реЗ рд╣реЛ рд╕рдХреЗред рдХреИрдирдбреНрд░реЙрдк рдореЗрдВ рдкреНрд░реЛрдк рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИред OnMouseMove рдХреА рд╕рджрд╕реНрдпрддрд╛ рдбреНрд░реИрдЧ рдФрд░ рдбреНрд░реЙрдк рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдпрд╣ рд╕рдордп рдХреА рдПрдХ рдмрдбрд╝реА рдмрд░реНрдмрд╛рджреА рд╣реИ ... рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред

@ рдЖрдЗрдмреИрд╢ , рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдиреЗ рдЬреЛ рдХреБрдЫ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рд╣реЛрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЖрдЦрд┐рд░рдХрд╛рд░ рдореЗрд░реЗ рд▓рд┐рдП рдерд╛ред

`рдордВрдбрд░рд╛рдирд╛: (рд╕рд╣рд╛рд░рд╛: MyProps, рдореЙрдирд┐рдЯрд░: DropTargetMonitor, рдШрдЯрдХ: ReportItemRow) => {
рдЕрдЧрд░ (рдШрдЯрдХ! = рдЕрд╢рдХреНрдд) {
const clientOffset = monitor.getClientOffset ();

        // Is the dragging node dragged above/below us as opposed to "on" us?

        const elementRect = document.elementFromPoint(clientOffset.x, clientOffset.y).getBoundingClientRect();

        const percentageY = (clientOffset.y - elementRect.top) / elementRect.height;

        // Divide the box up into .25 .5 .25
        const insertDragAndDropMagnetPercent = .25;

        if (insertDragAndDropMagnetPercent >= percentageY) {
            component.setState({ dropTarget: "above" });
        }
        else if (1 - insertDragAndDropMagnetPercent >= percentageY) {
            component.setState({ dropTarget: "inside" });
        }
        else {
            component.setState({ dropTarget: "below" });
        }
    }
},`

@ noah79 , рдЗрд╕ рдХреЗ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдореЗрдВ, рдЖрдк рдбреНрд░реЙрдк рдЯрд╛рд░рдЧреЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдХрд░ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдЯреНрд░реАрдиреЛрдбреНрд╕ рдХреЗ рдиреАрдЪреЗ рд░рдЦрдХрд░ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:

         _____
         _____| <-- drop div1 (above treenode1/below top of list)
treenode1_____| <-- drop div2 (on treenode1)
         _____| <-- drop div3 (below treenode1/above treenode2)
treenode2_____| <-- drop div4 (on treenode 2)
         _____| <-- drop div5 (below treenode2/above bottom of list)

рдЖрдк 2n + 1 рдбреНрд░реЙрдк рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ n рдЖрдкрдХреА рд╕реВрдЪреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдлрд┐рд░, рдЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╡рд┐рднрд╛рдЧ рдХреЗ рдКрдкрд░ рдордВрдбрд░рд╛ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреЗрдбрд╝ рдХреА рд╕реВрдЪреА рдХреИрд╕реА рджрд┐рдЦрддреА рд╣реИред рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд┐рдпрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЕрдм рддрдХ рдХреЗ рд▓рд┐рдП getClientOffset () рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдореИрдВрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдХреЛрдИ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдбреНрд░реЙрдк рдбрд┐рд╡ рдХреА рдКрдВрдЪрд╛рдИ рдЯреНрд░реАрдиреЛрдбреЗ 1 рд▓рд╛рдЗрди рдХреА рдКрдВрдЪрд╛рдИ 1/2 рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдкрд╣рд▓реА рдбреНрд░реЙрдк рдбрд┐рд╡, рдЯреНрд░рд┐рдиреЛрдбреЗ 1 рд▓рд╛рдЗрди рдХреА рдКрдВрдЪрд╛рдИ 1/4 рдХреА рдкрд╣рд▓реА рд▓рд╛рдЗрди рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣реА рд╣реИ, рдЖрдкрдХреЗ рд╕реАрдПрд╕рдПрд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

.dropdiv-container {
    position: absolute;
    top: -0.25em; /* If the top of this container is aligned with the top of the treenode list initially */
}
.dropdiv {
    height: 0.5em; /* If the height of treenode1 line is 1em with no padding */
}
<div className='dropdiv-container'>
    { renderDropTargets(2 * listLength + 1) }
</div>

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реИ?

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред рдЪрд╛рд▓ рдореЗрдВ рдмрд╕ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ
рд░рд┐рдПрдХреНрдЯ-рдбрдВрдб рдЗрдВрдЯрд░реНрдирд▓реНрд╕ рдФрд░ рд╕реАрдзреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдореЙрдирд┐рдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЬрд░рд╛ рдЧреМрд░ рдХрд░реЗрдВ
DragDropMonitor.js рд╕реНрд░реЛрдд рдХреНрдпрд╛ рддрд░реАрдХреЛрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдХреА рдПрдХ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд░реЗрдлрд░реА: https://github.com/gaearon/dnd-core/blob/master/src/DragDropMonitor.js

рдЖрдкрдХреЛ рдХреЙрдлрд╝реАрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдмрд╣рд╛рдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ :)

  # in the component being dragged, get access to the dragDropManager by adding
  # it to the contextTypes
  #
  # dragDropManager is an instance of this:
  # https://github.com/gaearon/dnd-core/blob/master/src/DragDropManager.js

  <strong i="11">@contextTypes</strong>: {
    dragDropManager: React.PropTypes.object
  }

  # because we can receive events after the component is unmounted, we need to
  # keep track of whether the component is mounted manually.
  #
  # <strong i="12">@_monitor</strong> is what lets us access all the nice internal state - it is an instance of this:
  # https://github.com/gaearon/dnd-core/blob/master/src/DragDropMonitor.js

  componentWillMount: () =>
    <strong i="13">@_isMounted</strong> = true
    <strong i="14">@_monitor</strong> = @context.dragDropManager.getMonitor()

    <strong i="15">@_unsubscribeToStateChange</strong> = @_monitor.subscribeToStateChange(@_onStateChange)
    <strong i="16">@_unsubscribeToOffsetChange</strong> = @_monitor.subscribeToOffsetChange(@_onOffsetChange)

  componentWillUnmount: () =>
    <strong i="17">@_isMounted</strong> = false
    <strong i="18">@_monitor</strong> = null

    @_unsubscribeToStateChange()
    @_unsubscribeToOffsetChange()

  # we can access dragging / dropping state by accessing the monitor 

  _onStateChange: () =>
    return unless <strong i="19">@_isMounted</strong>

    # When we stop dragging reset the counter state and hide all cursors.
    if <strong i="20">@_previousIsDragging</strong> && !@_monitor.isDragging()
      console.log('no longer dragging')
    <strong i="21">@_previousIsDragging</strong> = @_monitor.isDragging()

  _onOffsetChange: () =>
    return unless <strong i="22">@_isMounted</strong>

    # mouse is the x/y coordinates
    mouse = @_monitor.getClientOffset()

    # item is the drag item
    item = @_monitor.getItem()

    # if you want to check if a dragged item is over a target, you need the
    # targetId -- in the DropTarget wrapper you can pass it in like:
    #
    #   (connect, monitor) ->
    #     {
    #       targetId: monitor.targetId,
    #       connectDropTarget: connect.dropTarget()
    #     }
    #
    # and then you can use it like below

    @_monitor.isOverTarget(@props.targetId))

рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рднреА рд╣реИ рдХреНрдпрд╛? рдпрджрд┐ рдирд╣реАрдВ рддреЛ рдореИрдВ рдФрд░ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ

рдореИрдВ рднреА рдЖрдЬ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рд░рд╣рд╛ рдерд╛ рдФрд░ рдХреБрдЫ рдШрдВрдЯреЗ рдмрд░реНрдмрд╛рдж рд╣реЛ рдЧрдПред DropTarget рдХреЗ рддрд╣рдд рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдиреЛрдЯ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ -> рд╕рдВрдЧреНрд░рд╣ рд╕рдорд╛рд░реЛрд╣? рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рдирд┐рд░рд╛рд╢рд╛ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

Btwред рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрджрд╕реВрд░рдд рд╣реИрдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ _as рд░рд╛рдЬреНрдп_ рдореЗрдВ dropTarget.hover() рд╕реЗ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

const dropTarget = {
    hover(props, monitor, component) {
        // HACK! Since there is an open bug in react-dnd, making it impossible
        // to get the current client offset through the collect function as the
        // user moves the mouse, we do this awful hack and set the state (!!)
        // on the component from here outside the component.
        component.setState({
            currentDragOffset: monitor.getClientOffset(),
        });
    },
    drop() { /* ... */ },
};

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рд╕рд╣реА рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реЗрдЯрд╕реНрдЯреЗрдЯ рдХреЗ рджреБрд░реБрдкрдпреЛрдЧ рд╕реЗ рдмрдЪреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдЫреЛрдЯреА рд╣реИрдХ рдмрд╣реБрдд рд╕рдВрдШрдирд┐рдд рд╣реИ рдФрд░ рдпрд╣ рдХрд╛рдо рддрдм рддрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЖрдЦрд┐рд░рдХрд╛рд░ рддрдп рди рд╣реЛ рдЬрд╛рдПред рдпрд╣ рдЖрдкрдХреЛ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдФрд░ / рдпрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЗрдВрдЯреАрд░рд┐рдпрд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдмрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИрдХ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдиреВрд╣ рдХреЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИ, рдореИрдВрдиреЗ рдЕрднреА рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕рдХрд╛ рдХреЛрдб рдирд╣реАрдВ рдкрдврд╝рд╛ рдерд╛ред

рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдбреНрд░реЙрдк рдкрд░ рдорд╛рдЙрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ? рдореЗрд░реЗ рд▓рдХреНрд╖реНрдп рдШрдЯрдХ рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП setState рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ redux рдПрдХреНрд╢рди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдореЗрд░реЗ рдЕрдВрддрд┐рдо рд╕рдВрджреЗрд╢ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВред рдЕрдм рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ drop рдФрд░ endDrag рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЗ рд╣реИрдВ, рдФрд░ drop рднреАрддрд░ рдХрд░реНрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЙрдореНрдореАрдж рдХреЗ

рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-dnd рдорд╛рдЙрд╕ рдЪрд╛рд▓ рдХреА рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕реЗ рд╣реА рдПрдХ рдЖрдЗрдЯрдо рдХреЛ рд▓рдХреНрд╖реНрдп рдкрд░ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдпрд╣ html- рдмреИрдХреЗрдВрдб рдХреЗ рд▓рд┐рдП рдЗрд╕ рдШрдЯрдирд╛ рдХрд╛ рдЙрдкрднреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рддреЛ рд▓рдХреНрд╖реНрдп рдШрдЯрдХ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореВрд╕рдореЛрд╡ рд╢реНрд░реЛрддрд╛ рдХреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рддрдм рд░рдЦ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдЗрд╕рдУрд╡рд░ рд╕рдВрдкрддреНрддрд┐ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рд╣реЛред рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рд╢реНрд░реЛрддрд╛ рдорд╛рдЙрд╕ рдХреА рд╕реНрдерд┐рддрд┐ (рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ) рдЙрдард╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рдЙрд╕ рдкрд░ рдХреБрдЫ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛред рдореБрдЭреЗ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдбреНрд░реИрдЧ рд╕реЗ рд╕реЗрдЯрд╕реНрдЯреИрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛ () рд╡рд┐рдзрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рд░реЗрдВрдбрд░ рд╕рдВрдХреНрд░рдордг рдХреЗ рдмреАрдЪ рдореЗрдВ рд░рд╛рдЬреНрдп рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗ рд░рд╣реА рд╣реИред

рдЗрд╕рдиреЗ рдореБрдЭреЗ рднреА рдЙрд▓рдЭрд╛ рджрд┐рдпрд╛ред рдПрдкреАрдЖрдИ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП +1 рдпрд╛ рдПрдлрдПрдХреНрдпреВ рдкрд░ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫред

рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рд╣реИ?
рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИрдХ-рдлреНрд░реА рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ: DropTarget рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ рдмрдирд╛рдУ рдЬреЛ рд╕рдВрдЧреНрд░рд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдХреЙрд▓ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП hover рднреА рд▓рдкреЗрдЯрддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рд╕рдВрдЧреНрд░рд╣ рдлрд╝рдВрдХреНрд╢рди рдирдП рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ ред

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

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдареЛрдХрд░ рдЦрд╛ рдЧрдпрд╛ рдХрд┐ рд╢реЛрдз рдХреНрдпреЛрдВ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЗрд╕реЗ рдЕрднреА рднреА рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ @ jedwards1211 рдХрд╛ рдЖрдЗрдбрд┐рдпрд╛ рд▓рд┐рдпрд╛ рдФрд░ рдпрд╣рд╛рдВ рдореИрдВ рдЬреЛ рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реВрдВред HOC рдореЗрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рд╡реИрдирд┐рд▓рд╛ DropTarget рдХреЗ рд╕рдорд╛рди рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ collectRapidly рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╕рдВрдЧреНрд░рд╣ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдПрдХрддреНрд░рд┐рдд рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рдЕрдВрдзрд╛рдзреБрдВрдз рд░реВрдк рд╕реЗ рд╕рднреА рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рдЕрдЬреАрдмрддрд╛ рд╣реБрдИ рдФрд░ рд╣рдо рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ connect рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ, рдЗрд╕рд▓рд┐рдП connectDropTarget "рддреЗрдЬреА рд╕реЗ" рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЧрд╛рд░реНрдб рд╣реИред

рддреЛ рдХреЗ рдмрдЬрд╛рдп DropTarget(types, target, collect) рдЖрдк рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ RapidFireDropTarget(types, target, collect, {collectRapidly: ['offset']}) , рдЬрд╣рд╛рдВ offset рд╕рдВрднрд╡рддрдГ рд╕реЗ рдЕрдкрдиреЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИ monitor.getOffset рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░рд┐рд╡рд╛рд░ред

import React from 'react';
import {DropTarget} from 'react-dnd';
import pick from 'lodash/pick';

function RapidFireDropTarget(types, spec, collect, options={}) {
  let collectProps = {};
  const prevHover = spec.hover;
  const {collectRapidly = []} = options;

  const dummyConnect = {
    dropTarget: () => () => {
      throw new Error('Rapidly collected props cannot include results from `connect`');
    }
  };

  const WrappedComponent = Component => {
    return class extends React.Component {
      render() {
        return <Component {...this.props} {...collectProps} />;
      }
    };
  };

  spec.hover = (props, monitor, component) => {
    const allCollectProps = collect(dummyConnect, monitor);

    collectProps = pick(allCollectProps, collectRapidly);
    component.forceUpdate();

    if (prevHover instanceof Function) {
      prevHover(props, monitor, component);
    }
  }

  return (Component) => {
    return DropTarget(types, spec, collect, options)(WrappedComponent(Component));
  };
}

export default RapidFireDropTarget;

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

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

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

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

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

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

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

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