์ด๊ฒ์ ๋ ๋ง์ ๋์๋ง ํฌ๋ผ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋์ด ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ๋ง์ ๋ ธ๋ ฅ์๋ ๋ถ๊ตฌํ๊ณ ์ด ์ฌ์ฉ ์ฌ๋ก์์ DropTarget์ผ๋ก๋ถํฐ ์ด๋ค ์๋ต๋ ๋ฐ์ ์ ์์ต๋๋ค.
๋๋กญ ์ด๋ฒคํธ๋ฅผ ์ค์ค๋ก ๋ฑ๋กํ ์ ์๋ ์ผ๋ จ์ '์นดํ ๊ณ ๋ฆฌ ์นด๋'๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค.
๋ด๊ฐ ์ฌ๊ธฐ์์ ๋์ ๋๋ ๋ง์ฝ์ ํผ์ฐ๊ณ ์์ต๋๊น?
DragSource ๊ธฐ๋ฅ์ด ์๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ง๋ง DropTarget ์ฌ์ ๊ธฐ๋ฅ์์ ๊ธฐ๋กํ๋ ์ด๋ค ๊ฒ๋ ์ฝ์์ ํ์๋์ง ์๊ณ ์์ ํ ์ ์ฉ๋์ง ์์ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
import React, { Component } from 'react'
import { DropTarget, DragSource } from 'react-dnd'
import _ from 'lodash'
export const ItemTypes = {
CATEGORY: 'category-item'
}
class CategoryTreeFork extends Component {
componentWillReceiveProps = (nextProps) => {
console.log("Next cat props", nextProps)
}
render(){
var { thisCat, childCat, level, dropEvent } = this.props
const { connectDragSource, connectDropTarget, isDragging, isOver } = this.props
return connectDragSource(
<div className="category-tree-fork">
<div className={`category-list-item level-${level}`}
style={{
opacity: isDragging ? 0.5 : 1,
backgroundColor: isOver ? "red" : "silver"
}}>
{thisCat.name}
</div>
</div>
)
}
}
/* get dragged */
const sourceSpec = {
beginDrag(props){
return { category_id: props.thisCat.category_id }
}
}
const sourceCollect = (connect, monitor) => {
return {
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging()
}
}
/* get dragged onto */
const targetSpec = {
drop(props, monitor, component) {
const item = monitor.getItem()
console.log("me or my friend?", item)
},
hover(props, monitor, component){
console.log("yo what you hoverin there for homie?")
}
}
const targetCollect = (connect, monitor) => {
return {
connectDropTarget: connect.dropTarget(),
isOver: monitor.isOver()
}
}
export default _.flow([
DragSource(ItemTypes.CATEGORY, sourceSpec, sourceCollect),
DropTarget(ItemTypes.CATEGORY, targetSpec, targetCollect)
])(CategoryTreeFork)
DX๋ ์ ๊ฒฝ์ฐ์ง ์์ต๋๋ค. ๋ ๋์์ connectDropTarget์ ํธ์ถํ๋ ๊ฒ์ ์์ ์งํ์ ๊นจ๋ฌ์์ต๋๋ค. ์์ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
return connectDropTarget(connectDragSource(
<div className="category-tree-fork">
<div className={`category-list-item level-${level}`}
style={{
opacity: isDragging ? 0.5 : 1,
backgroundColor: isOver ? "red" : "silver"
}}>
{thisCat.name}
</div>
</div>
์ด๊ฒ์ ์ง๊ธ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. "๋จ์ํ" ์ ๋ ฌ ๊ฐ๋ฅํ ์์ ๋ฅผ ๋ฐ๋ฅด๊ณ ์ด์ค ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ํํ์ง๋ง connectDropTarget
๋ฅผ ์ ์ฉํ์ง ์์์ต๋๋ค.
๊ฒ์ ์์ง์์ ์ค๋ ์ฌ๋๋ค์ ์ํด _.flow
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋์ผํ ๊ตฌ์ฑ ์์์์ DragSource ๋ฐ DropTarget์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export default
DragSource(typeA, specA, collectA)(
DropTarget(typeB, specB, collectB)(
Component));
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ฒ์ ์์ง์์ ์ค๋ ์ฌ๋๋ค์ ์ํด
_.flow
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋์ผํ ๊ตฌ์ฑ ์์์์ DragSource ๋ฐ DropTarget์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.