рдореИрдВ 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);
}
};
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдореВрд▓ рдЖрдЗрдЯрдо рдХреЗ рдкреГрд╖реНрда рд╕реЗ рдСрдлрд╝рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдореИрдВ рдЙрд╕ рдкреГрд╖реНрда рд╕реЗ рдСрдлрд╝рд╕реЗрдЯ рдвреВрдВрдв рд╕рдХрддрд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдЫреЛрдбрд╝рд╛ рдерд╛, рдлрд┐рд░ рдореБрдЭреЗ рдкреГрд╖реНрда рд╕реЗ рдбреНрд░реЙрдк рдХрдВрдЯреЗрдирд░ рдХрд╛ рдСрдлрд╝рд╕реЗрдЯ рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рдХрд░реЗрдВ рд╡рд╣ рдЧрдгрдирд╛ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рдбреНрд░реЙрдк рд▓рдХреНрд╖реНрдп рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд┐рддрд┐ рд╣реИред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрд╛рдо рд╣реИ ...
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 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 рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛)
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдХреЛрдИ рдорджрдж?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдмрд╣реБрдд рдЬрд░реВрд░реА рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЕрднреА, рдХрд┐рд╕реА рдиреЗ рднреА рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдВ!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдорд░реВрдкрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЗрд╡рд▓
findDOMNode(component).getBoundingClientRect()
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдзрд┐рдХ рд▓реЛрдЧ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реЛрдЧреАред рдЖрдЗрдП рдЗрд╕реЗ рдЦреБрд▓рд╛ рд░рдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рджреВрд╕рд░реЗ рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВред