最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React-Route6實現(xiàn)keep-alive效果

 更新時間:2022年06月24日 09:43:15   作者:小鵬愛摸魚  
本文主要介紹了React-Route6實現(xiàn)keep-alive效果,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧<BR>

一、基于react-route6  useOutlet實現(xiàn)

二、代碼呈現(xiàn)

import React, { useRef, createContext, useContext } from 'react'
import { useOutlet, useLocation, matchPath } from 'react-router-dom'
import type { FC } from 'react'
//在組件外部建立一個Context
export const KeepAliveContext = createContext<KeepAliveLayoutProps>({ keepalive: [], keepElements: {} })

//給予頁面緩存設置條件判斷
const isKeepPath = (aliveList: any[], path: string) => {
  let isKeep = false
  aliveList.map(item => {
    if (item === path) {
      isKeep = true
    }
    if (item instanceof RegExp && item.test(path)) {
      isKeep = true
    } 
  })
  return isKeep
}
//判斷當前頁面是否已緩存,是則控制hidden開關(guān)顯示 ,不是則正常渲染
export function useKeepOutlets() {
  const location = useLocation()
  const element = useOutlet()
  const { keepElements, keepalive } = useContext<any>(KeepAliveContext)
  const isKeep = isKeepPath(keepalive, location.pathname)
  if (isKeep) {
    keepElements.current[location.pathname] = element
  }
  //標簽的顯示與隱藏
  return <> {
    Object.entries(keepElements.current).map(([pathname, element]: any) => (
      <div key={pathname} 
      style={{ height: '100%', width: '100%', position: 'relative', overflow: 'hidden auto' }}       className="rumtime-keep-alive-layout" 
      hidden={!matchPath(location.pathname, pathname)}>
        {element}
      </div>
    ))
  }
    <div hidden={isKeep} style={{ height: '100%', width: '100%', position: 'relative', overflow: 'hidden auto' }} className="rumtime-keep-alive-layout-no">
      {!isKeep && element}
    </div>
  </>
}
//設置公共組件類型
interface KeepAliveLayoutProps {
  keepalive: any[]
  keepElements?: any
  dropByCacheKey?: (path: string) => void 
}
//封裝公共組件
const KeepAliveLayout: FC<KeepAliveLayoutProps> = (props) => { 
  const { keepalive, ...other } = props
  const keepElements = React.useRef<any>({}) 
  function dropByCacheKey(path: string) { 
    keepElements.current[path] = null
   } return (<KeepAliveContext.Provider 
    value={{ keepalive, keepElements, dropByCacheKey }}
     {...other} />) 
    }
  
  export default KeepAliveLayout

代碼分析

isKeepPath

配置 keepalive 支持字符串和正則,通過它來判斷,當前頁面是否需要狀態(tài)保持,因為如果整個項目的頁面都保持狀態(tài)的話,對性能是很大的消耗

參數(shù)1為可緩存路徑或正則表達式組成的數(shù)組,參數(shù)2為當前路徑。

若當前路徑在已緩存路徑數(shù)組中或其路徑符合正則表達式則isKeep為true,反之為false

useKeepOutlets

通過判斷當前頁面是否是需要保持的頁面來對頁面 DOM 做一個 hidden 顯隱開關(guān)。

需要注意的是所有被指定狀態(tài)保持的頁面在首次渲染之后,都會被掛載在頁面 DOM 樹上,僅僅是使用 !matchPath(location.pathname, pathname) 控制顯隱。

而沒有被指定狀態(tài)保持的頁面,則是使用 {!isKeep && element} 控制,走 React 組件正常的生命周期。

location

當前路徑信息

element

獲取當前路由組件即當前配置下的嵌套路由組件

useContext<any>(KeepAliveContext)

通過useContext()鉤子函數(shù)獲取Context對象中的屬性,已便于組件之間共享狀態(tài)

isKeep

將當前路徑利用頁面緩存設置條件判斷是否為已緩存路徑,若符合條件,isKeep為true,則將keepElements Ref中以當前組件路徑名為屬性名的屬性綁定當前路由組件

Object.entries

描述:Object.entries()返回一個數(shù)組,其元素是與直接在object上找到的可枚舉屬性鍵值對相對應的數(shù)組。屬性的順序與通過手動循環(huán)對象的屬性值所給出的順序相同。

可枚舉:枚舉的功能類似于字面量類型+聯(lián)合類型組合的功能,也可以表示一組明確的可選值

參數(shù):可以返回其可枚舉屬性的鍵值對的對象

返回值:給定對象自身可枚舉屬性的鍵值對數(shù)組

key

保持 key 不變,就不會觸發(fā) React 的重繪

hidden

控制顯示與隱藏開關(guān)

matchPath(location.pathname, pathname)}

所有被指定狀態(tài)保持的頁面在首次渲染之后,都會被掛載在頁面 DOM 樹上,僅僅是使用!matchPath(location.pathname, pathname) 控制顯示隱藏。

//matchPath:參數(shù)1為當前路徑,參數(shù)2為緩存路徑,確定當前路由路徑是否與緩存路徑匹配

而沒有被指定狀態(tài)保持的頁面,則是使用 {!isKeep && element} 控制,走 React 組件正常的生命周期

KeepAliveLayout

為封裝后暴露的組件

FC

React.FC是函數(shù)式組件,是在TypeScript下使用的一個泛型,全稱為React.FunctionComponent,React.FC<> 可檢測指定屬性類型

keepElements

使用 React.useRef<any>({}) 來做頁面數(shù)據(jù)保存的節(jié)點,是因為我們的上下文不被重新渲染的話 keepElements 就不會被重置,相當于 key 

dropByCacheKey

dropByCacheKey為清除緩存的函數(shù),通過控制當前組件的ref來銷毀組件

other

const { keepalive, ...other } = props中...other為其他配置,這里我們直接遍歷繼承即可

Provider

(<KeepAliveContext.Provider value={{ keepalive, keepElements, dropByCacheKey }} {...other} />)

原理:

每個 Context 對象都會返回一個 Provider React 組件,它允許消費組件訂閱 context 的變化。

Provider 接收一個 value 屬性,傳遞給消費組件。一個 Provider 可以和多個消費組件有對應關(guān)系。多個 Provider 也可以嵌套使用,里層的會覆蓋外層的數(shù)據(jù)。

當 Provider 的 value 值發(fā)生變化時,它內(nèi)部的所有消費組件都會重新渲染

三、使用

import KeepAliveLayout, { useKeepOutlets, KeepAliveContext }from'@/components/KeepAliveLayout'
import { useLocation } from 'react-router-dom'
import React, { useState, useContext } from 'react'

// 使用KeepAliveLayout中的useKeepOutlets獲取當前渲染的頁面內(nèi)容
const Layout = () => {
    const element = useKeepOutlets()
    return (
        {element}
    )
}
// 使用 KeepAliveLayout 包裹上下文
const App = () => {
    return (
        <KeepAliveLayout keepalive={[/./]}>//不可能組件都緩存吧所以需要設置緩存條件,可傳可緩存的路徑或正則表達式
            // App
        </KeepAliveLayout>
    );
}
// 使用 useContext 獲取 dropByCacheKey 清除緩存
const Home = () => {
    const { dropByCacheKey } = useContext<any>(KeepAliveContext);
    const { pathname } = useLocation();
    return (
       <button onClick={() => dropByCacheKey(pathname)}>清除緩存</button>
    )
}

到此這篇關(guān)于React-Route6實現(xiàn)keep-alive效果的文章就介紹到這了,更多相關(guān)React-Route6 keep-alive 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談在react中如何實現(xiàn)掃碼槍輸入

    淺談在react中如何實現(xiàn)掃碼槍輸入

    這篇文章主要介紹了淺談在react中如何實現(xiàn)掃碼槍輸入,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • React中的合成事件是什么原理

    React中的合成事件是什么原理

    React 中的事件,是對原生事件的封裝,叫做合成事件。這篇文章主要通過幾個簡單的示例為大家詳細介紹一下React中的合成事件,感興趣的可以了解一下
    2023-02-02
  • React中如何處理承諾demo

    React中如何處理承諾demo

    這篇文章主要為大家介紹了React中如何處理承諾demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 詳解Ant Design of React的安裝和使用方法

    詳解Ant Design of React的安裝和使用方法

    這篇文章主要介紹了詳解Ant Design of React的安裝和使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • 詳解如何構(gòu)建自己的react hooks

    詳解如何構(gòu)建自己的react hooks

    我們組的前端妹子在組內(nèi)分享時談到了 react 的鉤子,趁此機會我也對我所理解的內(nèi)容進行下總結(jié),方便更多的同學了解。在 React 的 v16.8.0 版本里添加了 hooks 的這種新的 API,我們非常有必要了解下他的使用方法,并能夠結(jié)合我們的業(yè)務編寫幾個自定義的 hooks。
    2021-05-05
  • react+typescript中使用echarts的實現(xiàn)步驟

    react+typescript中使用echarts的實現(xiàn)步驟

    本文主要介紹了react+typescript中使用echarts的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • react-router-dom?V6的配置使用實踐

    react-router-dom?V6的配置使用實踐

    本文主要介紹了react-router-dom?V6的配置使用實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • React.js?Gird?布局編寫鍵盤組件

    React.js?Gird?布局編寫鍵盤組件

    這篇文章主要介紹了React.js?Gird?布局編寫鍵盤組件,Grid?布局則是將容器劃分成"行"和"列",產(chǎn)生單元格,然后指定"項目所在"的單元格,可以看作是二維布局
    2022-09-09
  • React Native自定義標題欄組件的實現(xiàn)方法

    React Native自定義標題欄組件的實現(xiàn)方法

    今天講一下如何實現(xiàn)自定義標題欄組件,我們都知道RN有一個優(yōu)點就是可以組件化,在需要使用該組件的地方直接引用并傳遞一些參數(shù)就可以了,這種方式確實提高了開發(fā)效率。對React Native自定義標題欄組件的實現(xiàn)方法感興趣的朋友參考下
    2017-01-01
  • react-navigation 如何判斷用戶是否登錄跳轉(zhuǎn)到登錄頁的方法

    react-navigation 如何判斷用戶是否登錄跳轉(zhuǎn)到登錄頁的方法

    本篇文章主要介紹了react-navigation 如何判斷用戶是否登錄跳轉(zhuǎn)到登錄頁的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評論

千阳县| 望城县| 绵阳市| 阿巴嘎旗| 兰西县| 广丰县| 蓝山县| 万年县| 宁波市| 洞头县| 台南县| 改则县| 丰城市| 漠河县| 大关县| 武城县| 西青区| 湘乡市| 外汇| 舟曲县| 德阳市| 广水市| 格尔木市| 曲麻莱县| 金沙县| 克山县| 谢通门县| 汉川市| 宜兰市| 辉县市| 大理市| 宜阳县| 三原县| 彩票| 静安区| 洛浦县| 连江县| 延安市| 鄯善县| 顺平县| 和林格尔县|