рдмрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
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
рдореБрджреНрд░рд┐рдд
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░
рдХреБрдЫ рднреА рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХрдВрд╕реЛрд▓ рдЦрд╛рд▓реА рд╣реИ
рдореЗрд░реЗ рд╕рд╛рде рднреА рдпрд╣реА рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ 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
рд░реВрдк рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ (рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджреЗрдЦреЗрдВ)
v7.3.2 рд╕реЗ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдХреЗ
рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИред
рдореБрдЭреЗ рднреА рдЙрд╕реА рдмрдЧ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд▓реЗрдХрд┐рди рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдирд╣реАрдВред
рдпрд╣ рдореЗрд░рд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╣реИред
const render = () => {
ReactDOM.render(
<DragDropContextProvider backend={HTML5Backend}>
<Provider store={store}>
<ConnectedRouter history={history}>
<AppContainer>
<App />
</AppContainer>
</ConnectedRouter>
</Provider>
</DragDropContextProvider>,
document.getElementById('app')
);
};
рдбреНрд░реИрдЧрдбреНрд░реЙрдкрдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯрдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдЕрдЬреНрдЮрд╛рдд рд╣реИ
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ?
рдореИрдВрдиреЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ
рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рднреА рдиреЗ рджреЗрд╡ рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯреВрдЯ рдЧрдпрд╛ред
рд╕рдорд╕реНрдпрд╛ рдпреВрдЬрдбреНрд░реИрдЧ рдЖрдпрд╛рдд рдкрде рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рдереА ...
рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдЖрдпрд╛рдд
import {useDrag} from "react-dnd/lib/index";
рдХрд╛рд░реНрдп рдЖрдпрд╛рдд
import {useDrag} from "react-dnd";
рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдкрд╣рд▓рд╛ рдЖрдпрд╛рдд рдХреИрд╕реЗ рд╣реБрдЖред
рд╕рд╛рде рд╣реА, рдореИрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддрд╛
рд╕рдВрджрд░реНрдн:
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдЕрднреА рддрдХ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди? рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд╕реБрдЭрд╛рдП рдЧрдП рдХреБрдЫ рднреА рдорджрдж рдирд╣реАрдВ рдХреАред
"react-dnd": "^11.1.3",
"react-dnd-html5-backend": "^11.1.3",
рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдореИрдВ рд░рд╛рдЬреНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддрд╛ рд╣реВрдВ, рдЬрдм рдореИрдВ рдХрдВрд╕реЛрд▓ рд▓реЙрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рд░реЗрдВрдбрд░ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдерд╛: