如何更新 redux 存储树,然后用第一个数据更新另一棵树?

How to update redux store tree and then update another tree with data from first?

我有一个图表,ui 有数据输入。我使用 redux 来存储图表数据。我有2棵树。一 - 用于图表组件。它包含数字数组(轴坐标)。第二个 ui。它包含对象数组:{轴坐标,可见性}。

此结构基于show/hide图表中某些数据的能力。

Redux 商店

const initialState = {
  chartSettings: {
    ...
    axisValues: [7, 9, 1, 13, 24, ...]
  },
  chartSettingsData: {
    ...
    axisValues: [
     {value: 7, visibility: true},
     {value: 9, visibility: false},
     ...
    ]
  }
};

我希望我的图表组件从存储中获取清晰的数据数组,而不需要可见性逻辑。但我需要 ui。所以我来到了这个结构。可能是错的。但是我没有别的想法。

因此,当我单击复选框时,我更改了存储对象 chartSettingsData 中的可见性。然后,我需要用图表数据更新另一棵树。在 reducer 中更新 chartSettingsData 后,我尝试克隆过滤数组。

case "UPDATE_ITEM_VISIBILITY":
  return {
    ...state,
    chartSettingsData: {
      ...state.chartSettingsData,
      axisValues: state.chartSettingsData.axisValues.map((item, i) =>
        i === index
          ? { value: item.value, visibility: !item.visibility }
          : item
      ),
    },

    chartSettings: {
      ...state.chartSettings,
      axisValues: (() => {
        const filtered = state.chartSettingsData.axisValues.filter(
          (item) => item.visibility
        );
        return filtered.map((item, i) => item.value);
      })(),
    }

但是我在更新 chartSettingsData 之前就在 chartSettings 中获取了数据。在这种情况下更新 redux store 的正确方法是什么?

你应该在变量中构建存储的两个部分(这样你就可以使用新的chartSettingsData)然后return:

case "UPDATE_ITEM_VISIBILITY":
  const chartSettingsData = {
    ...state.chartSettingsData,
    axisValues: state.chartSettingsData.axisValues.map((item, i) =>
      i === index
        ? { value: item.value, visibility: !item.visibility }
        : item
    ),
  };

  const chartSettings = {
    ...state.chartSettings,
    axisValues: (() => {
      const filtered = chartSettingsData.axisValues.filter(
        (item) => item.visibility
      );
      return filtered.map((item, i) => item.value);
    })(),
  };

  return {
    ...state,
    chartSettingsData,
    chartSettings
  };