React-dnd: CustomDragLayer рдзреАрдорд╛ рдкреНрд░рджрд░реНрд╢рди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рджрд┐рд╕ре░ 2016  ┬╖  29рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: react-dnd/react-dnd

рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП CustomDragLayer рдореБрдЭреЗ рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рджреЗ рд░рд╣рд╛ рд╣реИ? рдЗрд╕рдХреА рддрд░рд╣ рдХрдо рдПрдлрдкреАрдПрд╕, рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ, рдЬрд┐рд╕ рдордирдорд╛рдиреА рд╡рд╕реНрддреБ рдХреЛ рдореИрдВ рдЦреАрдВрдЪ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдкрд┐рдЫрдбрд╝ рд░рд╣реА рд╣реИ рдФрд░ рдЪрд┐рдХрдиреА рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣реА рд╣реИ

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреАрдПрдирдбреА-рдПрдЪрдЯреАрдПрдордПрд▓ 5-рдмреИрдХрдПрдВрдб рдореЗрдВ рдХрд╕реНрдЯрдо рдбреНрд░реИрдЧрд▓реЗрдпрд░ рдХреЗ рд╕рд╛рде рднрдпрд╛рдирдХ рдкреНрд░рджрд░реНрд╢рди рд╣реИ рдЬрдмрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреАрдПрдирдбреА-рдЯрдЪ-рдмреИрдХрдПрдВрдб рдореЗрдВ рдареАрдХ рдкреНрд░рджрд░реНрд╢рди рд╣реИред

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

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

рдЙрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ 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)

рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдмрд╣реБрдд рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ:

drag-layer-default

drag-layer-performant

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

@gaearon рдХреНрдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреАрдПрдирдбреА рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреАрдХреГрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ?

@choffmeister рд╣рд╛рдпред рдЖрдкрдХреА рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдПрдХ рджрд┐рди рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирдЬрд╝рд░ рдбрд╛рд▓реА рдереА, рд▓реЗрдХрд┐рди рддрднреА рдЗрд╕реЗ рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦрд╛ред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдмрд╣реБрдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реБрдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдФрд░ рдЙрд╕ CustomDragLayerRaw рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рднреА рдмрд╣реБрдд рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдореМрдЬреВрдж рд╕рднреА рдкреНрд▓рдЧрдЗрдиреНрд╕, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдЕрдиреНрдп рдХреЛрдб рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рдзрдиреНрдпрд╡рд╛рдж

рдореИрдВрдиреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рд╣реВрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ "рдбреНрд░реИрдЧ рдШреЛрд╕реНрдЯ рдерд┐рдВрдЧ" рдореЗрдВ рдЬреЛ рд╕рд╛рдордЧреНрд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ 'рдСрдлрд╝рд╕реЗрдЯ' рдбрд┐рд╡ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ, рдореИрдВрдиреЗ рдбреНрд░реИрдЧ рдХреА рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдПрдХ рд╕рдорд╛рди div рдбрд╛рд▓рд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдЖрдЗрдЯрдо рдХреЛ рдбреНрд░реИрдЧ рдХрд┐рдП рдЧрдП рдЖрдЗрдЯрдо рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдбреЗрдЯрд╛ рдореЗрдВ рдЧреБрдЬрд░рдирд╛ рдФрд░ рдбреНрд░реИрдЧ рд▓реЗрдпрд░ рдЖрдЗрдЯрдо рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реИред

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

рд▓реИрдЧреА рд╕реЗ рдЖрдкрдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ:

  1. рдХреНрдпрд╛ рдПрдлрдкреАрдПрд╕ рдЗрддрдирд╛ рдХрдо рд╣реИ рдХрд┐ рдпрд╣ рд╣рдХрд▓рд╛рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╛
  2. рдХреНрдпрд╛ рддрддреНрд╡ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд▓рддреЗ рд╕рдордп рдпрд╣ рд╣рдореЗрд╢рд╛ рдорд╛рдЙрд╕ рдХреА рдЧрддрд┐ рд╕реЗ рдХреБрдЫ рджреВрд░реА рдкрд░ рд╣реЛрддрд╛ рд╣реИ?

рдореИрдВ рджреЛрдиреЛрдВ рдХрд╣реВрдВрдЧрд╛

рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рд░реНрдб рдбрд┐рд╡ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╢рд╛рдВрдд рд╣реИрдВред рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдПрдлрдкреАрдПрд╕ рдмреВрд╕реНрдЯ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕реЗ рд╣реА рдореИрдВ рдЕрдкрдиреЗ 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 рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рд╣реИред

https://www.npmjs.com/package/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

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

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

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

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

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

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

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