我正在构建一个功能组件,它应该使用计算数组(层数组)呈现一个可排序组件(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地图可观察项中的图层变量会根据排序进行更新?下面是组件的代码
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);这是商店的代码
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");
});
}
};
}发布于 2020-08-19 01:21:27
我建议在将数据传递给ReactSortable或任何其他库之前对数据调用toJS,并使可观察数据与可排序数据保持同步,您将需要使用一些onDragEnd事件挂钩并从那里调用mobx操作来更新可观察数据。但是我不确定react-sortablejs是否支持这个事件钩子。
https://stackoverflow.com/questions/63457922
复制相似问题