确实,将搜索参数附加到URL中并在返回时读取它们是一种常见的方法,但它可能不是最优雅或最可维护的解决方案。此外,当参数变得复杂或数量增加时,URL可能会变得冗长且难以管理。
监听路由变化是一个更好的想法,因为这种方法更灵活且可维护。在前端,你可以使用React Router(或其他你正在使用的路由库)来监听路由变化,并在必要时恢复搜索表单的状态。
以下是一个使用React Router的基本示例,说明如何在后台管理系统中实现此功能:
- 安装React Router(如果你还没有安装的话):
npm install react-router-dom
- 在你的应用中设置路由:
import { BrowserRouter as Router, Route, Switch, useLocation, useHistory } from 'react-router-dom';
// 你的组件
import PageA from './PageA';
import PageB from './PageB';
function App() {
return (
<Router>
<Switch>
<Route path="/a" component={PageA} />
<Route path="/b" component={PageB} />
</Switch>
</Router>
);
}
export default App;
- 在PageA中保存和恢复搜索表单的状态:
import React, { useState, useEffect } from 'react';
import { useLocation, useHistory } from 'react-router-dom';
function PageA() {
const [searchParams, setSearchParams] = useState({});
const location = useLocation();
const history = useHistory();
// 从URL解析搜索参数
useEffect(() => {
const queryParams = new URLSearchParams(location.search);
setSearchParams(Object.fromEntries(queryParams.entries()));
}, [location]);
// 在跳转到其他页面时保存搜索参数
const handleGoToPageB = () => {
const searchParamsString = new URLSearchParams(searchParams).toString();
history.push(`/b?${searchParamsString}`);
};
// 在返回PageA时恢复搜索参数
useEffect(() => {
if (location.pathname === '/a') {
const queryParams = new URLSearchParams(location.search);
setSearchParams(Object.fromEntries(queryParams.entries()));
}
}, [location]);
return (
<div>
<h1>Page A</h1>
<form>
{/* 渲染搜索表单 */}
</form>
<button onClick={handleGoToPageB}>Go to Page B</button>
</div>
);
}
export default PageA;
- 在PageB中处理返回操作:
import React from 'react';
import { useHistory } from 'react-router-dom';
function PageB() {
const history = useHistory();
const handleGoBack = () => {
history.goBack();
};
return (
<div>
<h1>Page B</h1>
<button onClick={handleGoBack}>Go Back</button>
</div>
);
}
export default PageB;
在这个示例中,PageA
组件使用useLocation
和useEffect
来监听URL的变化,并在需要时恢复搜索表单的状态。当从PageA
跳转到PageB
时,搜索参数会被附加到URL中。当用户从PageB
返回PageA
时,这些参数会被读取并用于恢复表单状态。
这种方法的好处是它是声明式的,不需要在每个页面上进行繁琐的处理。此外,它也更易于维护和扩展,因为你可以轻松地添加更多的路由和页面,而无需更改现有的逻辑。
这种来回跳的参数,
url
参数、storage
、弹层都可以,封装一个工具统一来处理,都差不多。你说的第二种,应该是属于表单保存功能,就是填到一半,点击保存,下次回来可以继续填,这种用接口来做。
下面是路由方案:
利用
PersistState
这个高阶组件,让列表页的状态持久化。列表和详情页(路由方案)
手动持久化