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

Vue?Router解決多路由復(fù)用同一組件頁面不刷新問題(場景分析)

 更新時(shí)間:2022年08月25日 10:08:26   作者:IT利刃出鞘  
這篇文章主要介紹了Vue?Router解決多路由復(fù)用同一組件頁面不刷新問題,多路由復(fù)用同一組件的場景分析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

簡介

說明

本文介紹如何解決Vue的多路由復(fù)用同一組件頁面不刷新問題。

多路由復(fù)用同一組件的場景

  • 多路由使用同一組件

    比如:添加博客(path為:/addBlog)和編輯博客(path為:/editBlog)都對應(yīng)同一個(gè)組件(EditBlog.vue)

  • 動態(tài)路由

    比如:用戶詳情頁采用動態(tài)路由,其path為:/user/:id,組件都是UserDetail.vue

原因分析

Vue中,相同的組件實(shí)例將被重復(fù)使用。如果兩個(gè)路由都渲染同個(gè)組件,復(fù)用比銷毀再創(chuàng)建更高效。不過,復(fù)用會導(dǎo)致組件的生命周期函數(shù)不會被調(diào)用。而我們通常會將調(diào)后端接口放到created或mounted等生命周期函數(shù)中,生命周期函數(shù)沒被調(diào)用,也就無法獲取后端數(shù)據(jù)。

官網(wǎng)網(wǎng)址

https://router.vuejs.org/zh/guide/essentials/dynamic-matching.html#響應(yīng)路由參數(shù)的變化

問題復(fù)現(xiàn)

本處以博客為例。添加博客(path為:/addBlog)和編輯博客(path為:/editBlog)都對應(yīng)同一個(gè)組件(EditBlog.vue)

代碼

路由配置(router/index.js)

import Vue from 'vue'
import VueRouter from 'vue-router'
import BlogEdit from '../components/BlogEdit'
 
Vue.use(VueRouter)
 
const routes = [
  {
    path: '/addBlog',
    name: 'AddBlog',
    component: BlogEdit
  },
  {
    path: '/editBlog',
    name: 'EditBlog',
    component: BlogEdit
  }
 
]
 
const router = new VueRouter({
  routes
})
 
export default router

主頁面(App.vue)

<template>
  <div id="app">
    <div id="nav">
      <!--<router-link to="/">Home</router-link> |-->
      <!--<router-link to="/about">About</router-link>-->
      <router-link :to="{name: 'AddBlog'}">創(chuàng)建博客</router-link>
      |
      <router-link :to="{name: 'EditBlog'}">修改博客</router-link>
    </div>
    <router-view/>
  </div>
</template>
 
<style>
<!-- 省略 -->
</style>

博客編輯頁(components/BlogEdit.vue)

<template>
  <div class="outer">
    <div>
      這是BlogEdit
    </div>
  </div>
</template>
 
<script>
import LifeCycle from '../mixins/LifeCycle'
 
export default {
  name: 'BlogEdit',
  mixins: [LifeCycle]
}
</script>
 
<style scoped>
.outer {
  margin: 20px;
  border: 2px solid blue;
  padding: 20px;
}
</style>

混入生命周期(mixins/LifeCycle.js)

我把生命周期的鉤子函數(shù)單獨(dú)拿了出來。

export default {
  computed: {
    name () {
      return this.$options.name
    }
  },
  created () {
    console.log('created ==> ' + this.name)
  },
  activated () {
    console.log('activated ==> ' + this.name)
  },
  deactivated () {
    console.log('deactivated ==> ' + this.name)
  },
  destroyed () {
    console.log('destroyed ==> ' + this.name)
  }
}

測試

訪問:http://localhost:8080/#/

可見,除了第1次進(jìn)入,之后的進(jìn)入和退出沒有觸發(fā)相關(guān)的生命周期函數(shù),比如:created等。

解決方案

方案1:導(dǎo)航守衛(wèi)

方法:在beforeRouteEnter中請求后端數(shù)據(jù)。

導(dǎo)航衛(wèi)士鉤子(mixins/NavigationGuard.js)

為便于管理,我把導(dǎo)航衛(wèi)士單獨(dú)拿出來,作為mixin給組件使用。

export default {
  beforeRouteEnter (to, from, next) {
    // 無法訪問this
    console.log('beforeRouteEnter ==> 來自:' + from.path)
    console.log('beforeRouteEnter ==> 去往:' + to.path)
    next(true)
  },
  beforeRouteUpdate (to, from, next) {
    console.log(this.$options.name + ':beforeRouteUpdate ==> 來自:' + from.path)
    console.log(this.$options.name + ':beforeRouteUpdate ==> 去往:' + to.path)
    next(true)
  },
  beforeRouteLeave (to, from, next) {
    console.log(this.$options.name + ':beforeRouteLeave ==> 來自:' + from.path)
    console.log(this.$options.name + ':beforeRouteLeave ==> 去往:' + to.path)
    next(true)
  }
}

博客編輯組件(components/BlogEdit.vue)

<template>
  <div class="outer">
    <div>
      這是BlogEdit
    </div>
  </div>
</template>
 
<script>
import LifeCycle from '../mixins/LifeCycle'
import NavigationGuard from '../mixins/NavigationGuard'
 
export default {
  name: 'BlogEdit',
  mixins: [LifeCycle, NavigationGuard]
}
</script>
 
<style scoped>
.outer {
  margin: 20px;
  border: 2px solid blue;
  padding: 20px;
}
</style>

測試

訪問:http://localhost:8080/#/

可以發(fā)現(xiàn):離開路由時(shí)會調(diào)用beforeRouteLeave,進(jìn)入路由時(shí)會調(diào)用beforeRouteEnter。所以可以將調(diào)后端接口的方法放到beforeRouteEnter里邊去。

方案2:watch監(jiān)聽$route

方法:使用watch監(jiān)聽$route的變化,變化時(shí)根據(jù)情況請求后端數(shù)據(jù)。

修改博客編輯組件(components/BlogEdit.vue)

<template>
  <div class="outer">
    <div>
      這是BlogEdit
    </div>
  </div>
</template>
 
<script>
import LifeCycle from '../mixins/LifeCycle'
 
export default {
  name: 'BlogEdit',
  mixins: [LifeCycle],
  watch: {
    $route (to, from) {
      console.log('組件:' + this.$options.name)
      console.log('來自:' + from.name)
      console.log('去往:' + to.name)
    }
  }
}
</script>
 
<style scoped>
.outer {
  margin: 20px;
  border: 2px solid blue;
  padding: 20px;
}
</style>

測試

訪問:http://localhost:8080/#/

可以發(fā)現(xiàn):路由變化時(shí)會觸發(fā)對$route的watch。所以可以將調(diào)后端接口的方法放到里邊去。

方案3:父組件router-view指定key

方法:在父組件的router-view中指定key,這個(gè)key必須是唯一的,比如:"$route.fullPath"。這樣vue就會認(rèn)為每個(gè)內(nèi)部路由都是不同的,在跳轉(zhuǎn)時(shí)便會強(qiáng)制刷新組件。

比如:

<router-view :key="$route.fullPath"></router-view>

修改App.vue

<router-view :key="$route.fullPath"></router-view><template>
  <div id="app">
    <div id="nav">
      <!--<router-link to="/">Home</router-link> |-->
      <!--<router-link to="/about">About</router-link>-->
      <router-link :to="{name: 'AddBlog'}">創(chuàng)建博客</router-link>
      |
      <router-link :to="{name: 'EditBlog'}">修改博客</router-link>
    </div>
    <!-- 原來代碼 -->
    <-- <router-view/> -->
    <router-view :key="$route.fullPath"></router-view>
  </div>
</template>
 
<style>
<!-- 省略 -->
</style>

測試

訪問:http://localhost:8080/#/

可以發(fā)現(xiàn):可以正常觸發(fā)組件的生命周期(created、destroyed)。

其他網(wǎng)址

Vue keepAlive實(shí)現(xiàn)不同的路由共用一個(gè)組件component的緩存問題

到此這篇關(guān)于VueRouter解決多路由復(fù)用同一組件頁面不刷新問題的文章就介紹到這了,更多相關(guān)VueRouter復(fù)用同一組件頁面不刷新內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue中的rem如何配置

    vue中的rem如何配置

    這篇文章主要介紹了vue中的rem如何配置,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放功能

    vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放功能

    vue+springboot的項(xiàng)目,需要在頁面展示出??档挠脖P錄像機(jī)連接的攝像頭的實(shí)時(shí)監(jiān)控畫面以及回放功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-02-02
  • Vue3中配置404路由及懶加載的解決過程

    Vue3中配置404路由及懶加載的解決過程

    這篇文章主要介紹了Vue3中配置404路由及懶加載的解決過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Vue對象的組成和掛載方式詳解

    Vue對象的組成和掛載方式詳解

    這篇文章主要介紹了Vue對象的基本組成和Vue對象掛載的幾種方式,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-07-07
  • vue圖片加載與顯示默認(rèn)圖片實(shí)例代碼

    vue圖片加載與顯示默認(rèn)圖片實(shí)例代碼

    這篇文章主要為大家詳細(xì)介紹了vue圖片加載與顯示默認(rèn)圖片的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • vue腳手架搭建過程圖解

    vue腳手架搭建過程圖解

    vue腳手架是個(gè)好東西,能夠快速搭建vue單頁面應(yīng)用,vue是基于node環(huán)境的,所以要先安裝node。下面通過圖文并茂的形式給大家介紹vue腳手架搭建過程圖解,感興趣的朋友一起看看吧
    2018-06-06
  • 詳解如何在Vue3中實(shí)現(xiàn)懶加載組件

    詳解如何在Vue3中實(shí)現(xiàn)懶加載組件

    隨著現(xiàn)代前端框架的發(fā)展,懶加載作為一種優(yōu)秀的性能優(yōu)化技術(shù),在用戶體驗(yàn)和加載速度上扮演著越來越重要的角色,本文將詳細(xì)介紹如何在 Vue 3 中實(shí)現(xiàn)懶加載組件,確保你能夠?qū)⑦@一技術(shù)應(yīng)用到自己的項(xiàng)目中,需要的朋友可以參考下
    2024-11-11
  • vue實(shí)現(xiàn)登錄數(shù)據(jù)的持久化的使用示例

    vue實(shí)現(xiàn)登錄數(shù)據(jù)的持久化的使用示例

    在Vue.js中,實(shí)現(xiàn)登錄數(shù)據(jù)的持久化需要使用瀏覽器提供的本地存儲功能,Vue.js支持使用localStorage和sessionStorage來實(shí)現(xiàn)本地存儲,本文就來介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2023-10-10
  • 詳解Vue3中useLocalStorage的用法

    詳解Vue3中useLocalStorage的用法

    這篇文章主要為大家詳細(xì)介紹了Vue3中useLocalStorage用法的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-10-10
  • 詳解VUE里子組件如何獲取父組件動態(tài)變化的值

    詳解VUE里子組件如何獲取父組件動態(tài)變化的值

    這篇文章主要介紹了詳解VUE里子組件如何獲取父組件動態(tài)變化的值,子組件通過props獲取父組件傳過來的數(shù)據(jù),子組件存在操作傳過來的數(shù)據(jù)并且傳遞給父組件,需要的朋友可以參考下
    2018-12-12

最新評論

长汀县| 金溪县| 永福县| 临西县| 蓬溪县| 东辽县| 浙江省| 宁安市| 香港| 松原市| 醴陵市| 怀远县| 黄骅市| 桦南县| 明水县| 科尔| 青铜峡市| 郓城县| 罗甸县| 长寿区| 侯马市| 五莲县| 巨鹿县| 永昌县| 固镇县| 中方县| 民勤县| 德令哈市| 霞浦县| 平舆县| 长武县| 巩义市| 苍梧县| 读书| 长治市| 涿鹿县| 大安市| 双鸭山市| 大关县| 定日县| 白银市|