react 从列表页到详情页返回后保持列表页的状态

痛点

移动端开发时会遇到在列表页点击进入详情,返回后列表页刷新的情况,对用户体验很不友好。
在这里插入图片描述

解决方案:react-router-cache-route实现页面状态的缓存

版本

    "react": "^17.0.2",
    "react-router-cache-route": "^1.11.1",

用法

// 1.安装插件
npm install react-router-cache-route --save

思路:就是把Switch替换成CacheSwitch,因为因为Switch组件只保留第一个匹配状态的路由,卸载掉其他路由
把Route替换成CacheRoute

详细例子

1.配置路由

官网例子

import React from 'react'
import { HashRouter as Router, Route } from 'react-router-dom'
import CacheRoute, { CacheSwitch } from 'react-router-cache-route'
import List from './views/List'
import Item from './views/Item'
const App = () => (
  <Router>
    <CacheSwitch>
      <CacheRoute exact path="/list" component={List} />
      <Route exact path="/item/:id" component={Item} />
      <Route render={() => <div>404 Not Found</div>} />
    </CacheSwitch>
  </Router>
)
export default App

2.修改缓存页面的部分内容-didRecover

需求:移动端,在列表页通过底部导航跳转到首页,底部导航选中首页,此时跳转到列表页,底部导航没有选中列表页。

解决方案:使用didRecover

import BottomNav from '../../components/BottomNav/BottomNav'

constructor(props) {
  super(props);
  this.state = {
    showBotNav: true,
  }
  props.cacheLifecycles.didRecover(this.componentDidRecover)
}

componentDidRecover = () => {
  // 控制底部导航的显示
  this.setState({showBotNav: !this.state.showBotNav});
  setTimeout(()=>{ this.setState({showBotNav: !this.state.showBotNav}) }, 1)
}

至此已处理完毕,如果帮你出坑了,请打赏几毛钱在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
React 中,你可以使用 `React-Router` 来实现列表跳转详情页,并且通过 `React-Keep-Alive` 来保持跳转之前的列表状态。下面是一种实现方式: 1. 首先,确保你已经安装了 `react-router-dom` 和 `react-keep-alive` 包。 2. 在你的应用程序的根组件中,导入 `BrowserRouter` 和 `KeepAliveProvider` 组件,并将其包裹在应用程序的最外层。这样可以确保路由和 Keep Alive 功能在整个应用程序中都可用。 ```jsx import { BrowserRouter } from 'react-router-dom'; import { KeepAliveProvider } from 'react-keep-alive'; function App() { return ( <BrowserRouter> <KeepAliveProvider> {/* 应用程序的其余部分 */} </KeepAliveProvider> </BrowserRouter> ); } export default App; ``` 3. 创建一个列表组件,例如 `ListPage` 组件,用于展示列表项和处理跳转到详情页的逻辑。在 `ListPage` 组件中,使用 `react-router-dom` 的 `Link` 组件来实现跳转。 ```jsx import { Link } from 'react-router-dom'; function ListPage() { return ( <div> {/* 列表项 */} <Link to="/details/1">详情页 1</Link> <Link to="/details/2">详情页 2</Link> {/* 更多列表项 */} </div> ); } export default ListPage; ``` 4. 创建详情页组件,例如 `DetailsPage` 组件,用于展示单个列表项的详情。在 `DetailsPage` 组件中,你可以使用 `KeepAlive` 组件将其包裹起来,以保持状态。 ```jsx import { useParams } from 'react-router-dom'; import { KeepAlive } from 'react-keep-alive'; function DetailsPage() { const { id } = useParams(); return ( <KeepAlive name={`details-${id}`}> {/* 详情页内容 */} </KeepAlive> ); } export default DetailsPage; ``` 5. 在你的应用程序的路由配置中,确保将 `ListPage` 和 `DetailsPage` 组件与对应的路由路径关联起来。 ```jsx import { Switch, Route } from 'react-router-dom'; function App() { return ( <BrowserRouter> <KeepAliveProvider> <Switch> <Route exact path="/" component={ListPage} /> <Route path="/details/:id" component={DetailsPage} /> </Switch> </KeepAliveProvider> </BrowserRouter> ); } export default App; ``` 这样,当你从列表跳转到详情页时,详情页状态将会被保持,并且返回列表时会恢复到之前的状态。请注意,详情页组件需要使用 `KeepAlive` 组件进行包裹,以便实现状态保持

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值