рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП CustomDragLayer рдореБрдЭреЗ рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рджреЗ рд░рд╣рд╛ рд╣реИ? рдЗрд╕рдХреА рддрд░рд╣ рдХрдо рдПрдлрдкреАрдПрд╕, рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ, рдЬрд┐рд╕ рдордирдорд╛рдиреА рд╡рд╕реНрддреБ рдХреЛ рдореИрдВ рдЦреАрдВрдЪ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдкрд┐рдЫрдбрд╝ рд░рд╣реА рд╣реИ рдФрд░ рдЪрд┐рдХрдиреА рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИ
рдореИрдВрдиреЗ рднреА рдЗрд╕рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ред рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рднрд▓реЗ рд╣реА рдЖрдк рд╢реБрджреНрдз рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рдСрдлрд╕реЗрдЯ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдЙрд╕ рдЪрд╛рд▓ рдкрд░ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реБрд▓рд╣ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдХреНрд╖рдо рд╣реИ, рдЬрд╣рд╛рдВ рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдЧреИрд░-рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдХрд╕реНрдЯрдо рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рддрддреНрд╡ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ DragLayer.js
рдХреЛ рдореЗрд░реЗ рд▓рд┐рдП рдСрдлрд╝рд╕реЗрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдФрд░ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрдВрдЯреЗрдирд░ рдХреА рд╢реИрд▓реА рдХреЛ рдмрджрд▓рдирд╛ рдЬреЛ рд╕реАрдзреЗ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдШреВрдорддрд╛ рд╣реИред
// PerformantDragLayer.js
/* eslint-disable */
import React, { Component, PropTypes } from 'react';
import shallowEqual from 'react-dnd/lib/utils/shallowEqual';
import shallowEqualScalar from 'react-dnd/lib/utils/shallowEqualScalar';
import isPlainObject from 'lodash/isPlainObject';
import invariant from 'invariant';
import checkDecoratorArguments from 'react-dnd/lib/utils/checkDecoratorArguments';
import hoistStatics from 'hoist-non-react-statics';
function layerStyles(isDragging) {
return {
position: 'fixed',
pointerEvents: 'none',
zIndex: 1,
left: 0,
top: 0,
width: isDragging ? '100%' : 0,
height: isDragging ? '100%' : 0,
opacity: isDragging ? 1 : 0
};
}
export default function DragLayer(collect, options = {}) {
checkDecoratorArguments('DragLayer', 'collect[, options]', ...arguments);
invariant(
typeof collect === 'function',
'Expected "collect" provided as the first argument to DragLayer ' +
'to be a function that collects props to inject into the component. ',
'Instead, received %s. ' +
'Read more: http://gaearon.github.io/react-dnd/docs-drag-layer.html',
collect
);
invariant(
isPlainObject(options),
'Expected "options" provided as the second argument to DragLayer to be ' +
'a plain object when specified. ' +
'Instead, received %s. ' +
'Read more: http://gaearon.github.io/react-dnd/docs-drag-layer.html',
options
);
return function decorateLayer(DecoratedComponent) {
const { arePropsEqual = shallowEqualScalar } = options;
const displayName =
DecoratedComponent.displayName ||
DecoratedComponent.name ||
'Component';
class DragLayerContainer extends Component {
static DecoratedComponent = DecoratedComponent;
static displayName = `DragLayer(${displayName})`;
static contextTypes = {
dragDropManager: PropTypes.object.isRequired
}
getDecoratedComponentInstance() {
return this.refs.child;
}
shouldComponentUpdate(nextProps, nextState) {
return !arePropsEqual(nextProps, this.props) ||
!shallowEqual(nextState, this.state);
}
constructor(props, context) {
super(props);
this.handleOffsetChange = this.handleOffsetChange.bind(this);
this.handleStateChange = this.handleStateChange.bind(this);
this.manager = context.dragDropManager;
invariant(
typeof this.manager === 'object',
'Could not find the drag and drop manager in the context of %s. ' +
'Make sure to wrap the top-level component of your app with DragDropContext. ' +
'Read more: http://gaearon.github.io/react-dnd/docs-troubleshooting.html#could-not-find-the-drag-and-drop-manager-in-the-context',
displayName,
displayName
);
this.state = this.getCurrentState();
}
componentDidMount() {
this.isCurrentlyMounted = true;
const monitor = this.manager.getMonitor();
this.unsubscribeFromOffsetChange = monitor.subscribeToOffsetChange(
this.handleOffsetChange
);
this.unsubscribeFromStateChange = monitor.subscribeToStateChange(
this.handleStateChange
);
this.handleStateChange();
}
componentWillUnmount() {
this.isCurrentlyMounted = false;
this.unsubscribeFromOffsetChange();
this.unsubscribeFromStateChange();
}
handleOffsetChange() {
if (!this.isCurrentlyMounted) {
return;
}
const monitor = this.manager.getMonitor();
const offset = monitor.getSourceClientOffset();
const offsetDiv = this.refs.offset;
if (offset && offsetDiv) {
offsetDiv.style.transform = `translate(${offset.x}px, ${offset.y}px)`;
}
}
handleStateChange() {
if (!this.isCurrentlyMounted) {
return;
}
const nextState = this.getCurrentState();
if (!shallowEqual(nextState, this.state)) {
this.setState(nextState);
}
}
getCurrentState() {
const monitor = this.manager.getMonitor();
return {
collected: collect(monitor),
isDragging: monitor.isDragging()
};
}
render() {
return (
<div style={layerStyles(this.state.isDragging)}>
<div ref='offset'>
{this.state.isDragging && <DecoratedComponent {...this.props} {...this.state.collected} ref='child' />}
</div>
</div>
);
}
}
return hoistStatics(DragLayerContainer, DecoratedComponent);
};
}
рдЗрд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
// MyCustomDragLayer.js
import PerformantDragLayer from './PerformantDragLayer'
import React, {PropTypes} from 'react'
class CustomDragLayerRaw extends React.Component {
static propTypes = {
item: PropTypes.any,
itemType: PropTypes.string
}
render () {
const {item, itemType} = this.props
return <div>{itemType}</div>
}
}
export default PerformantDragLayer((monitor) => ({
item: monitor.getItem(),
itemType: monitor.getItemType()
})(CustomDragLayerRaw)
рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдмрд╣реБрдд рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ:
рдмреЗрд╢рдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ DragLayer
рдЕрднреА рднреА рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реИред рдореЗрд░рд╛ рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╕ рддреЗрдЬрд╝ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рдмрд╣реБрдд рдЖрдо рд╣реИред
@gaearon рдХреНрдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреАрдПрдирдбреА рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреАрдХреГрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ?
@choffmeister рд╣рд╛рдпред рдЖрдкрдХреА рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдПрдХ рджрд┐рди рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирдЬрд╝рд░ рдбрд╛рд▓реА рдереА, рд▓реЗрдХрд┐рди рддрднреА рдЗрд╕реЗ рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦрд╛ред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдФрд░ рдЙрд╕ CustomDragLayerRaw рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рднреА рдмрд╣реБрдд рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдореМрдЬреВрдж рд╕рднреА рдкреНрд▓рдЧрдЗрдиреНрд╕, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдЕрдиреНрдп рдХреЛрдб рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
рдзрдиреНрдпрд╡рд╛рдж
рдореИрдВрдиреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рд╣реВрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ "рдбреНрд░реИрдЧ рдШреЛрд╕реНрдЯ рдерд┐рдВрдЧ" рдореЗрдВ рдЬреЛ рд╕рд╛рдордЧреНрд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ 'рдСрдлрд╝рд╕реЗрдЯ' рдбрд┐рд╡ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рдореИрдВрдиреЗ рдбреНрд░реИрдЧ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдПрдХ рд╕рдорд╛рди div рдбрд╛рд▓рд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдЖрдЗрдЯрдо рдХреЛ рдбреНрд░реИрдЧ рдХрд┐рдП рдЧрдП рдЖрдЗрдЯрдо рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдбреЗрдЯрд╛ рдореЗрдВ рдЧреБрдЬрд░рдирд╛ рдФрд░ рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдЖрдЗрдЯрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реИред
рдкреНрд░рджрд░реНрд╢рди рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдХрдВрдЯреЗрдирд░ рдХреЗ рдмрд╛рд╣рд░ рдЦреАрдВрдЪрддреЗ рд╕рдордп рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЖрдЗрдЯрдо рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдордВрдбрд▓рд┐рдпрд╛рдВ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рджрд░реНрд╢рди рднреА рдкрд┐рдЫрд▓реЗ рдорд╛рдорд▓реЗ рдХреА рддрд░рд╣ рдирд┐рд░реНрджреЛрд╖ рд╣реИ (рдпрд╛рдиреА рдЖрдкрдХреЗ рдкрд╛рд╕ 4 рдЖрдЗрдЯрдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдорд╛рдЙрд╕ рдХреЛ рдЪреМрдереЗ рдЖрдЗрдЯрдо рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЦреАрдВрдЪрдирд╛ рдФрд░ рд░рдЦрдирд╛)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рд╡реГрддреНрдд рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рд╕рднреА 4 рддрддреНрд╡реЛрдВ рдореЗрдВ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрднреА рднреА рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдкрд┐рдЫрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝реЗ рд╕реЗ рдПрдлрдкреАрдПрд╕ рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╛рде (рдлрд┐рд░ рднреА рдпрд╣ рдЕрднреА рднреА рдкрд┐рдЫрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ)ред рд▓реЗрдХрд┐рди рдпрд╣ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реИред рдХрдо рд╕реЗ рдХрдо рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрдм рдЖрдк рдПрдХ рдХрдВрдЯреЗрдирд░ рд╕реЗ рджреВрд╕рд░реЗ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпреВрдПрдХреНрд╕ рдХреЛ рдЕрдЪреНрдЫрд╛ рд░рдЦреЗрдЧрд╛ред
рд▓реИрдЧреА рд╕реЗ рдЖрдкрдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ:
рдореИрдВ рджреЛрдиреЛрдВ рдХрд╣реВрдВрдЧрд╛
рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рд░реНрдб рдбрд┐рд╡ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╢рд╛рдВрдд рд╣реИрдВред рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдПрдлрдкреАрдПрд╕ рдмреВрд╕реНрдЯ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕реЗ рд╣реА рдореИрдВ рдЕрдкрдиреЗ div рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрддрд╛ рд╣реВрдВ, рдпрд╣ рдкрд┐рдЫрдбрд╝рдиреЗ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рдирд╣реАрдВ рдерд╛ред
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдпреВрдЖрдИ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдпрд╛ рдбреАрдПрдирдбреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЗрд╖реНрдЯрддрдо рддрд░реАрдХрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдЧрд░ рдХреЛрдИ рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЙрдирдХреЗ рд▓рд┐рдП рднреА рдкреАрдЫреЗ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд░реНрдердкреВрд░реНрдг рдпреВрдЖрдИ рдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред рдореЗрд░реЗ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрд╛рд░реНрдб рдореЗрдВ 2 рд╢реАрд░реНрд╖рдХ, 5 рд╕рд┐рдореЗрдВрдЯрд┐рдХ "рд▓реЗрдмрд▓", 3 рд╕рд┐рдореЗрдВрдЯрд┐рдХ "рдЖрдЗрдХрди" рдФрд░ рдПрдХ рдЕрд╡рддрд╛рд░ рдЗрдореЗрдЬ рдереАред
рдЗрд╕ рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж: http://react-trello-board.web-pal.com/ (рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдЪреЙрдлрдореЗрд╕реНрдЯрд░ рдиреЗ рдкрд╣рд▓реЗ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛), рдореИрдВ рдЕрднреА рднреА рдЕрдкрдиреЗ рдЬрдЯрд┐рд▓ div рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ . рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреБрдЫ рдФрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рд╕рдорд╕реНрдпрд╛ рдореЗрд░реЗ div рдХреЗ рд╕рд╛рде рд╣реИ, рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ рдЕрднреА рднреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдмрд╣реБрдд рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЧрдгрдирд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╣рд░ рдЫреЛрдЯреЗ рдорд╛рдЙрд╕ рдХреА рдЪрд╛рд▓ рд╣реЛ?
рдХреНрдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд╣реИ?
PureComponents рдХреЗ рд╕рд╛рде рднреА рдореБрдЭреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реБрдИ рд╣реИред рдХреНрд░реЛрдо рд░рд┐рдПрдХреНрдЯ рджреЗрд╡ рдкреНрд▓рдЧ-рдЗрди рдореЗрдВ 'рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЕрдкрдбреЗрдЯ' рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдореЗрд░реЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдЬрдм currentOffset
рдкреНрд░реЛрдк рдмрджрд▓ рд░рд╣рд╛ рдерд╛ред рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдбреНрд░реИрдЧрд▓реЗрдпрд░ рдЬреЛ рдЗрд╕ рдкреНрд░реЛрдк рдкрд░ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдбреНрд░реИрдЧ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╣реА рд╣реЛрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдРрдк рдХреЗ рд╢реАрд░реНрд╖-рд╕реНрддрд░ рдкрд░ рдбреНрд░реИрдЧрд▓реЗрдпрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ рдЖрдЗрдЯрдо рдХреЛ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред
рдореИрдВрдиреЗ @choffmeister рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рднреА рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдРрд╕рд╛ рдХреБрдЫ рдХреЛрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдбреНрд░реИрдЧ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдЖрдо рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдореИрдВрдиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдбреНрд░реИрдЧрд▓реЗрдпрд░ рдЬреЛ рдЗрд╕ рдкреНрд░реЛрдк рдкрд░ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдбреНрд░реИрдЧ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рд╣реА рд╣реЛрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдРрдк рдХреЗ рд╢реАрд░реНрд╖-рд╕реНрддрд░ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреНрд░реИрдЧрд▓реЗрдпрд░ рдерд╛
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реВрдВ! рдореЗрд░реЗ рдРрдк рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХрд╕реНрдЯрдо рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рд╣реИ, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ!
рдпрд╣ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╣реИ - рдПрдХ рдХрд╕реНрдЯрдо рдбреНрд░реИрдЧ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдПрдХ рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рддрд╛рдХрд┐ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдХреМрди рд╕рд╛ рдЖрдЗрдЯрдо рдЦреАрдВрдЪрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛ред рдореИрдВрдиреЗ рд╢реБрд░реВ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдХрд╕реНрдЯрдо рдбреНрд░реИрдЧ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рд░ рдорд╛рдореВрд▓реА рдЖрдВрджреЛрд▓рди рдкрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдк рдмрджрд▓рдиреЗ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рд╣реЛ рд░рд╣рд╛ рдерд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдШрдЯрдХ рдЕрджреНрдпрддрдиред
рдЧреЛрдЪрд╛, рдзрдиреНрдпрд╡рд╛рджред
рдореИрдВрдиреЗ рдЕрдкрдиреА рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдХреЛ рдПрдХ рд╕рд┐рдВрдЧрд▓ рдбрдВрдм рдХрдВрдкреЛрдиреЗрдВрдЯ рддрдХ рд╕рд░рд▓ рдХрд░ рджрд┐рдпрд╛, рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдирд┐рд░рдВрддрд░ x/y рдЧрдгрдирд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣реА рд╣реИред
рдореИрдВ рдЕрднреА рддрдХ @choffmeister рдКрдкрд░ рдЬреЛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред
@gaearon рдпрд╣ lib рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдЪреНрдЫреА рд╕рдорд╕реНрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рдЙрдЪрд┐рдд рд╕реБрдЭрд╛рд╡ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕ рдкрд░ рдХреЛрдИ рд╕реБрдЭрд╛рд╡?
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреАрдПрдирдбреА-рдПрдЪрдЯреАрдПрдордПрд▓ 5-рдмреИрдХрдПрдВрдб рдореЗрдВ рдХрд╕реНрдЯрдо рдбреНрд░реИрдЧрд▓реЗрдпрд░ рдХреЗ рд╕рд╛рде рднрдпрд╛рдирдХ рдкреНрд░рджрд░реНрд╢рди рд╣реИ рдЬрдмрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреАрдПрдирдбреА-рдЯрдЪ-рдмреИрдХрдПрдВрдб рдореЗрдВ рдареАрдХ рдкреНрд░рджрд░реНрд╢рди рд╣реИред
рдереЛрдбрд╝реЗ рд╕реНрдкрд╖реНрдЯ, рд▓реЗрдХрд┐рди рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ:
let updates = 0;
@DragLayer(monitor => {
if (updates++ % 2 === 0) {
return {
currentOffset: monitor.getSourceClientOffset()
}
}
else {
return {}
}
})
рдбреНрд░реИрдЧрд▓реЗрдпрд░ рдХреА рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рдХреЛ рдереНрд░реЙрдЯрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП react-throttle-render
рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рд╣реИред
рдзрдиреНрдпрд╡рд╛рдж @ aks427 рдореИрдВ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдФрд░ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рдФрд░ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ (рдКрдкрд░ рдХреА рддрд░рд╣ рдПрдХ рдХрд╕реНрдЯрдо рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдЬрд┐рд╕рдиреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмрд╣реБрдд рдорджрдж рдХреА рд▓реЗрдХрд┐рди рд╕рднреА рдирд╣реАрдВ)
@dobesv рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреАрдПрдирдбреА-рдЯрдЪ-рдмреИрдХрдПрдВрдб рдореЗрдВ рдмрджрд▓рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдереНрд░реЙрдЯрд▓-рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ред
рд╣рд╛рдБ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЯрдЪ рдмреИрдХрдПрдВрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
@dobesv рд╣рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП https://react-dropzone.js.org/ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ :) рд╢рд╛рдпрдж рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдЕрдЪреНрдЫрд╛ рд╣реИред
@dobesv рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреНрд░реЙрдкрдЬрд╝реЛрди рдХреЗрд╡рд▓ рдбреНрд░реЙрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрдирд╛рд░рд┐рдпреЛ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдбреНрд░реЙрдк рдлрд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдиреЛ рдмреНрд░реЗрдирд░ рдХреА рддрд░рд╣, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд░рдлреЙрд░реНрдореЗрдВрдЯ рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдлрд┐рдХреНрд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдФрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛
рд░реЗрдВрдбрд░рд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрд╛
рдРрдк рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрдВрдкреЛрдиреЗрдВрдЯ -> рдкреНрдпреЛрд░рдХрдВрдкреЛрдиреЗрдВрдЯ) рдФрд░
рдЕрдВрдд рдореЗрдВ рдореБрдЭреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдереНрд░реЙрдЯрд▓-рд░реЗрдВрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред
рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ PureComponent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ
рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдПрдХ рдЖрд╕рд╛рди рд╕реБрдзрд╛рд░ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХрддрдо рдХрд░реЗрдВ рдпрджрд┐
рдЖрдкрдХрд╛ рд░реЗрдВрдбрд░ рдзреАрдорд╛ рд╣реИ! рдЕрдЧрд░ рд╣рдо рдкрд░рдлреЙрд░реНрдореЗрдВрдЯ рдореЙрдбрд▓ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдФрд░ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛
рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдм!
>
@framerate рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ PureComponents рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реБрд▓рд╣ рдЕрд╣рдВрдХрд╛рд░ рд╣рд░ рдорд╛рдЙрд╕ рдЪрд╛рд▓ рдкрд░ рдЪрд▓рд╛рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИред рдХреНрд░реЛрдо рджреЗрд╡рдЯреВрд▓ рдФрд░ рд╕реАрдкреАрдпреВ рдереНрд░реЙрдЯрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдРрдк рдХреЛ 4X рдкрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд░реЗрдВ, рдЬреЛ рдХрд┐ рдорд┐рдб-рдПрдВрдб рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдордВрджреА рд╣реИред
рднрд╛рд╡реА рдкреАрдврд╝реА рдФрд░ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рдбреНрд░реИрдЧ рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рдЬреВрдЭ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЖрдк @choffmeister рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдирд╣реАрдВ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
let subscribedToOffsetChange = false;
let dragPreviewRef = null;
const onOffsetChange = monitor => () => {
if (!dragPreviewRef) return;
const offset = monitor.getSourceClientOffset();
if (!offset) return;
const transform = `translate(${offset.x}px, ${offset.y}px)`;
dragPreviewRef.style["transform"] = transform;
dragPreviewRef.style["-webkit-transform"] = transform;
};
export default DragLayer(monitor => {
if (!subscribedToOffsetChange) {
monitor.subscribeToOffsetChange(onOffsetChange(monitor));
subscribedToOffsetChange = true;
}
return {
itemBeingDragged: monitor.getItem(),
componentType: monitor.getItemType(),
beingDragged: monitor.isDragging()
};
})(
class CustomDragLayer extends React.PureComponent {
componentDidUpdate(prevProps) {
dragPreviewRef = this.rootNode;
}
render() {
if (!this.props.beingDragged) return null;
return (
<div
role="presentation"
ref={el => (this.rootNode = el)}
style={{
position: "fixed",
pointerEvents: "none",
top: 0,
left: 0
}}
>
{renderComponent(
this.props.componentType,
this.props.itemBeingDragged
)}
</div>
);
}
}
);
@stellarhoof рдорд╣рд╛рди рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП IE11 рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред subscribeToOffsetChange
рдЙрд╕ рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЗрд╕рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ subscribeToOffsetChange
рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рдерд╛:
let dragLayerRef: HTMLElement = null;
const layerStyles: React.CSSProperties = {
position: 'fixed',
pointerEvents: 'none',
zIndex: 100,
left: 0,
top: 0,
width: '100%',
height: '100%',
};
const dragLayerCollector = (monitor: DragLayerMonitor) => {
if (dragLayerRef) {
const offset = monitor.getSourceClientOffset() || monitor.getInitialClientOffset();
if (offset) {
dragLayerRef.style["transform"] = `translate(${offset.x}px, ${offset.y}px)`;
} else {
dragLayerRef.style["display"] = `none`;
}
}
return {
item: monitor.getItem(),
isDragging: monitor.isDragging(),
};
};
export default DragLayer(dragLayerCollector)(
(props): JSX.Element => {
if (!props.isDragging) {
return null;
}
return (
<div style={layerStyles}>
<div ref={ (ref) => dragLayerRef = ref }>test</div>
</div>
);
}
);
@stellarhoof рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ renderComponent
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рдмрдбрд╝реА рдлрд╛рдЗрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдерд╛? (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднреА рдЖрдпрд╛рдд рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ)
@choffmeister рдХреНрдпрд╛ рдЖрдкрдиреЗ dnd рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реИ? рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдиреЗ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ @stellarhoof рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рдерд╛
@stellarhoof рдорд╣рд╛рди рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╕рдорд╛рдзрд╛рди рдореЗрд░реЗ рд▓рд┐рдП IE11 рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
subscribeToOffsetChange
рдЙрд╕ рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЗрд╕рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВsubscribeToOffsetChange
рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рдерд╛:let dragLayerRef: HTMLElement = null; const layerStyles: React.CSSProperties = { position: 'fixed', pointerEvents: 'none', zIndex: 100, left: 0, top: 0, width: '100%', height: '100%', }; const dragLayerCollector = (monitor: DragLayerMonitor) => { if (dragLayerRef) { const offset = monitor.getSourceClientOffset() || monitor.getInitialClientOffset(); if (offset) { dragLayerRef.style["transform"] = `translate(${offset.x}px, ${offset.y}px)`; } else { dragLayerRef.style["display"] = `none`; } } return { item: monitor.getItem(), isDragging: monitor.isDragging(), }; }; export default DragLayer(dragLayerCollector)( (props): JSX.Element => { if (!props.isDragging) { return null; } return ( <div style={layerStyles}> <div ref={ (ref) => dragLayerRef = ref }>test</div> </div> ); } );
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛!
рдореИрдВ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: 9.4.0
рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреЗ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред
рд╣реЗ рд▓реЛрдЧреЛрдВ,
рдПрдХ рд╕реАрдПрд╕рдПрд╕ рдПрдирд┐рдореЗрдЯреЗрдб рдШрдЯрдХ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рди рдХрд░реЗрдВ, рдпрд╛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрдо рд╕реЗ рдХрдо рд╕рдВрдХреНрд░рдордг рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЕрдВрдд рдореЗрдВ рд╡рд╛рдкрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдм рдХреБрдЫ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдпреВрдЬрдбреНрд░реИрдЧрд▓реЗрдпрд░ рд╣реБрдХ) рдФрд░ рдпрд╣рд╛рдВ рднреВрдорд┐: рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣реБрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЯрд┐рдХрдЯ рдЦреЛрд▓рд╛, рдпрд╣рд╛рдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╕рд╛рде: https://github.com/react-dnd/react-dnd/issues/2414
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреАрдПрдирдбреА-рдПрдЪрдЯреАрдПрдордПрд▓ 5-рдмреИрдХрдПрдВрдб рдореЗрдВ рдХрд╕реНрдЯрдо рдбреНрд░реИрдЧрд▓реЗрдпрд░ рдХреЗ рд╕рд╛рде рднрдпрд╛рдирдХ рдкреНрд░рджрд░реНрд╢рди рд╣реИ рдЬрдмрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреАрдПрдирдбреА-рдЯрдЪ-рдмреИрдХрдПрдВрдб рдореЗрдВ рдареАрдХ рдкреНрд░рджрд░реНрд╢рди рд╣реИред