我正在使用little-state-machine
(https://github.com/bluebill1049/little-state-machine)对于客户端站点上的向导使用react-router
,当用户返回向导登录页时,我需要重置存储。我在堆栈溢出(React Little State Machine清除数据(中遵循了这个答案,但我无法使其工作。我无法显示完整的应用程序,但从下面可以看出我所做的有什么错误吗。
App.js
createStore({
data
});
function App() {
return (
<StateMachineProvider>
<DevTool />
<div className="container">
...
<Router>
<Steps />
</Router>
</div>
</StateMachineProvider>
);
}
export default App;
Steps.js
....
import { useStateMachine } from "little-state-machine";
import clearAction from "./lsm/actions/clearAction";
...
export default () => {
....
const location = useLocation();
const { state, actions } = useStateMachine({ clearAction });
...
useEffect(() => {
let step = location.pathname.split("/")[2];
// landing page location = http://site.co.uk/wizard
// steps have url = http://site.co.uk/wizard/step[1-4]
if(!step){
actions.clearAction();
}
}, []);
return (...);
};
clearAction.js
export default function clearAction(state, payload) {
return {};
}
从您共享的代码片段中可以看到,这个Steps
组件似乎正在呈现与向导步骤相对应的Route
或一组Route
。如果我理解您的问题,您希望在步骤为0
或某个虚假值时重置向导。
问题是Steps
在装载时只运行一次此检查。要解决此问题,您可以将location
对象添加为useEffect
挂钩的依赖项,以便在location
发生任何更改时都会触发挂钩的回调。step
条件将检查是否在向导登录页上,并重置状态机。
export default () => {
....
const location = useLocation();
const { state, actions } = useStateMachine({ clearAction });
...
useEffect(() => {
let step = location.pathname.split("/")[2];
// landing page location = http://site.co.uk/wizard
// steps have url = http://site.co.uk/wizard/step[1-4]
if (!step) {
actions.clearAction();
}
}, [location]); // <-- add location as a dependency
return (...);
};