首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mobx反应可排序的JS

使用mobx反应可排序的JS
EN

Stack Overflow用户
提问于 2020-08-18 04:07:40
回答 1查看 206关注 0票数 2

我正在构建一个功能组件,它应该使用计算数组(层数组)呈现一个可排序组件(ReactSortable),该组件来自使用react-sortablejs的mobx store。组件在应用程序加载时呈现,但当通过拖放元素重新排列数组时,我得到以下错误:

mobx.module.js:89未捕获错误: mobx由于启用了严格模式,因此不允许在操作之外更改观察到的值。如果要进行此更改,请将代码包装在action中。已尝试修改: LayerStore@23.layersRegistry.9f332395-6bfe-4c3f-a496-8804e1dec490.chosen?实际上,layers数组是从商店中的layersRegistry地图observable计算出来的,如下面的代码所示,但在对层进行排序时,我没有更改layersRegistry observable;这就是为什么我在错误中感到困惑的原因。

这种情况下的问题是什么,我如何解决它,以便在对图层进行排序(通过拖放)时,商店或layersRegistry地图可观察项中的图层变量会根据排序进行更新?下面是组件的代码

代码语言:javascript
复制
import React, { useContext, useEffect, Fragment, useState } from "react";
import { RootStoreContext } from "../../../app/stores/rootStore";
import { observer } from "mobx-react-lite";
import LayerListItem from "./LayerListItem";
import { ReactSortable } from "react-sortablejs";

export const LayersDashboard = () => {
  const rootStore = useContext(RootStoreContext);
  const { layers, loadLayers } = rootStore.layerstore;
  useEffect(() => {
    loadLayers();
  }, [loadLayers]);

  const [items, setItems] = useState(layers);

  return (
    <Fragment>
      <ReactSortable list={layers} setList={setItems}>
        {layers.map((layer) => (
          <LayerListItem key={layer.id} layer={layer} />
        ))}
      </ReactSortable>
    </Fragment>
  );
};

export default observer(LayersDashboard);

这是商店的代码

代码语言:javascript
复制
import { observable, action, runInAction, computed } from "mobx";
import agent from "../api/agent";
import { RootStore } from "./rootStore";
import { ILayer } from "../models/Layer";

export default class LayerStore {
  rootStore: RootStore;
  constructor(rootStore: RootStore) {
    this.rootStore = rootStore;
  }

  @observable layersRegistry = new Map();


  @computed get layers() {
    return Array.from(this.layersRegistry.values());
  }

  @action loadLayers = async () => {
    try {
    
      const layers = await agent.Layers.list();
      runInAction(() => {
      
        layers.forEach((layer) => {
          this.layersRegistry.set(layer.id, layer);
        });

      });
    } catch (error) {
      runInAction(() => {
        console.log("error");
      });
    }
  };

 }
EN

回答 1

Stack Overflow用户

发布于 2020-08-19 01:21:27

我建议在将数据传递给ReactSortable或任何其他库之前对数据调用toJS,并使可观察数据与可排序数据保持同步,您将需要使用一些onDragEnd事件挂钩并从那里调用mobx操作来更新可观察数据。但是我不确定react-sortablejs是否支持这个事件钩子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63457922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档