zoukankan      html  css  js  c++  java
  • react-keep-alive 缓存使用

    今天来说说,react 的路由缓存,这个在react 中很少有实质性可用的资料!此篇记录一下

    demo 请狠狠的戳这里 ¥  http://download.lllomh.com/cliect/#/product/J804099672377354

    demo 请狠狠的戳这里 c   https://download.csdn.net/download/lllomh/12684925

    导入 之后 :

    import {
        Provider,
        KeepAlive,
    } from 'react-keep-alive';

    在路由阶段包括起来必须在Router 里层

    <Router>
                        <Provider include={['Home','Detaile']}> {/*include ={['Home']} include="a,b"  为组件的弹出名字 匹配就缓存 不写则全部缓存*/}
                            {/*<Switch>*/}
                            {/*    <Route path='/' exact component={Home}/>*/}
                            {/*    <Route path='/home' exact component={Home}/>*/}
                            {/*    <Route path='/detial' exact component={Detaile}/>*/}
                            {/*</Switch>*/}
                        <Switch>
                            <Route path="/home">
                                <KeepAlive name="Home">
                                    <Home />
                                </KeepAlive>
                            </Route>
                            <Route path="/detial">
                                <KeepAlive name="Detaile">
                                    <Detaile />
                                </KeepAlive>
                            </Route>
                        </Switch>
                        </Provider>
                    </Router>
    <Provider include={['Home','Detaile']}> 参照 官方文档 https://github.com/lllomh/react-keep-alive

    代码:

    import React, {Component} from "react"
    import { BrowserRouter as Router, Route, Switch, Redirect  } from "react-router-dom"
    import axios from 'axios'
    import {
        Provider,
        KeepAlive,
    } from 'react-keep-alive';
    
    /**路由页面**/
    import Home from '../pages/index'
    import Detaile from '../pages/detaile'
    
    React.Component.prototype.$axios = axios;
    
    
    
    class Routers extends Component {
        render() {
            return (
                <div>
    
                    <Router>
                        <Provider include={['Home','Detaile']}> {/*include ={['Home']} include="a,b"  为组件的弹出名字 匹配就缓存 不写则全部缓存*/}
                            {/*<Switch>*/}
                            {/*    <Route path='/' exact component={Home}/>*/}
                            {/*    <Route path='/home' exact component={Home}/>*/}
                            {/*    <Route path='/detial' exact component={Detaile}/>*/}
                            {/*</Switch>*/}
                        <Switch>
                            <Route path="/home">
                                <KeepAlive name="Home">
                                    <Home />
                                </KeepAlive>
                            </Route>
                            <Route path="/detial">
                                <KeepAlive name="Detaile">
                                    <Detaile />
                                </KeepAlive>
                            </Route>
                        </Switch>
                        </Provider>
                    </Router>
    
                </div>
            )
        }
    }
    
    export default Routers
    

    最后强调一点,要返回操作返回到之前的列表的滚动条位置,需要用 

    import {createBrowserHistory} from 'history'
    
    
        comeBack=()=>{
            const customHistory = createBrowserHistory();
            customHistory.goBack();
        }

    来实现,

    "react-keep-alive": "^2.5.2",
    "react-router-dom": "^5.2.0",

    版本中

     react-keep-alive中有2个使用较多的 生命周期:

    进入组件页面的时候 触发:

            componentDidActivate(){
                let home = this.$Tool.getUrlKey("from")
                this.setState({
                    isHome:!!home
                })
            }

    离开组件页面的时候触发:

           componentWillUnactivate(){
                console.log(444)
            }

    总体:

            componentDidMount(){
                console.log('ssssssssssssssssss')
                this.init()
                this.getWatch()
    
               }
    
            componentDidActivate(){
            console.log(3333)
                let home = this.$Tool.getUrlKey("from")
                this.setState({
                    isHome:!!home
                })
            }
            componentWillUnactivate(){
                console.log(444)
            }
    

    实际线上案例:

    FrontendAuth.jsx

            if (targetRouterConfig && !targetRouterConfig.auth && !isLogin) {
                const { component,name } = targetRouterConfig;
                let Components = component
                return <Route exact path={pathname}>
                        <KeepAlive name={name}>
                            <Components/>
                        </KeepAlive>
                      </Route>;
            }

    router/index.jsx 

                    <Router>
                        <ScrollToTop>
                            <Headers/>
                        <Provider>
                            <Switch>
                                <FrontendAuth routerConfig={routerMap} />
                            </Switch>
                        </Provider>
                            <Footer/>
                        </ScrollToTop>
                    </Router>

    productDetails.jsx

            componentDidActivate(){
            console.log(3333)
                let home = this.$Tool.getUrlKey("from")
                this.setState({
                    isHome:!!home
                })
            }
            componentWillUnactivate(){
                console.log(444)
            }
    
    productDetails.jsx
    resetOrNot=()=>{
        this.state.isHome?this.$Tool.comeBack():this.props.history.push('/');
    
    }

    最后还是强调重点,这缓存的情况是,只有返回上一步的操作的时候才会定位到原来的滚动条位置,跳转的话,缓存是可以.但滚动位置不会记录.不会再发请求.包括componentWillReceiveProps在内的生命周期都会失效:

    只保留 keep-alvie 的生命周期外 shouldComponentUpdate(nextProps,nextState){}、componentDidUpdate(newProps,newState,Snapshot){}

    这2个数据生命周期还保留,其他的不执行!

    加 Product = bindLifecycle(Product) 的情况下 componentDidUpdate 有效  componentWillReceiveProps不确定,有时有有效,可能有其他原因

         componentDidUpdate(prevProps, prevState, snapshot){
             console.log(111111)
             let categoryId = this.$Tool.getUrlKey("categoryId")
             if(categoryId!=null){
                 if(categoryId!=this.state.categoryId){
                     this.init()
                 }
             }
         }

    这点有点商榷,欢迎大家查证

  • 相关阅读:
    6.Redis 哈希(Hash)的命令
    5.redis中String类型数据操作的命令
    4.redis中的key命令
    3.redis客户端连接服务器
    Bomblab
    leetcode multiply-strings
    datalab
    leetcode max-points-on-a-line
    os
    python 实现简单的端口扫描器
  • 原文地址:https://www.cnblogs.com/lllomh/p/14991863.html
Copyright © 2011-2022 走看看