redux React还原:未定义状态

42fyovps  于 2022-11-12  发布在  React
关注(0)|答案(2)|浏览(161)

在react-redux上运行,我的状态isCartVisible显示为undefined,我使用了简单的函数组件,并将我的存储存储在不同的文件中。

//main index.js file
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';    
import './index.css';
import App from './App';
import store from './redux-store/store';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Provider store={store}><App /></Provider>);

//App.js

import {  useSelector } from "react-redux";
import Layout from "./components/Layout/Layout";
import Cart from "./components/Cart/Cart";

function App() {
    const cartVisible = useSelector((state) => state.isCartVisible);

    return (
        <Layout>
            {cartVisible && <Cart />}
        </Layout>
    );
}

以及应用程序内部某个位置的组件,通过单击按钮我想切换<Cart>组件

//CartButton.js
import { useDispatch } from "react-redux";

const CartButton = () => {
    const dispatch = useDispatch();

    const cartShowHandler = () => {
        dispatch({ type: "cartToggle" });       
    };

    return (
        <button onClick={cartShowHandler}>
            Click
        </button>
    );
};

这是我的存储文件,在这里我用reducer创建了存储

import { createStore } from "redux";

const uiReducer = (state = { isCartVisible: true }, action) => {
    if (action.type === "cartToggle") {
        state.isCartVisible = !state.isCartVisible;
    }
    return state;
};

const uiStore = createStore(uiReducer);

export default uiStore;
fjaof16o

fjaof16o1#

你永远不应该突变的状态。你的条件在减速器应该看起来像这样,它会工作。

if (action.type === "cartToggle") {
    return { ...state, isCartVisible: !state.isCartVisible};
  }

因为在你的例子中现在只有一个键,你也可以这样做。

return { isCartVisible: !state.isCartVisible};

但是,在减速器的条件下返回整个状态总是一个很好的做法。
记住redux做浅层比较。这意味着它检查一个对象的引用是否被改变。在你的例子中它没有被改变。
有一次,我在一篇博客文章https://dev.to/machy44/shallow-comparison-in-redux-3a6中写了一些关于这个主题的内容

gkl3eglg

gkl3eglg2#

在Redux中,你只能有一个存储,所以很有可能你的useSelector调用实际上试图从另一个存储中选择数据,而不是你期望的数据。
您可以使用类似于

const fullState = useSelector(state => state)
console.log(fullState)

也就是说,你在这里写的Redux风格已经过时很多年了--在现代的Redux中,你不是在写switch.. case reducer或者string action类型。而且,createStore在这里被弃用,取而代之的是configureStore
我强烈推荐你read about modern Redux,然后遵循official Redux tutorial
无论您现在所关注的是什么资源,都可能会让您对如何使用Redux有一个非常不正确的看法。

相关问题