React-dnd: рдбреНрд░реИрдЧ рд╕реЛрд░реНрд╕ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд░реЗрдВрдбрд░ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ

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

рдмрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
DragSource рд╕реЗ рд╕рдЬрд╛рдпрд╛ рдЧрдпрд╛ рдШрдЯрдХ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)

рдкреНрд░рдЬрдирди рдХрд░рдирд╛
рдРрд╕реЗ рдШрдЯрдХ рд▓рд┐рдЦреЗрдВ:

import * as React from "react";
import styled from "styled-components";
import {
  DragSource,
  DragSourceConnector,
  DragSourceMonitor,
  ConnectDragSource
} from "react-dnd";

const ImageHolder = styled.div`
  margin: 10px;
  max-width: 200px;
  width: 200px;
  min-height: 100px;
  position: relative;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  align-items: center;
`;

const ImageNameHolder = styled.div`
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 10px;
  background-color: rgba(0, 0, 0, 0.5);
  font-size: 13px;
`;

interface Props {
  imagePath: string;
  connectDragSource?: ConnectDragSource;
  isDragging?: boolean;
}

@DragSource<Props>(
  "image",
  {
    beginDrag: (props: Props) => props.imagePath
  },
  (connect: DragSourceConnector, monitor: DragSourceMonitor) => ({
    connectDragSource: connect.dragSource(),
    isDragging: monitor.isDragging()
  })
)
export class PhotosBrowserPhoto extends React.Component<Props> {
  render() {
    const { imagePath, connectDragSource } = this.props;
    console.log({ connectDragSource });
    return connectDragSource(
      <div>drag me</div>
    );
  }
}

рдЕрдкреЗрдХреНрд╖рд┐рддреН рд╡реНрдпрд╡рд╣рд╛рд░
drag me рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдбреНрд░реИрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдШрдЯрдХ, рдХрдВрд╕реЛрд▓ рдореЗрдВ connectDragSource рдореБрджреНрд░рд┐рдд

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░
рдХреБрдЫ рднреА рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрдВрд╕реЛрд▓ рдЦрд╛рд▓реА рд╣реИ

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

рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдерд╛:

import HTML5Backend from 'react-dnd-html5-backend'
import { DragDropContextProvider } from "react-dnd";

<DragDropContextProvider backend={HTML5Backend}>
 <App/>
</DragDropContextProvider>

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

рдореЗрд░реЗ рд╕рд╛рде рднреА рдпрд╣реА рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ ES6 рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

import React, { Component } from "react";
import { DragSource } from "react-dnd";
import PropTypes from "prop-types";

import "./Dictionary.css";

const propTypes = {
  entry: PropTypes.object.isRequired,

  // Injected by React DnD:
  isDragging: PropTypes.bool.isRequired,
  connectDragSource: PropTypes.func.isRequired
};

const TYPES = {
  ROW: "row"
};

/**
 * Implements the drag source contract.
 */
const rowSource = {
  beginDrag(props) {
    console.log(props);
    return {
      entry: props.entry
    };
  }
};

/**
 * Specifies the props to inject into your component.
 */
function collect(connect, monitor) {
  return {
    connectDragSource: connect.dragSource(),
    isDragging: monitor.isDragging()
  };
}

class Row extends Component {
  constructor(props) {
    console.log("here");
    super(props);
    this.state = {
      entry: props.entry
    };
  }

  static getDerivedStateFromProps = (props, state) => {
    return {
      entry: props.entry
    };
  };

  render() {
    const { isDragging, connectDragSource } = this.props;
    const { entry } = this.state;

    console.log("dragging:", isDragging);
    return connectDragSource(
      <div style={{ opacity: isDragging ? 0.5 : 1 }} className="row">
        <div>{entry.string}</div>
        <div>{entry.kMandarin}</div>
        <div>{entry.kDefinition}</div>
      </div>
    );
  }
}

Row.propTypes = propTypes;

export default DragSource(TYPES.ROW, rowSource, collect)(Row);

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

    "react-dnd-html5-backend": "^5.0.1",
    "react-dom": "^16.5.1",

рдЕрдкреЗрдХреНрд╖рд┐рдд: рдкреНрд░рд╕реНрддреБрдд рдШрдЯрдХ рдФрд░ рдХрдВрд╕реЛрд▓ рд▓реЙрдЧ рджреЗрдЦреЗрдВ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ: рдХреБрдЫ рднреА рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдХреБрдЫ рднреА рд▓реЙрдЧ рдирд╣реАрдВ рд╣реИ

рдореЗрд░реЗ рдРрдк рдХреА рдЬрдбрд╝ рдореЗрдВ рдкреНрд░рджрд╛рддрд╛ рдШрдЯрдХ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд▓рд╛рдВрдХрд┐ - рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдиреЛрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдирд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдП

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ if -рдХрдерди:
https://github.com/react-dnd/react-dnd/blob/934efc81871f30c6038e2dc52be1504fe38132e7/packages/react-dnd/src/decorateHandler.tsx#L210

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЪреЗрдХ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдЧрд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдерд╛:

import HTML5Backend from 'react-dnd-html5-backend'
import { DragDropContextProvider } from "react-dnd";

<DragDropContextProvider backend={HTML5Backend}>
 <App/>
</DragDropContextProvider>

fyi: рдкреЛрд░реНрдЯрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдЕрднреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдкреБрд░рд╛рдиреЗ ReactDOM.unstable_renderSubtreeIntoContainer API рдХреЛ ReactDOM.createPortal рд╕реЗ рдмрджрд▓рдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ред

рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕рдордп рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛, рдпрд╣рд╛рдВ рдЙрддреНрддрд░ рдорд┐рд▓рд╛, рдХреГрдкрдпрд╛ рдЕрдкрдирд╛ рдирдореВрдирд╛ рдХреБрдЫ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдХрд░реЗрдВ, рдзрдиреНрдпрд╡рд╛рдж

рд░рд┐рдПрдХреНрдЯ 16.8.1 рдХреЗ рдЦрд┐рд▓рд╛рдл рдЙрдкрд╕реНрдерд┐рдд рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рдореЗрд░рд╛ рдкреНрд░рдмрдВрдзрдХ рдХрднреА рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ Context.Consumer DragSource рдХрднреА рднреА рдХрд┐рд╕реА рднреА рдмрдЪреНрдЪреЗ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рддреНрд╡рд░рд┐рдд рдкреНрд░рд╛рд░рдВрдн рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдкрд╣рд▓реА рдЪреАрдЬ рд╣реИ рдЬреЛ рдбреЙрдХреНрд╕ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП ...

рдпрд╣рд╛рдВ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреБрдЫ рдЙрддреНрдкрд╛рджрди рдХреЗ рддрд╣рдд (рдореИрдВрдиреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ DragDropContextProvider рдореЗрд░реЗ рдкреЗрдбрд╝ рдореЗрдВ рдореМрдЬреВрдж рдерд╛)ред рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрд╡ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп DragDropContextProvider рдЦреЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдШрдЯрдХ рдкреЗрдбрд╝ рдореЗрдВ Unknown рд░реВрдк рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ (рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджреЗрдЦреЗрдВ)
Screen Shot 2019-03-14 at 2 31 16 AM

v7.3.2 рд╕реЗ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдХреЗ

  • "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреАрдПрдирдбреА": "7.1.0",
  • "react-dnd-html5-backend": "7.1.0"

рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рднреА рдЙрд╕реА рдмрдЧ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд▓реЗрдХрд┐рди рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдирд╣реАрдВред

рдпрд╣ рдореЗрд░рд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╣реИред

  • "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреАрдПрдирдбреА"я╝Ъ "7.1.0"уАБ
  • "react-dnd-html5-backend"я╝Ъ "7.1.0"
const render = () => {
  ReactDOM.render(
    <DragDropContextProvider backend={HTML5Backend}>
      <Provider store={store}>
        <ConnectedRouter history={history}>
          <AppContainer>
            <App />
          </AppContainer>
        </ConnectedRouter>
      </Provider>
    </DragDropContextProvider>,
    document.getElementById('app')
  );
};

уВ╣уВпуГкуГ╝уГ│уВ╖уГзуГГуГИ 2019-03-22 17 13 46

рдбреНрд░реИрдЧрдбреНрд░реЙрдкрдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯрдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдЕрдЬреНрдЮрд╛рдд рд╣реИ

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

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?

рдореИрдВрдиреЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рднреА рдиреЗ рджреЗрд╡ рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯреВрдЯ рдЧрдпрд╛ред

рд╕рдорд╕реНрдпрд╛ рдпреВрдЬрдбреНрд░реИрдЧ рдЖрдпрд╛рдд рдкрде рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рдереА ...

рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдЖрдпрд╛рдд
import {useDrag} from "react-dnd/lib/index";

рдХрд╛рд░реНрдп рдЖрдпрд╛рдд
import {useDrag} from "react-dnd";

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдкрд╣рд▓рд╛ рдЖрдпрд╛рдд рдХреИрд╕реЗ рд╣реБрдЖред

рд╕рд╛рде рд╣реА, рдореИрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддрд╛

рд╕рдВрджрд░реНрдн:

  • "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛": "^16.8.3",
  • "react-dnd": "^9.0.1",
  • "react-dnd-html5-backend": "^9.0.0",

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

рдЕрднреА рддрдХ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди? рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд╕реБрдЭрд╛рдП рдЧрдП рдХреБрдЫ рднреА рдорджрдж рдирд╣реАрдВ рдХреАред

"react-dnd": "^11.1.3",
"react-dnd-html5-backend": "^11.1.3",

рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдореИрдВ рд░рд╛рдЬреНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддрд╛ рд╣реВрдВ, рдЬрдм рдореИрдВ рдХрдВрд╕реЛрд▓ рд▓реЙрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рд░реЗрдВрдбрд░ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ред

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

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

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

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

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

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

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