2016-11-10 3 views
1

정렬 할 항목 테이블을 필요로하는 응용 프로그램을 작성하고 정렬에 따라 orderNumber를 변경합니다. 나는 sort-ordering의 기능을 처리하기 위해 react-dnd라는 라이브러리를 설치하고 활용했으며, 지금까지 훌륭하게 작동했다. 임피던스 문제는 업데이트입니다. 사용자가 항목 중 하나를 이동하면 API에 PUT 요청을 보내고 orderNumber를 업데이트해야합니다. 어제 밤 큰 일을하고 있었는데 여기 제 코드가 있습니다.React 드래그 앤 소프 후 PUT 요청을 내림

을 ListItem (정렬 업데이트되는 항목) :

import React, {PropTypes} from 'react'; 
import {Link} from 'react-router'; 
import {DragSource, DropTarget} from 'react-dnd'; 
import sdk from '../../js/sdk'; 
import ItemTypes from './ItemTypes'; 

const itemSource = { 
    beginDrag(props) { 
     return {id: props.id}; 
    } 
}; 

const itemTarget = { 
    hover(props, monitor) { 
     const draggedId = monitor.getItem().id; 
     if (draggedId !== props.id) { 
      props.swapItems(draggedId, props.id); 
     } 
    } 
}; 


const DragSourceDecorator = DragSource(ItemTypes.ITEM, itemSource, (connect, monitor) => { 
    return { 
     connectDragSource: connect.dragSource(), 
     isDragging: monitor.isDragging(), 
    }; 
}); 

const DropTargetDecorator = DropTarget(ItemTypes.ITEM, itemTarget, (connect) => { 
    return {connectDropTarget: connect.dropTarget()}; 
}); 

class SwagBagItem extends React.Component { 
    constructor(props) { 
     super(props); 

     this._handleDelete = this._handleDelete.bind(this); 
    } 

    componentWillReceiveProps(nextProps) { 
     const swagbagItemCpy = Object.assign({}, nextProps.swagbagItem); 
     delete swagbagItemCpy.id; 

     if (nextProps) { 
      sdk.put(`swagbags/${nextProps.swagbag.id}/items/${nextProps.swagbagItem.id}`, swagbagItemCpy) 
       .done((result) => { 
        console.log(result); 
       }).fail((error) => { 
        console.log(error); 
       }) 
      ; 
     } 
    } 

    _handleDelete(event) { 
     event.preventDefault(); 
     event.stopPropagation(); 

     if (confirm('Are you sure you want to delete this Swagbag Item?')) { 
      sdk.delete(`swagbags/${this.props.swagbag.id}/items/${this.props.swagbagItem.id}`) 
       .done(() => { 
        console.log('Swagbag Item remove!'); 
       }).then(() => { 
        this.props.loadSwagBags(); 
       }); 
      } 
     } 

    render() { 
     const {swagbagItem} = this.props; 
     return this.props.connectDragSource(this.props.connectDropTarget(
      <tr className="swagbag-item"> 
       <td>{swagbagItem.id}</td> 
       <td><Link to={`${this.props.swagbag.id}/items/${swagbagItem.id}`}>{swagbagItem.name}</Link></td> 
       <td>{swagbagItem.uri}</td> 
       <td> 
        <div className="btn-group btn-group-xs pull-right" role="group"> 
         <Link to={`${this.props.swagbag.id}/items/${swagbagItem.id}/edit`} className="btn btn-info">Edit</Link> 
         <Link to={`${this.props.swagbag.id}/items/${swagbagItem.id}`} className="btn btn-info">View</Link> 
         <button className="btn btn-danger btn-xs" onClick={this._handleDelete}>Remove</button> 
        </div> 
       </td> 
      </tr> 
     )); 
    } 
} 


SwagBagItem.propTypes = { 
    loadSwagBags: PropTypes.func, 
    params: PropTypes.object, 
    swagbag: PropTypes.object, 
    swagbagItem: PropTypes.object, 
}; 

export default DropTargetDecorator(DragSourceDecorator(SwagBagItem)); 

이러한 항목을 보유하고 용기 또는 목록 :

import React, {PropTypes} from 'react'; 
import {Link} from 'react-router'; 
import {DragDropContext} from 'react-dnd'; 
import HTML5Backend from 'react-dnd-html5-backend'; 
import sdk from '../../js/sdk'; 

import Nav from '../Nav'; 

import SwagBagItem from '../SwagBagItem'; 

class SwagBagItemsList extends React.Component { 
    constructor(props) { 
     super(props); 

     this.state = { 
      swagbag: null, 
      swagbagItems: [], 
     }; 

     this._loadSwagBags = this._loadSwagBags.bind(this); 
     this._compareItems = this._compareItems.bind(this); 
     this._swapItems = this._swapItems.bind(this); 
    } 

    componentWillMount() { 
     this._loadSwagBags(); 
    } 

    _compareItems(item1, item2) { 
     return item1.orderNumber - item2.orderNumber; 
    } 

    _swapItems(itemNo1, itemNo2) { 
     const items = this.state.swagbagItems; 
     let item1 = items.filter(item => item.id === itemNo1)[0]; 
     let item2 = items.filter(item => item.id === itemNo2)[0]; 
     let item1Order = item1.orderNumber; 
     item1.orderNumber = item2.orderNumber; 
     item2.orderNumber = item1Order; 

     items.sort(this._compareItems); 
     this.setState({swagbagItems: items}); 
    } 

    _loadSwagBags() { 
     sdk.getJSON(`swagbags/${this.props.params.id}`) 
      .done((result) => { 
       this.setState({swagbag: result}); 
      }) 
      .then(() => { 
       sdk.getJSON(`swagbags/${this.props.params.id}/items?fields=id,name,summary,uri,itemImageFile,orderNumber`).done((results) => { 
        this.setState({swagbagItems: results}); 
       }); 
      }); 
    } 

    render() { 
     let swagbagItems = null; 
     if (this.state.swagbagItems) { 
      swagbagItems = this.state.swagbagItems.map((item) => { 
       return <SwagBagItem 
          loadSwagBags={this._loadSwagBags} 
          swagbag={this.state.swagbag} 
          swagbagItem={item} 
          key={item.id} 
          id={item.id} 
          swapItems={this._swapItems} 
         />; 
      }); 
     } 
     if (!this.state.swagbag) { 
      return <div>Loading...</div>; 
     } 
     return (
      <div> 
       <h1>Swagbag Items</h1> 
       <Nav swagbag={this.state.swagbag} /> 
       <table className="table"> 
        <thead> 
         <tr> 
          <th>id</th> 
          <th>name</th> 
          <th>uri</th> 
          <th></th> 
         </tr> 
        </thead> 
        <tbody> 
         {swagbagItems} 
        </tbody> 
       </table> 
       <Link to={`swagbags/createItem/swagbagid/${this.state.swagbag.id}`} className="btn btn-success">Add Item</Link> 
      </div> 
     ); 
    } 
} 

SwagBagItemsList.propTypes = { 
    params: PropTypes.object, 
}; 

export default DragDropContext(HTML5Backend)(SwagBagItemsList); 

그것은 PUT 요청을하지만, 그 제작 수백있다 하나의 물체를 움직여서 한 줄에 나는 왜 내 인생을 생각할 수 없는지 알아 낸다. 이로 인해 응용 프로그램에 심각한 지연이 발생하고 응답이 없습니다. 나는 이것을 올바른 방향으로 가고 있습니까, 그렇다면 이것에 대한 해결책은 무엇입니까?

EDIT # 1 : 오늘 깨우쳐 응용 프로그램이 정상적으로 작동하고 있습니다. 불행히도 이것은 생산 단계에 있으며, 그 전에는 800+ PUT 요청의 버그를 다시 만들어 내야합니다. 이것에 현상금을 부과 할 수 있습니다.

답변

0

일단 드래그가 끝나면 업데이트를 보내도록하려면, 일단 드래그 될 드래그 소스 (http://gaearon.github.io/react-dnd/docs-drag-source.html)에 추가 할 수있는 endDrag 기능이 있으며 드래그를 마칠 때만 실행됩니다. 그래서 당신은 componentWillReceiveProps에서 API 호출을 제거하고이 같은 소스로 이동하는 경우 : 나는 완벽하게 알지 못하고 swagbag에 무엇 있음을 예측할 수 없습니다 (

const itemSource = { 
    beginDrag(props) { 
    return { 
     id: props.id, 
     swagbagId: props.swagbag.id, 
     swagbagItem: props.swagbagItem, 
    }; 
    }, 
    endDrag(props, monitor) { 
    const item = monitor.getItem(); 
    sdk.put(`swagbags/${item.swagbagId}/items/${item.swagbagItem.id}`, item.swagbagItem) 
     .done((result) => { 
      console.log(result); 
     }).fail((error) => { 
      console.log(error); 
     }) 
    ; 
    }, 
}; 

그것은 단지 전화 한 번해야하고 swagbagItem하지만 그것을 생각해야한다). 참고 : DragSource 모니터 (http://gaearon.github.io/react-dnd/docs-drag-source-monitor.html)에서 getItem() 함수를 사용하여 beginDrag에 전달 된 내용을 검색합니다.