javascript - 谁能建议将 React 拖放列表与 Redux 的动态值集成的最佳方法?

标签 javascript reactjs drag-and-drop react-sortable-hoc

我需要可排序的拖放组件能够在用户从另一个容器单击按钮时使用新值重新呈现,并且仍然保留拖放功能。例如,如果列表最初包含 [a, b, c],我需要它在用户单击将重新呈现列表为 [d, e, f, g] 的按钮时仍然有效。

我遇到了与 react-sortable-hocreact-beautiful-dnd 和其他一些问题相同的问题。所有这些库都使用一个数组来填充它们的拖放列表组件,在基本示例中通常命名为 this.state.items。他们使用名为 onSortEnd 的函数来处理项目的重新排列。下面是 react-sortable-hoc 的基本代码示例,其中包括我在 render() 中更新 this.state.items:

import React, {Component} from 'react';
import {render} from 'react-dom';
import {SortableContainer, SortableElement, arrayMove} from 'react-sortable-hoc';

const SortableItem = SortableElement(({value}) =>
  <li>{value}</li>
);

const SortableList = SortableContainer(({items}) => {
  return (
    <ul>
      {items.map((value, index) => (
        <SortableItem key={`item-${index}`} index={index} value={value} />
      ))}
    </ul>
  );
});

class SelectedItem extends Component {
  state = {
    items: ['Item 1', 'Item 2', 'Item 3', 'Item 4', 'Item 5', 'Item 6'],
  };
  onSortEnd = ({oldIndex, newIndex}) => {
    this.setState({
      items: arrayMove(this.state.items, oldIndex, newIndex),
    });
  };
  render() {

// MY CODE ADDITIONS!! THIS IS WHERE THE LIST ITEM GETS UPDATED.

    this.state.items = [this.props.selectedItem.node.title,
                this.props.selectedItem.node.subtitle,
                this.props.selectedItem.treeIndex]; 

     return <SortableList items={this.state.items} onSortEnd={this.onSortEnd} />;
  }
}

function mapStateToProps(state)
{
    return {
        selectedItem: state.activeItem
    };
}

export default connect(mapStateToProps)(SelectedItem);

一开始拖放一切正常。但是,如果我在 render() 中更改 items[] 的值,则新列表会正确呈现。但是拖/放失败。看起来拖动时会起作用;所选元素移动并且目标位置看起来会接受它但是 onMouseRelease 一切都会恢复到原来的状态。

我在数组移动后放置了 console.log 命令,以确认 items 中的列表已按需要重新排序。它只是在视觉上不会发生。拖放时没有控制台错误。

如有任何帮助,我们将不胜感激。

最佳答案

我通过利用 getDerivedStateFromProps 生命周期方法来更新项目状态来解决这个问题。

关于javascript - 谁能建议将 React 拖放列表与 Redux 的动态值集成的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50312360/

相关文章:

javascript - 闪烁文本这么多秒 - 然后消失

javascript - jQuery 完整日历事件标题时间错误

javascript - 厚盒插件 - 识别

c# - 有没有办法暂停 ActiveX 控件 (MapPoint) 或异步运行 DoDragDrop?

javascript - jQuery 拖放 - 在 'Arts & Interests' 上对 Facebook 的 ui Tokenizer 进行逆向工程

javascript - JavaScript 中的事件冒泡

javascript - 点击事件刷新我的页面

javascript - React 中带有箭头函数的 SetInterval 和回调

javascript - 如何在 React 中缓存图片?

javascript - Jquery Droppable 不适用于文件上传拖放,抛出错误 : Expected DOM element or View