react dnd demo
target
import React ,{ Component } from 'react'; import { DropTarget } from 'react-dnd'; import Item from '../components/Item'; import styles from './IndexPage.css'; const boxTarget = { // 当有对应的 drag source 放在当前组件区域时,会返回一个对象,可以在 monitor.getDropResult() 中获取到 drop(props, monitor, component) { console.log(monitor.didDrop()); const { key } = monitor.getItem(); // props.handDrop(key); }, hover(props, monitor, component) { return monitor.isOver({ shallow: true }) }, canDrop(props, monitor) { return monitor.getItem(); } } function collect ( connect, monitor) { return { connectDropTarget: connect.dropTarget(), hovered: monitor.isOver(), canDrop: monitor.canDrop(), item: monitor.getItem(), }; } class Target extends Component { render(){ const { connectDropTarget, hovered, arr, canDrop, item ,handDrop } = this.props; console.log(this.props); const backgroundColor = hovered ? 'lightgreen' : 'white'; const isActive = canDrop && hovered; // if ( isActive && item) { // handDrop(item.key); // } return connectDropTarget( <div className={styles.target} style={{background:backgroundColor}}> target {arr.map(item => <Item key={item.key} item={item}/>)} </div> ); } } export default DropTarget('item', {}, collect)(Target);
item
import React,{ Component } from 'react'; import { DragSource } from "react-dnd"; const itemSoure = { beginDrag(props) { return props.item; }, endDrag(props,monitor,component) { if (!monitor.didDrop()) { return; } return props.handDrop(props.item.key) // const item = monitor.getItem() // // 拖拽元素放下时,drop 结果 // const dropResult = monitor.getDropResult() // console.log(dropResult); // if (props.handDrop) { // } else { // return ; // } } }; function collect (connect, monitor){ return { connectDragSource: connect.dragSource(), connectDragPreview: connect.dragPreview(), isDragging: monitor.isDragging() }; } class Item extends Component { render(){ const { text, isDragging,connectDragSource, item} = this.props; return connectDragSource( <div className={{}}> {item.text} </div> ) } } Item.propTypes = { }; export default DragSource('item',itemSoure, collect)(Item);
app
import React, { Component } from 'react'; import { connect } from 'dva'; import HTML5Backend from 'react-dnd-html5-backend'; import { DragDropContext } from 'react-dnd'; import styles from './IndexPage.css'; import Item from '../components/Example'; import Target from './Target'; class App extends Component { state = { list : [ {key: 0, text: 'text1'}, {key: 1, text: 'text2'}, {key: 2, text: 'text3'}, {key: 3, text: 'text4'} ], arr:[] } deleteitem = key => { const { list } = this.state; // this.setState({ // list: list.filter( item => item.key !== key) // }) this.setState( preState => { let items = preState.list; const index = items.findIndex(item => item.key === key); items.splice(index,1); return {items}; }) } additem = key => { this.setState( preState => { const arr = preState.arr; let list = preState.list; const index = list.findIndex(item => item.key === key); arr.push(list[index]); list.splice(index,1); return {list,arr}; }) } additems = key => { this.setState( preState => { const arr = preState.arr; let list = preState.list; const index = arr.findIndex(item => item.key === key); list.push(list[index]); arr.splice(index,1); return {list,arr}; }) } render(){ return ( <div className={styles.normal}> <header> demo </header> <div> {this.state.list.map(item => <Item key={item.key} item={item} handDrop={(key) => (this.additem(key))}/>)} </div> <Target arr={this.state.arr} /> </div> ); } } export default DragDropContext(HTML5Backend)(App);