react-router-cache-router

摘要:
转载---官方文档:https://github.com/CJY0208/react-router-cache-route/blob/master/README_CN.mdCacheRoute搭配react-router工作的、带缓存功能的路由组件,类似于Vue中的keep-alive功能Reactv15+React-Routerv4+遇到的问题使用Route时,路由对应的组件在前进或后退无法被缓
转载---官方文档:https://github.com/CJY0208/react-router-cache-route/blob/master/README_CN.md
CacheRoute

搭配react-router工作的、带缓存功能的路由组件,类似于Vue中的keep-alive功能

React v15+

React-Router v4+

遇到的问题

使用Route时,路由对应的组件在前进或后退无法被缓存,导致了数据和行为的丢失

例如:列表页滚动到底部后,点击跳转到详情页,返回后会回到列表页顶部,丢失了滚动位置和数据的记录

原因 & 解决方案

Route中配置的组件在路径不匹配时会被卸载(render 方法中 return null),对应的真实节点也将从 dom 树中删除

在阅读了Route的源码后我们发现可以将children当作方法来使用,以帮助我们手动控制渲染的行为

隐藏替代删除可以解决遇到的问题

https://github.com/ReactTraining/react-router/blob/master/packages/react-router/modules/Route.js#L42-L63

安装

npm install react-router-cache-route --save

使用方法

可以使用CacheRoute组件的componentrenderchildren属性装载组件

注意:缓存语句不要写在Switch组件当中,因为Switch组件会卸载掉所有非匹配状态下的路由,需使用CacheSwitch替代Switch

使用when属性决定何时使用缓存功能,可选值为 [forward,back,always] ,默认值为forward

使用className属性给包裹组件添加自定义样式

也可以使用behavior属性来自定义缓存状态下组件的隐藏方式,工作方式是根据CacheRoute当前的缓存状态,返回一个作用于包裹组件的props

import React from 'react'import { HashRouter as Router, Switch, Route } from 'react-router-dom'import CacheRoute, { CacheSwitch } from 'react-router-cache-route'
import List from './components/List'import Item from './components/Item'
import List2 from './components/List2'import Item2 from './components/Item2'
const App = () =>(
  <Router>{/*也可使用 render, children prop
      <CacheRoute exact path="/list" render={props => <List {...props} />} />
      或
      <CacheRoute exact path="/list">
        {props => <List {...props} />}
      </CacheRoute>
      或
      <CacheRoute exact path="/list">
        <div>
          支持多个子组件
        </div>
        <List />
      </CacheRoute>
    */}
    <CacheRoute exact path="/list" component={List} when="always" /> 
    <Switch>
      <Route exact path="/item/:id" component={Item} />
    </Switch>

    <CacheSwitch>
      <CacheRoute 
        exact 
        path="/list2"component={List2} 
        className="custom-style"behavior={cached => (cached ?{
          style: {
            position: 'absolute',
            zIndex: -9999,
            opacity: 0,
            visibility: 'hidden',
            pointerEvents: 'none'},
          className: '__CacheRoute__wrapper__cached'} : {
          className: '__CacheRoute__wrapper__uncached'})}
      />
      <Route exact path="/item2/:id" component={Item2} />
      <Route
        render={() =>(
          <div>404 未找到页面</div>
)}
      />
    </CacheSwitch>
  </Router>
)

export default App

额外的生命周期

使用CacheRoute的组件将会得到一个名为cacheLifecycles的属性,里面包含两个额外生命周期的注入函数didCachedidRecover,分别用在组件被缓存和被恢复时

import React, { Component } from 'react'
export defaultclass List extends Component {
  constructor(props, ...args) {
    super(props, ...args)

    props.cacheLifecycles.didCache(this.componentDidCache)
    props.cacheLifecycles.didRecover(this.componentDidRecover)
  }
  
  componentDidCache = () =>{
    console.log('List cached')
  }

  componentDidRecover = () =>{
    console.log('List recovered')
  }

  render() {
    return(
      //...
)
  }
}

手动清除缓存

使用cacheKeyprop 和dropByCacheKey函数来手动控制缓存

import CacheRoute, { dropByCacheKey, getCachingKeys } from 'react-router-cache-route'
...
<CacheRoute ... cacheKey="MyComponent" />
...

console.log(getCachingKeys()) //如果 `cacheKey` prop 为 'MyComponent' 的缓存路由已处于缓存状态,将得到 ['MyComponent']
...

dropByCacheKey('MyComponent')
...

免责声明:文章转载自《react-router-cache-router》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇android app自动化测试之UIAutomatorJimuReport积木报表 — API数据源报表带参制作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PHP解决网站大流量与高并发

1:硬件方面   普通的一个p4的服务器每天最多能支持大约10万左右的IP,如果访问量超过10W那么需要专用的服务器才能解决,如果硬件不给力 软件怎么优化都是于事无补的。主要影响服务器的速度 有:网络-硬盘读写速度-内存大小-cpu处理速度。 2:软件方面     第一个要说的就是数据库   首先要有一个很好的架构,查询尽量不用* 避免相关子查询 给经常查...

Spring Cache的基本使用与分析

概述 使用 Spring Cache 可以极大的简化我们对数据的缓存,并且它封装了多种缓存,本文基于 redis 来说明。 基本使用 1、所需依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr...

教你七招提高.NET网站性能

一、减少往返行程(Reduce Round Trips) 使用下面的方法可以减少Web服务器和Browser之间的往返行程: 1、为Browser启用缓存 如果呈现的内容是静态的或变化周期较长,应启用Browser缓存,避免发出冗余的http请求。 2、缓冲页面输出 如果可能,则尽量缓冲页面输出,处理结束后再一次传送到客户端,这可以避免频繁传递小块...

触屏手机3G网站设计

随着智能手机iphone和Android的热潮,衍生出基于Safari和Chrome浏览器的触屏手机网站Touch Screen Mobile Website。 触屏手机网站在中国还属于起步阶段,从行业的现状来看,其体验参差不齐,笔者将从设备、系统、浏览器、网络、四个维度来与大家共同探讨触屏手机的网站设计: 一、设备 ·分辨率与屏幕尺寸 ·触屏机的交互特点...

浏览器的缓存机制

浏览器的缓存机制,其实主要就是HTTP协议定义的缓存机制(expires,Cache-control等),但是也有非HTTP协议定义的缓存机制,如使用HTML的meta标签,虽然使用上很简单,但是只有部分浏览器支持,所以并不建议使用。本文主要讲的是HTTP协议定义的缓存机制,一般将缓存定为两大类,分别是强缓存和协商缓存。 强缓存:用户发送的请求直接从客户端...

浅谈大型web系统架构(一)

目录 Web前端系统 负载均衡系统 数据库集群系统 缓存系统 分布式存储系统 分布式服务器管理系统 代码发布系统   动态应用,是相对于网站静态内容而言,是指以c/c++、php、Java、perl、.net等服务器端语言开发的网络应用软件,比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通常与数据库系统、缓存系统、分布式存储系统等密不可...