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

vue自定義keepalive組件的問(wèn)題解析

 更新時(shí)間:2022年07月06日 14:22:47   作者:神經(jīng)蛙12138  
這篇文章主要介紹了vue自定義keepalive組件的相關(guān)資料,keep-alive組件是使用?include?exclude這兩個(gè)屬性傳入組件名稱(chēng)來(lái)確認(rèn)哪些可以被緩存的,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

vue自定義keepalive組件

前一陣來(lái)了一個(gè)新的需求,要在vue項(xiàng)目中實(shí)現(xiàn)一個(gè)多開(kāi)tab頁(yè)面的功能,本來(lái)心想,這不簡(jiǎn)單嘛就是一個(gè)增加按鈕重定向嗎?(當(dāng)然如果這么簡(jiǎn)單我就不寫(xiě)這個(gè)文章了)。很快寫(xiě)完,提交測(cè)試。測(cè)試大哥很快就提交了一個(gè)問(wèn)題:"你兩個(gè)tab頁(yè)訪問(wèn)同一個(gè)鏈接,怎么還是個(gè)聯(lián)動(dòng)的呢?"。我擦,這指定是緩存的問(wèn)題。

為什么會(huì)出現(xiàn)這種情況呢

keep-alive組件是使用 include exclude這兩個(gè)屬性傳入組件名稱(chēng)來(lái)確認(rèn)哪些可以被緩存的

    <keep-alive exclude="a,b,c" >
        <router-view></router-view>
    </keep-alive>

我們?cè)诳匆幌?a rel="external nofollow" target="_blank">源碼,看看人家是怎么實(shí)現(xiàn)的(這兩張圖截的真難看)

male

主要邏輯(直說(shuō)上述代碼)就是根據(jù)傳入的 include, exclude 兩個(gè)屬性傳入數(shù)組,根據(jù)當(dāng)前訪問(wèn)的組件名稱(chēng)判斷。我們相同鏈接都訪問(wèn)同一個(gè)組件名稱(chēng)(name)相同,第二次訪問(wèn)的時(shí)候,鏈接指向的是同一個(gè)組件,因?yàn)槭褂媒M件的name作為緩存key,此時(shí)會(huì)被認(rèn)為是讀取緩存操作,就會(huì)直接加載緩存并渲染,所以出現(xiàn)了兩個(gè)tab頁(yè)訪問(wèn)同一個(gè)鏈接,出現(xiàn)聯(lián)動(dòng)情況

如何解決這個(gè)問(wèn)題呢

這個(gè)比較簡(jiǎn)單之前是因?yàn)榻M件name當(dāng)key導(dǎo)致的,那我們就不使用組件的name作為key了,改為name+tab的index作為key。

問(wèn)題知道了怎么解決呢

思路有了擼代碼

group-keep-alive.js

function remove(arr, item) {
  if (arr.length) {
    var index = arr.indexOf(item)
    if (index > -1) {
      return arr.splice(index, 1)
    }
  }
}
function getFirstComponentChild(children) {
  if (Array.isArray(children)) {
    for (var i = 0; i < children.length; i++) {
      var c = children[i]
      if (isDef(c) && (isDef(c.componentOptions) || isAsyncPlaceholder(c))) {
        return c
      }
    }
  }
}
function isDef(v) {
  return v !== undefined && v !== null
}
function isAsyncPlaceholder(node) {
  return node.isComment && node.asyncFactory
}
var patternTypes = [String, RegExp, Array]
export default {
  name: 'keep-alive',
  abstract: true,
  computed: {
    // 這里算是一個(gè)偽代碼
    // 緩存的數(shù)組 [{ 'tab1/組件名稱(chēng)':comp, 'tab2/組件名稱(chēng)':comp },{ 'tab1/組件名稱(chēng)':comp, 'tab2/組件名稱(chēng)':comp }]  
    cacheArray() {
      return this.$store.state.xxx.groupCache
    },
    // 當(dāng)前選中的分組 例:0/1/2... 這里用來(lái)讀取cache數(shù)組的index
    groupIndex() {
      return this.$store.state.xxx.groupIndex
    }
  },
  created: function created() {
    // 當(dāng)前tab的緩存
    const cache = this.cacheArray[this.groupIndex]
    this.cache = cache || Object.create(null)
    // TODO 頁(yè)面初始化事件,后續(xù)可觸發(fā)初始化事件
  },
  destroyed: function destroyed(to, form) {
    // TODO 頁(yè)面離開(kāi)事件,后續(xù)可觸發(fā)關(guān)閉事件
  },
  render: function render() {
    var slot = this.$slots.default
    var vnode = getFirstComponentChild(slot)
    var componentOptions = vnode && vnode.componentOptions
    // check pattern
    var ref$1 = this
    var cache = ref$1.cache
    const key = `${this.groupIndex}/${componentOptions.Ctor.options.name}`
    // 存在key直接讀取
    if (cache[key]) {
      vnode.componentInstance = cache[key].componentInstance
    } else {
      // 沒(méi)有進(jìn)行緩存
      cache[key] = vnode
    }
    // 寫(xiě)入緩存
    this.$store.dispatch('setGroupCache', {
      cache: this.cache
    })
    return vnode || (slot && slot[0])
  }
}

如何使用

意思一下就行了

<group-keep-alive>
   <router-view :key="key" />
/group-keep-alive>

// key一定要區(qū)分
computed: {
    key() {
      return `${選中index}/${fullpath}`
    },
}

主題說(shuō)完了,整點(diǎn)其他的

1. 在group-keep-alive組件中設(shè)置了abstract: true,設(shè)置當(dāng)前組件為抽象組件,我的李姐:就是一個(gè)對(duì)下一級(jí)(包含子元素)事件監(jiān)聽(tīng)等提前攔截,從而對(duì)下一級(jí)進(jìn)行操作

2. router-view :key="key" 這key的作用是用來(lái)區(qū)分同一個(gè)組件是不是重復(fù)使用一個(gè)實(shí)例。

到此這篇關(guān)于vue自定義keepalive組件的文章就介紹到這了,更多相關(guān)vue keepalive組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue設(shè)置瀏覽器小圖標(biāo)(ICON)的詳細(xì)步驟

    Vue設(shè)置瀏覽器小圖標(biāo)(ICON)的詳細(xì)步驟

    vue中網(wǎng)頁(yè)圖標(biāo)默認(rèn)使用的是vue自帶的一個(gè)icon的圖標(biāo),也是vue的logo,下面這篇文章主要給大家介紹了關(guān)于Vue設(shè)置瀏覽器小圖標(biāo)(ICON)的詳細(xì)步驟,需要的朋友可以參考下
    2023-01-01
  • vue進(jìn)行圖片的預(yù)加載watch用法實(shí)例講解

    vue進(jìn)行圖片的預(yù)加載watch用法實(shí)例講解

    下面小編就為大家分享一篇vue進(jìn)行圖片的預(yù)加載watch用法實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 淺談ElementUI中switch回調(diào)函數(shù)change的參數(shù)問(wèn)題

    淺談ElementUI中switch回調(diào)函數(shù)change的參數(shù)問(wèn)題

    今天小編就為大家分享一篇淺談ElementUI中switch回調(diào)函數(shù)change的參數(shù)問(wèn)題,具有很好的價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Element Notification通知的實(shí)現(xiàn)示例

    Element Notification通知的實(shí)現(xiàn)示例

    這篇文章主要介紹了Element Notification通知的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • vant實(shí)現(xiàn)購(gòu)物車(chē)功能

    vant實(shí)現(xiàn)購(gòu)物車(chē)功能

    這篇文章主要為大家詳細(xì)介紹了vant實(shí)現(xiàn)購(gòu)物車(chē)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • vue封裝動(dòng)態(tài)表格方式詳解

    vue封裝動(dòng)態(tài)表格方式詳解

    這篇文章主要為大家介紹了vue封裝動(dòng)態(tài)表格方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • vue組件常用的父子、兄弟、跨組件等傳值方法

    vue組件常用的父子、兄弟、跨組件等傳值方法

    Vue常用的三種傳值方式有:??父?jìng)髯??子傳父??非父子傳值?引用官網(wǎng)的一句話:父子組件的關(guān)系可以總結(jié)為?prop?向下傳遞,事件向上傳遞,熟悉vue各類(lèi)關(guān)系的組件之間傳值方法會(huì)令開(kāi)發(fā)更加得心應(yīng)手,下面將對(duì)父子、兄弟、頁(yè)級(jí)組件之間的傳值作淺談
    2023-12-12
  • Vue引入jQuery的方法和配置教程

    Vue引入jQuery的方法和配置教程

    雖然Vue.js作為一個(gè)現(xiàn)代化的前端框架,鼓勵(lì)使用其自身的響應(yīng)式機(jī)制來(lái)處理DOM操作,但在某些情況下,尤其是在需要維護(hù)舊系統(tǒng)的項(xiàng)目中,可能會(huì)遇到需要引入jQuery的情況,本文將詳細(xì)講解如何在Vue項(xiàng)目中引入jQuery,需要的朋友可以參考下
    2024-09-09
  • 10分鐘了解Vue3遞歸組件的用法

    10分鐘了解Vue3遞歸組件的用法

    遞歸?簡(jiǎn)單來(lái)講就是程序自己調(diào)用自身,vue中的遞歸組件就是,組件自身調(diào)用自身,下面這篇文章主要給大家介紹了關(guān)于Vue3遞歸組件的用法,需要的朋友可以參考下
    2022-03-03
  • el-select 下拉框全選、多選的幾種方式組件示例詳解

    el-select 下拉框全選、多選的幾種方式組件示例詳解

    這篇文章主要介紹了el-select 下拉框全選、多選的幾種方式組件示例詳解,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12

最新評(píng)論

金堂县| 维西| 云安县| 镇原县| 清水县| 高陵县| 渭南市| 大田县| 鹿泉市| 丰顺县| 河津市| 鞍山市| 夏津县| 宣威市| 红原县| 博野县| 锡林浩特市| 瑞昌市| 宁海县| 固镇县| 襄城县| 遂川县| 枣庄市| 始兴县| 肥东县| 乡宁县| 西乌珠穆沁旗| 历史| 阜康市| 古浪县| 内黄县| 开原市| 扎兰屯市| 八宿县| 镇雄县| 武城县| 茌平县| 台南市| 凤冈县| 拜泉县| 江川县|