在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;
2条答案
按热度按时间fjaof16o1#
你永远不应该突变的状态。你的条件在减速器应该看起来像这样,它会工作。
因为在你的例子中现在只有一个键,你也可以这样做。
但是,在减速器的条件下返回整个状态总是一个很好的做法。
记住redux做浅层比较。这意味着它检查一个对象的引用是否被改变。在你的例子中它没有被改变。
有一次,我在一篇博客文章https://dev.to/machy44/shallow-comparison-in-redux-3a6中写了一些关于这个主题的内容
gkl3eglg2#
在Redux中,你只能有一个存储,所以很有可能你的
useSelector
调用实际上试图从另一个存储中选择数据,而不是你期望的数据。您可以使用类似于
也就是说,你在这里写的Redux风格已经过时很多年了--在现代的Redux中,你不是在写switch.. case reducer或者string action类型。而且,
createStore
在这里被弃用,取而代之的是configureStore
。我强烈推荐你read about modern Redux,然后遵循official Redux tutorial。
无论您现在所关注的是什么资源,都可能会让您对如何使用Redux有一个非常不正确的看法。