記錄--vue刷新當前頁面

来源:https://www.cnblogs.com/smileZAZ/archive/2023/03/28/17266085.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 背景 項目當中如果做新增/修改/刪除等等操作通常情況下都需要刷新數據或者刷新當前頁面. 思路 (1)如果頁面簡單,調用介面刷新數據即可. (2)如果頁面複雜,需要調用多個介面或者通知多個子組件做刷新,可以採用刷新當前頁面的方式 下麵整理了 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

背景

項目當中如果做新增/修改/刪除等等操作通常情況下都需要刷新數據或者刷新當前頁面.

思路

  • (1)如果頁面簡單,調用介面刷新數據即可.

  • (2)如果頁面複雜,需要調用多個介面或者通知多個子組件做刷新,可以採用刷新當前頁面的方式 下麵整理了4種方式來實現刷新當前頁面,每種方式的思路不同,各有優缺點

實現

方式1-通過location.reload和$router.go(0)方法

(a)概述

通過location.reload$router.go(0)都可以實現頁面刷新,它利用瀏覽器刷新功能,相當於按下了f5鍵刷新頁面
優點:足夠簡單
缺點:會出現頁面空白,用戶體驗不好

(b)代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.js" type="application/javascript"></script>
    <script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue-router/3.5.3/vue-router.min.js" type="application/javascript"></script>
    <style>
* {padding:0;margin:0;}
.container { padding: 10px;display: flex;flex-basis: auto;height: 100vh;box-sizing: border-box;}
.aside{ width:200px;background-color: #d3dce6; }
.main { flex: 1; }
    </style>
</head>
<body>
    <div id="app">
        <router-view></router-view>
    </div>
</body>
<script>
//框架頁
let Layout = {
    created() {
        console.log('框架頁載入')
    },
    template: `
        <div class="container">
            <div class="aside">左側菜單</div>    
            <div class="main"><router-view></router-view></div>
        </div>
    `
}
//首頁
let Home = {
    template: `
        <div>
            首頁
            <button @click="onClick">刷新</button>
        </div>
    `,
    created() {
        console.log('首頁載入')
    },
    methods: {
        onClick(){
            // 通localtion.reload或者this.$router.go(0)實現整體刷新頁面,會出現頁面閃爍
            // location.reload()
            this.$router.go(0)
        }
    },
}
//路由配置
let router = new VueRouter({
    routes: [
        {path: '/', component: Layout, children:[
            {path: '', component: Home}
        ]}
    ]
}) 
Vue.use(VueRouter)
//根組件
new Vue({
    router,
    el: '#app'
})
</script>
</html>

(c)預覽

鏈接

方式2-通過空白頁面

(a)概述

通過$router.replace方法,跳轉一個空白頁面,然後再調回之前頁面,它利用vue-router切換頁面會把頁面銷毀並新建新頁面的特性
優點:不會出現頁面空白,用戶體驗好
缺點:地址欄會出現快速切換的過程

(b)代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.js" type="application/javascript"></script>
    <script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue-router/3.5.3/vue-router.min.js" type="application/javascript"></script>
    <style>
* {padding:0;margin:0;}
.container { padding: 10px;display: flex;flex-basis: auto;height: 100vh;box-sizing: border-box;}
.aside{ width:200px;background-color: #d3dce6; }
.main { flex: 1; }
    </style>
</head>
<body>
    <div id="app">
        <router-view></router-view>
    </div>
</body>
<script>
//框架頁
let Layout = {
    created() {
        console.log('框架頁載入')
    },
    template: `
        <div class="container">
            <div class="aside">左側菜單</div>    
            <div class="main"><router-view></router-view></div>
        </div>
    `
}
//首頁
let Home = {
    template: `
        <div>
            首頁
            <button @click="onClick">刷新</button>
        </div>
    `,
    created() {
        console.log('首頁載入')
    },
    methods: {
        onClick(){
            //使用replace跳轉後不會留下 history 記錄,並通過redirect傳遞當前頁面的路徑
            this.$router.replace(`/blank?redirect=${this.$route.fullPath}`)
        }
    },
}
//空白頁面
let Blank = {
    created(){
        console.log('空白頁載入')
        //重新跳回之前的頁面
        this.$router.replace(this.$route.query.redirect)
    },
    template: `
        <div></div>        
    `
}
//路由配置
let router = new VueRouter({
    routes: [
        {path: '/', component: Layout, children:[
            {path: '', component: Home}
        ]},
        //配置空白頁面的路由
        {path: '/blank', component: Layout, children:[
            {path: '', component: Blank}
        ]}
    ]
}) 
Vue.use(VueRouter)
//根組件
new Vue({
    router,
    el: '#app'
})
</script>
</html>

(c)預覽

鏈接

方式3-通過provide和inject

(a)概述

通過在父頁面的<router-view></router-view>上添加v-if的控制來銷毀和重新創建頁面的方式刷新頁面,並且用到provideinject實現多層級組件通信方式,父頁面通過provide提供reload方法,子頁面通過inject獲取reload方法,調用方法做刷新
優點:不會出現頁面空白,地址欄會不會出現快速切換的過程,用戶體驗好
缺點:實現稍複雜,涉及到provideinject多層級組件間的通信,和v-if控制組件創建和銷毀,和$nextTick事件迴圈的應用

(b)代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.js" type="application/javascript"></script>
    <script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue-router/3.5.3/vue-router.min.js" type="application/javascript"></script>
    <style>
* {padding:0;margin:0;}
.container { padding: 10px;display: flex;flex-basis: auto;height: 100vh;box-sizing: border-box;}
.aside{ width:200px;background-color: #d3dce6; }
.main { flex: 1; }
    </style>
</head>
<body>
    <div id="app">
        <router-view></router-view>
    </div>
</body>
<script>
//框架頁
let Layout = {
    template: `
        <div class="container">
            <div class="aside">左側菜單</div>    
            <!-- 通過v-if實現銷毀和重新創建組件 -->
            <div class="main"><router-view v-if="isRouterAlive"></router-view></div>
        </div>
    `,
    created() {
        console.log('框架頁載入')
    },
    // 通過provide提供reload方法給後代組件
    provide(){
        return {
            reload: this.reload
        }
    },
    data(){
        return {
            isRouterAlive: true
        }
    },
    methods: {
        async reload(){
            this.isRouterAlive = false
            //通過this.$nextTick()產生一個微任務,在一次dom事件迴圈後,重新創建組件
            await this.$nextTick()
            this.isRouterAlive = true
        }
    }
}
//首頁
let Home = {
    template: `
        <div>
            首頁
            <button @click="onClick">刷新</button>
        </div>
    `,
    created() {
        console.log('首頁載入')
    },
    //通過inject獲取祖先元素的reload方法
    inject: ['reload'],
    methods: {
        onClick(){
            this.reload()
        }
    },
}
//路由配置
let router = new VueRouter({
    routes: [
        {path: '/', component: Layout, children:[
            {path: '', component: Home}
        ]}
    ]
}) 
Vue.use(VueRouter)
//根組件
new Vue({
    router,
    el: '#app'
})
</script>
</html>

(c)預覽

鏈接

方式4-通過給router-view綁定key屬性

(a)概述

通過在父頁面的<router-view></router-view>上綁定和切換key屬性,來銷毀和重新創建頁面的方式刷新頁面,具體的方式是指定key的值為$route.fullPath,通過在子頁面通過this.$router.push(this.$route.path+'?t='+Date.now())來改變$route.fullPath的值,從而刷新頁面

優點:不會出現頁面空白,並且代碼簡單 缺點:地址欄出現隨機參數

(b)代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue/2.6.14/vue.js" type="application/javascript"></script>
    <script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/vue-router/3.5.3/vue-router.min.js" type="application/javascript"></script>
    <style>
* {padding:0;margin:0;}
.container { padding: 10px;display: flex;flex-basis: auto;height: 100vh;box-sizing: border-box;}
.aside{ width:200px;background-color: #d3dce6; }
.main { flex: 1; }
    </style>
</head>
<body>
    <div id="app">
        <router-view></router-view>
    </div>
</body>
<script>
//框架頁
let Layout = {
    template: `
        <div class="container">
            <div class="aside">左側菜單</div>    
            <!-- 通過:key綁定$router.fullPath值,當fullPath發生改變,觸發組件重新渲染 -->
            <div class="main"><router-view :key="$route.fullPath"></router-view></div>
        </div>
    `,
    created() {
        console.log('框架頁載入')
    }
}
//首頁
let Home = {
    template: `
        <div>
            首頁
            <button @click="onClick">刷新</button>
        </div>
    `,
    created() {
        console.log('首頁載入')
    },
    methods: {
        onClick(){
            this.$router.push(`${this.$route.path}?t=${Date.now()}`)
        }
    },
}
//路由配置
let router = new VueRouter({
    routes: [
        {path: '/', component: Layout, children:[
            {path: '', component: Home}
        ]}
    ]
}) 
Vue.use(VueRouter)
//根組件
new Vue({
    router,
    el: '#app'
})
</script>
</html>

(c)預覽

鏈接

本文轉載於:

https://juejin.cn/post/7188103333440127037

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 存儲引擎 一. MySQL體繫結構 MySQL Server 連接層:連接的處理、認證授權、安全方案、檢查是否超過最大連接數等。 服務層:SQL介面、解析器、查詢優化器、緩存 引擎層:引擎是數據存儲和提取的方式,引擎層有許多引擎可供使用,也可以自定義引擎。索引是在存儲引擎層實現的。 存儲層:存儲數據 ...
  • ##【問題描述】 開發有天碰到一個很奇怪的問題,他的場景是這樣子的: 通過Canal來訂閱MySQL的binlog, 當捕獲到有數據變化時,回到資料庫,反查該數據的明細,然後做進一步處理。 有一次,他碰到一個詭異的現象: 1. Canal收到消息,有一條主鍵id=31019319的數據插入 2. 1 ...
  • sql腳本 表結構設置 點擊查看代碼 if exists(select * from sys.objects where name='Department' and type='U') drop table Department create table Department ( --id iden ...
  • 摘要:華為雲EI DTSE技術佈道師/華為雲數倉GaussDB(DWS)首席架構師曾凱,針對數據倉庫的起源、演進過程、未來技術發展趨勢,與開發者和伙伴朋友們展開交流互動,幫助開發者快速瞭解數據倉庫相關信息與能力。 本文分享自華為雲社區《直播回顧 | 從數倉發展史淺析數倉未來技術趨勢》,作者:胡辣湯。 ...
  • 摘要: 介紹如何設置採樣大小和表級控制analyze。 本文分享自華為雲社區《GaussDB(DWS) 如何表級控制analyze》,作者:leapdb。 一、控制採樣大小 【設置全局採樣大小】 通過參數default_statistics_target設置全局預設採樣大小。 a.default_s ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: 王慶勛 文章來源:GreatSQL社區原創 某銀行客戶在從Oracle遷移到MySQL的開發中,MySQL在READ-COMMITTED隔離級別 ...
  • 事先申明:所有android 類型的學習記錄全部基於《第一行代碼 Android》第三版,在此感謝郭霖老師的書籍幫助。 1.手動創建Activity 在Project類型目錄中尋找到 項目/app/src/main/java/com.example.activitytest 在 com.exampl ...
  • 自動化測試有2種形式,介面自動化和UI自動化。而UI自動化經常會被登錄節點堵塞,例如驗證碼、圖形、滑塊等,儘管有些方式可以識別圖形和定位滑塊位置,但成功率都不高,無法真正意義上實現自動化執行;而http介面的自動化測試前置如果依賴cookie,也無法實現自動化執行。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...