λ²κ·Έ μ€λͺ
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
-statementμ
λλ€.
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: λ°©κΈ Portalμ μ¬μ©ν λ λ¬Έμ κ° λ°μνκ³ μ€λλ ReactDOM.unstable_renderSubtreeIntoContainer
APIλ₯Ό ReactDOM.createPortal
λ‘ κ΅μ²΄νμ¬ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
λ λλ§ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° λ§μ μκ°μ ν μ νμ§ μμ μ΄μ λ 무μμ λκΉ? μ¬κΈ°μμ λ΅μ μ°Ύμμ΅λλ€. μνμ μ§μ§νκ² μννμμμ€. κ°μ¬ν©λλ€.
React 16.8.1μ λν΄ μ‘΄μ¬νλ κ² κ°μ΅λλ€. λ΄ κ΄λ¦¬μλ μμ±λμ§ μμΌλ©° DragSource
λ΄λΆμ Context.Consumerλ μμμ λ λλ§νμ§ μμ΅λλ€.
μ΄κ²μ λ¬Έμμ λΉ λ₯Έ μμ μΉμ μ΄λμλ μμ΅λλ€.
μ΄κ²μ μ€μ λ‘ λ¬Έμμ μμ΄μΌ νλ 첫 λ²μ§Έ κ²μ λλ€ ...
λμΌν λ¬Έμ κ° μμ§λ§ νΉμ νλ‘λμ
λΉλμμλ§ λ°μν©λλ€( 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')
);
};
DragDropContextProviderλ₯Ό μ μ μμ
μ΄ λ¬Έμ λ μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ€λλ κ²μΌλ‘ νμλμμ΅λλ€. λ μ΄μμ νλμ΄ μμΌλ©΄ νμλ©λλ€. κ·νμ κΈ°μ¬μ κ°μ¬λ립λλ€.
κ·Έκ²μ΄ μλμΌλ‘ λ«νκΈ° μ μ ν΄κ²°λμλμ§ μλ μ¬λμ΄ μμ΅λκΉ?
λ΄κ° ν΄κ²°ν λ°©λ²
μ κ²½μ°μλ λͺ¨λ devμμ μ μλνμ§λ§ νλ‘λμ
μμλ μμ ν κΉ¨μ‘μ΅λλ€.
λ¬Έμ λ useDrag κ°μ Έμ€κΈ° κ²½λ‘μμ λ°μνμ΅λλ€...
κ°μ Έμ€κΈ°κ° μλνμ§ μμ
import {useDrag} from "react-dnd/lib/index";
μμ
κ°μ Έμ€κΈ°
import {useDrag} from "react-dnd";
μ¦, 첫 λ²μ§Έ μμ μ΄ μ΄λ»κ² μμλμλμ§ μ λ§λ‘ λͺ¨λ¦ λλ€.
λν μ± λ£¨νΈμμ DndProviderλ₯Ό κ°μ Έμ¬ νμκ° μλ€κ³ μμ μκ² λ§ν μ μμ΅λλ€. λ¬Έμ κ° κ°μ Έμ€κΈ°λ‘ μΈν΄ λ°μνλ€λ κ²μ μκΈ° μν΄ μ΄μ μ μννμ§λ§ κ°μ Έμ€κΈ° "μμ " νμ μ± λ£¨νΈ λμ κ΅¬μ± μμ μ€ νλμμ DndProviderλ₯Ό 볡μνμΌλ©°(λ κΉ¨λν μ½λμ©) μλν©λλ€. μ’μ.
λ¬Έλ§₯:
μ΄ λ¬Έμ λ μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ€λλ κ²μΌλ‘ νμλμμ΅λλ€. λ μ΄μμ νλμ΄ μμΌλ©΄ νμλ©λλ€. κ·νμ κΈ°μ¬μ κ°μ¬λ립λλ€.
μμ§ ν΄κ²°μ± μ΄ μλμ? μ΄ μ£Όμ μμ μ μλ λ΄μ©μ΄ λμμ΄ λμ§ μμμ΅λλ€.
"λ°μ-dnd": "^11.1.3",
"react-dnd-html5-backend": "^11.1.3",
μν μμΉλ₯Ό λ³κ²½ν λλ§ λͺ¨λ κ²μ΄ μ μλν©λλ€. μ½μ λ‘κ·Έμμ λ³κ²½ μ¬νμ λ³Ό μ μλ λμ λ λλ§μ λ³Ό μ μμ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
μλμ κ°μ΄ 곡κΈμλ₯Ό μΆκ°ν΄μΌ νμ΅λλ€.