Redux状态正在更改,但App.js未重新呈现

esbemjvw  于 2022-11-12  发布在  其他
关注(0)|答案(2)|浏览(142)

我是Redux的新概念,只是尝试在Redux状态更改时将className添加到App.js中的div。

const menuToggle = useSelector((state) => state.menuToggle);

 <div className="App">
     <div className={`layout-wrapper ${menuToggle ? 'toggled' : ''}`}>
         <div className="layout-container">

Redux状态正在获取更改

当menuToggle变为true时,将添加className。但当它更新为false时,App.js不会重新呈现。

谁能告诉我我错过了什么?

hts6caw3

hts6caw31#

我觉得你的状态不对。
您拥有的是:

{
   // other state
   menuToggle: {
       menuToggle: false // or true
   }
}

由于您随后访问state.menuToggle,它将返回一个对象而不是bool,并且对象是真实的。(现在嵌套了state.menuToggle.menuToggle)属性返回到false并不重要,因为state.menuToggle仍然是一个对象,因此是真实的。您可能想知道为什么它第一次翻转--可能是因为初始状态是正确的形状,并且是触发动作/减缩器通过改变它以具有附加的嵌套层来打破该状态。
简而言之,它 * 是 * 重新呈现,但正在读取的值不是你认为的值,一旦触发了切换操作,读取的值将永远停留在真实值上。
你的意思可能是让国家一直保持这种状态:

{
   // other state
   menuToggle: false // or true
}

要修正这个问题,你可以把选择器改为state.menuToggle.menuToggle,但我认为真实的的修正是修正你的reducer或action中错误地设置状态形状的bug。

svmlkihl

svmlkihl2#

确保Redux存储已正确配置并确定了作用域。
下面是一个CodeSandbox demo的应用程序。
索引.jsx

import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { Provider } from "react-redux";
import { store } from "./store";
import App from "./App";

const rootElement = document.getElementById("root");
const root = createRoot(rootElement);

root.render(
  <StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </StrictMode>
);

应用程序.jsx

import "./styles.css";
import { useCallback } from "react";
import { useDispatch, useSelector } from "react-redux";
import { toggleMenu } from "./appSlice";

const App = () => {
  const dispatch = useDispatch();
  const { menuToggle } = useSelector((state) => state.app); // appReducer (via store)

  const onToggle = useCallback(() => {
    dispatch(toggleMenu());
  }, [dispatch]);

  return (
    <div className="App">
      <button onClick={onToggle}>{menuToggle ? "Hide" : "Show"}</button>
      {menuToggle && <h2 className="card">Hello World</h2>}
    </div>
  );
};

export default App;

应用程序切片.jsx

import { createSlice } from "@reduxjs/toolkit";

const appSlice = createSlice({
  name: "app",
  initialState: {
    menuToggle: false
  },
  reducers: {
    openMenu(state) {
      state.menuToggle = true;
    },
    closeMenu(state) {
      state.menuToggle = false;
    },
    toggleMenu(state) {
      state.menuToggle = !state.menuToggle;
    }
  }
});

export const { closeMenu, openMenu, toggleMenu } = appSlice.actions;
export default appSlice.reducer;

存储.jsx

import { configureStore } from "@reduxjs/toolkit";
import appReducer from "./appSlice";

const store = configureStore({
  reducer: {
    app: appReducer
  }
});

export { store };

样式. css

.App {
  font-family: sans-serif;
  text-align: center;
}

.card {
  border: thin solid grey;
  border-radius: 1rem;
  padding: 1rem;
}

相关问题