【发布时间】:2020-08-29 20:25:33
【问题描述】:
我正在尝试从在我的新项目中使用 redux 切换到使用钩子。我的理解是,我可以使用一个自定义钩子,例如这个钩子,从各种组件中加载它以访问相同的状态,类似于 redux 让我访问状态的方式。
import { useState } from 'react';
export const useSelectedStore = () => {
const [selectedStore, setSelectedStore] = useState();
return [
selectedStore,
setSelectedStore,
];
};
我遇到的问题是我有一个页面,其中包含一个项目,当用户单击一个项目时,我需要设置所选商店,然后将它们重定向到该页面。这是组件内的点击操作:
import React from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import Home from './pages/Home/Home';
import Stores from './pages/Stores/Stores';
import StoreDetails from './pages/StoreDetails/StoreDetails';
function App() {
return (
<Router>
<div>
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route path="/stores">
<Stores />
</Route>
<Route path="/store-details">
<StoreDetails />
</Route>
</Route>
</Switch>
</div>
</Router>
);
}
export default App;
import React, { useState } from 'react';
import { withRouter } from 'react-router-dom';
import PropTypes from 'prop-types';
import { useSelectedStore } from '../../hooks/useSelectedStore';
function Stores(props) {
const { history } = props;
const [selectedStore, setSelectedStore] = useSelectedStore();
const goToStoreDetails = (index) => {
// Now add our store data
setSelectedStore(storeRequestDetails.stores[index]);
console.log(selectedStore);
history.push('/store-details');
};
控制台日志输出未定义,因为尚未设置存储,因此历史推送发生在值真正设置之前。
我尝试在组件中使用这样的 useEffect 来获取更改并在重定向之前处理更改,但状态正在为 store-details 页面的组件上重置。
import React, { useEffect, useState } from 'react';
import { withRouter } from 'react-router-dom';
import PropTypes from 'prop-types';
import { useSelectedStore } from '../../hooks/useSelectedStore';
function Stores(props) {
const { history } = props;
const [selectedStore, setSelectedStore] = useSelectedStore();
useEffect(() => {
if (selectedStore) {
console.log(selectedStore);
history.push('/store-details');
}
}, [selectedStore]);
const goToStoreDetails = (index) => {
// Now add our store data
setSelectedStore(storeRequestDetails.stores[index]);
};
此处的控制台日志将显示实际选择的商店详细信息,但在下一页加载后再次显示状态现在再次未定义。
import React from 'react';
import { useSelectedStore } from '../../hooks/useSelectedStore';
function StoreDetails() {
const [selectedStore, setSelectedStore] = useSelectedStore();
console.log(selectedStore); // Returns undefined
如何在这两个组件之间正确共享状态?
【问题讨论】:
-
很遗憾你的理解是不正确的。自定义钩子的每次调用都将通过在内部调用
useState创建自己的状态。更像是您将自定义挂钩内的代码直接写入您正在使用它的组件中。为了您的目的,您将不得不使用反应上下文。
标签: javascript reactjs react-router react-hooks