Как поменять местами элементы вместо добавления в тот же контейнер?

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я использую библиотеку react dazzlehttps://github.com/Raathigesh/dazzle и метод добавления по умолчанию допускает это таким образом, что при перетаскивании одного виджета в другой контейнер контейнер расширяется для размещения обоих виджетов. Возможно ли было бы сделать так, чтобы виджеты менялись местами. например. перетащите A в контейнер B, виджет B теперь перемещается в контейнер A, а виджет A теперь находится в контейнере b. Любая помощь была бы отличной:

 import React, { Component } from 'react';
import Dashboard, { addWidget } from 'react-dazzle';


import Header from './Header';
import EditBar from './EditBar';
import Container from './Container';
import AddWidgetDialog from './AddWidgetDialog';
import CustomFrame from './CustomFrame';


import BarChart from './widgets/BarChart';
import LineChart from './widgets/LineChart';
//import ApprovalList from './ApprovalList';
import DataTable from './tableWidget';

import 'bootstrap/dist/css/bootstrap.css';


import 'react-dazzle/lib/style/style.css';


import '../styles/custom.css';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {

      widgets: {
        BarWidget: {
          type: BarChart,
          title: 'Bar Graph Widget',
        },
        ApprovalWidget: {
          type: DataTable,
          title: 'Order Approval',
        },
        LineWidget: {
          type: LineChart,
          title: 'Trend Graph Widget',
        },


      },

      layout: {
        rows: [{
          columns: [{
            className: 'col-md-12 col-sm-12 col-xs-12',
            widgets: [{key: 'LineWidget'}],
          }],
        }, {
          columns: [{
            className: 'col-md-8 col-sm-8 col-xs-8',
            widgets: [{key: 'BarWidget'}],
          }, {
            className: 'col-md-4 col-sm-4 col-xs-4',
            widgets: [{key: 'ApprovalWidget'}],
          }],
        }],
      },
      editMode: false,
      isModalOpen: false,
      addWidgetOptions: null,
    };
  }


  onRemove = (layout) => {
    this.setState({
      layout: layout,
    });
  }


  onAdd = (layout, rowIndex, columnIndex) => {

    this.setState({
      isModalOpen: true,
      addWidgetOptions: {
        layout,
        rowIndex,
        columnIndex,
      },
    });
  }

  onMove = (layout) => {
    this.setState({
      layout: layout,
    });
  }


  onRequestClose = () => {
    this.setState({
      isModalOpen: false,
    });
  }

  render() {
    return (
    <Container>
      <AddWidgetDialog widgets={this.state.widgets} isModalOpen={this.state.isModalOpen} onRequestClose={this.onRequestClose} onWidgetSelect={this.handleWidgetSelection}/>
      <Header />
      <EditBar onEdit={this.toggleEdit} />
      <Dashboard
        frameComponent={CustomFrame}
        onRemove={this.onRemove}
        layout={this.state.layout}
        widgets={this.state.widgets}
        editable={this.state.editMode}
        onAdd={this.onAdd}
        onMove={this.onMove}
        addWidgetComponentText="Add New Widget"
        />

    </Container>
    );
  }

  toggleEdit = () => {
    this.setState({
      editMode: !this.state.editMode,
    });
  };

  handleWidgetSelection = (widgetName) => {
    const {layout, rowIndex, columnIndex} = this.state.addWidgetOptions;


    this.setState({
      layout: addWidget(layout, rowIndex, columnIndex, widgetName),
    });

    this.onRequestClose();
  }
}

export default App;
  

Комментарии:

1. Сохраняйте переменную существующего значения виджета. Когда вы добавляете виджет, вызовите removeWidget(layout, RowIndex, ColumnIndex, widgetIndex); с существующим значением и после этого добавьте, как вы уже делаете.

2. Я думал о том же, но я довольно новичок в react, и я не уверен, как это реализовать, поскольку ранее не существовало метода removeWidget ().

3. Вы можете попросить разработчика dazzle предоставить метод removeWidget. Они уже используют его внутри в режиме редактирования. У них есть метод onRemove, но я не думаю, что он делает то, что мы хотим, чтобы он делал здесь.