useSelector 未随 Redux Toolkit 更新

时间:2021-03-19 12:02:48

标签: reactjs redux react-redux redux-toolkit

我一整天都在与这个问题作斗争,希望得到任何帮助。

我有一个使用 Redux Toolkit 和 createSlice 构建的 redux 存储,如下所示:

const initialState = {
  analiticaNumber: "",
  animal: {},
  tests: [{ key: "G9116", value: "DERMATOFITOS PCR/ MUESTRA" }],
};

const PeticionSlice = createSlice({
  name: "peticion",
  initialState,
  reducers: {
    addTest: (state, action) => {
      state.tests.push(action.payload);
    },
  },
});

export const { addTest: addTestActionCreator } = PeticionSlice.actions;

export const testsArray = (state) => state.Peticion.tests;

export default PeticionSlice.reducer;

我还有一个根减速器,它导入其余的切片并为它们命名

import { combineReducers } from "redux";
import NavigationSlice from "./NavigationSlice";

const RootReducer = combineReducers({
  Peticion: PeticionSlice,
});

export default RootReducer;

当我向测试数组添加测试时,它工作正常并显示在 redux devtools 中。

问题来了,react 看不到 store 的变化,也不会更新子组件:

import { testsArray } from "./Store/PeticionSlice"; 这就是我导入 testArray 以使用 useSelector 调用的方式。 const { tests } = useSelector( (state) => state.Peticion) 的传统方式也不起作用。

function App() {
  const tests = useSelector(testsArray);

  useEffect(() => {
    console.log("tests");
  }, [tests]);

  return (
    <StylesProvider injectFirst>
      <div className="App">
        <nav>
          <Navbar />
        </nav>
        {tests.map((test) => (
          <p>{test.key}</p>
        ))}
      </div>
    </StylesProvider>
  );
}

我相信它必须对状态的可变性做一些事情,但我认为工具包可以解决这个问题,我一生都不知道如何解决这个问题。

有帮助吗???非常感谢。

** 更新 **

我相信这与我发送动作的方式有关。因为我需要为应用程序的功能添加几个边界,所以我决定使用一个外部函数来相应地过滤和分派。它不是反应组件。

import { configureStore } from "@reduxjs/toolkit";
import { addTestToList, addTestActionCreator } from "../Store/PeticionSlice";
import RootReducer from "../Store/RootReuder";

const PruebasToSubmitArray = [];

const store = configureStore({
  reducer: RootReducer,
});

const handleTestList = (test, action) => {
  const anatomia = "A";
  const microbiologia = "M";

  function oneBiopsia() {
    while (test.key.toString().charAt(0) === anatomia) {
      return PruebasToSubmitArray.some(
        (pruebaInArray) => pruebaInArray.key.toString().charAt(0) === anatomia
      );
    }
    return false;
  }

  if (!oneBiopsia() && action === "add") {
    switch (test.key.toString().charAt(0)) {
      case anatomia:
        // console.log("Open pdf for anatomia");
        store.dispatch(addTestActionCreator(test));
        break;
      case microbiologia:
        // console.log("Open pdf for micro");
        store.dispatch(addTestActionCreator(test));
        break;
      default:
        // console.log("add test to the list, ", test);
        store.dispatch(addTestActionCreator(test));
        break;
    }
  } else if (action === "remove") {
    // console.log("remove test from the list, ", test);
  } else if (oneBiopsia()) {
    console.log("Only one biopsia per peticion, ", newState);
  }

  return null;
};

export default handleTestList;

我在 App 组件上添加了一个按钮,它按预期工作(我显示了更新的状态),因为现在 redux 更新了状态,但组件不会反映它。

Code SandBox 尽我所能

2 个答案:

答案 0 :(得分:0)

Store 的多个实例

您在 store 文件中创建一个 index.js 变量并将该存储传递给 react-redux Provider 组件。这是所有 react-redux useSelectoruseDispatch 钩子将与之交互的商店实例。

在您的 HandleTestList.js 文件中,您创建了一个不同的 store 变量。然后您对该商店执行 dispatch 操作,但这些操作不会反映在您的 React 应用中,因为这不是您的 React 应用使用的商店。

handleTestList 需要 A) 导入相同的全局 store 变量。您需要将它从 index.js 移到 store.js 以避免循环依赖。或 B) 接受 dispatch 作为参数。

答案 1 :(得分:0)

就我而言非常奇怪的行为。

我做到了

state = action.payload

那没有用。

一旦我切换到

state.viewer = action.payload.viewer

一切正常!