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

vue自定義keepalive組件的問題解析

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

vue自定義keepalive組件

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

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

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

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

我們在看一下源碼,看看人家是怎么實(shí)現(xiàn)的(這兩張圖截的真難看)

male

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

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

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

問題知道了怎么解決呢

思路有了擼代碼

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/組件名稱':comp, 'tab2/組件名稱':comp },{ 'tab1/組件名稱':comp, 'tab2/組件名稱':comp }]  
    cacheArray() {
      return this.$store.state.xxx.groupCache
    },
    // 當(dāng)前選中的分組 例:0/1/2... 這里用來讀取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 頁面初始化事件,后續(xù)可觸發(fā)初始化事件
  },
  destroyed: function destroyed(to, form) {
    // TODO 頁面離開事件,后續(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 {
      // 沒有進(jìn)行緩存
      cache[key] = vnode
    }
    // 寫入緩存
    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}`
    },
}

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

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

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

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

相關(guān)文章

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

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

    vue中網(wǎng)頁圖標(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à)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • 淺談ElementUI中switch回調(diào)函數(shù)change的參數(shù)問題

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

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

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

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

    vant實(shí)現(xiàn)購物車功能

    這篇文章主要為大家詳細(xì)介紹了vant實(shí)現(xiàn)購物車功能,文中示例代碼介紹的非常詳細(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常用的三種傳值方式有:??父傳子??子傳父??非父子傳值?引用官網(wǎng)的一句話:父子組件的關(guān)系可以總結(jié)為?prop?向下傳遞,事件向上傳遞,熟悉vue各類關(guān)系的組件之間傳值方法會(huì)令開發(fā)更加得心應(yīng)手,下面將對父子、兄弟、頁級組件之間的傳值作淺談
    2023-12-12
  • Vue引入jQuery的方法和配置教程

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

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

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

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

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

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

最新評論

钟祥市| 女性| 天祝| 亳州市| 广河县| 肥城市| 桑植县| 双峰县| 罗甸县| 衡东县| 大连市| 黔南| 房山区| 安康市| 水富县| 边坝县| 马山县| 朝阳县| 噶尔县| 新安县| 育儿| 贵港市| 呼和浩特市| 怀柔区| 若尔盖县| 罗田县| 长岛县| 海林市| 三穗县| 翁牛特旗| 黄陵县| 隆安县| 库车县| 鹤岗市| 永仁县| 吕梁市| 茶陵县| 体育| 上栗县| 松滋市| 罗城|