Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Analyse, wie Sie die aktuelle Seite in Vue aktualisieren

Eine kurze Analyse, wie Sie die aktuelle Seite in Vue aktualisieren

青灯夜游
青灯夜游nach vorne
2023-01-14 19:24:082481Durchsuche

Wie aktualisiere ich die aktuelle Seite in Vue? Der folgende Artikel stellt Ihnen verschiedene Implementierungsmethoden von Vue vor und aktualisiert die aktuelle Seite. Ich hoffe, er wird Ihnen hilfreich sein!

Eine kurze Analyse, wie Sie die aktuelle Seite in Vue aktualisieren

Wenn Sie im Projekt Vorgänge wie Hinzufügen/Ändern/Löschen usw. ausführen, müssen Sie normalerweise die Daten oder die aktuelle Seite aktualisieren.

Idee

  • (1) Wenn die Seite ist einfach: Rufen Sie die Schnittstelle auf, um die Daten zu aktualisieren. Das ist alles

  • (2) Wenn die Seite komplex ist und mehrere Schnittstellen aufrufen oder mehrere Unterkomponenten zur Aktualisierung benachrichtigen muss, können Sie die aktuelle Seite aktualisieren. Hier sind 3 Möglichkeiten, die aktuelle Seite zu aktualisieren. Jede Methode hat unterschiedliche Ideen und ihre eigenen Vor- und Nachteile. Methode 1 – über die Methoden location.reload und $router.go(0).

(a) Übersicht

Die Seitenaktualisierung kann sowohl über location.reload als auch über $router.go(0) erreicht werden, das die Browser-Aktualisierungsfunktion verwendet , entspricht dem Drücken der Taste f5 zum Aktualisieren der Seite

76c82f278ac045591c9159d381de2c57
100db36a723c770d327fc0aef2ce13b1
93f0f5c25f18dab9d176bd4f6de5d30e
    a80eb7cbb6fff8b0ff70bae37074b813
    db71bb30709ba44a555bb4f052ca6598
    8f6d5a544bbc0d98e0f297ef053f784d
    b2386ffb911b14667cb8f0f91ea547a7Document6e916e0f7d1e588d4f442bf645aedb2f
    2f08987855a26388ab9a38e30934a1372cacc6d41bbb37262a98f745aa00fbf0
    146d57f813875e80bb84efaf4ce0e0d12cacc6d41bbb37262a98f745aa00fbf0
    c9ccee2e6ea535a969eb3f532ad9fe89
* {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; }
    531ac245ce3e4fe3d50054a55f265927
9c3bca370b5104690d9ef395f2c5f8d1
6c04bd5ca3fcae76e30b72ad730ca86d
    ab509c080ec9f7ec77efedb1cdcd4bed
        975b587bf85a482ea10b0a28848e78a4dd6e4ababe59793a4ac75fb9e5c5550e
    16b28748ea4df4d9c2150843fecfba68
36cc49f0c466276486e50c850b7e4956
3f1c4e4b6b16bbbd69b2ee476dc4f83a
//框架页
let Layout = {
    created() {
        console.log('框架页加载')
    },
    template: `
        dc6dce4a544fdca2df29d5ac0ea9906b
            dc6dce4a544fdca2df29d5ac0ea9906b左侧菜单16b28748ea4df4d9c2150843fecfba68    
            dc6dce4a544fdca2df29d5ac0ea9906b975b587bf85a482ea10b0a28848e78a4dd6e4ababe59793a4ac75fb9e5c5550e16b28748ea4df4d9c2150843fecfba68
        16b28748ea4df4d9c2150843fecfba68
    `
}
//首页
let Home = {
    template: `
        dc6dce4a544fdca2df29d5ac0ea9906b
            首页
            22288cd9d7ad1476f72c780b7d10a8f2刷新65281c5ac262bf6d81768915a4a77ac0
        16b28748ea4df4d9c2150843fecfba68
    `,
    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'
})
2cacc6d41bbb37262a98f745aa00fbf0
73a6ac4ed44ffec12cee46588e518a5e

(c)预览

链接

方式2-通过空白页面

(a)概述

通过$router.replace方法,跳转一个空白页面,然后再调回之前页面,它利用vue-router切换页面会把页面销毁并新建新页面的特性

  • 优点:不会出现页面空白,用户体验好

  • 缺点:地址栏会出现快速切换的过程

(b)代码

<!DOCTYPE html>
<html>
<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(&#39;框架页加载&#39;)
    },
    template: `
        <div>
            <div>左侧菜单</div>    
            <div><router-view></router-view></div>
        </div>
    `
}
//首页
let Home = {
    template: `
        <div>
            首页
            <button @click="onClick">刷新</button>
        </div>
    `,
    created() {
        console.log(&#39;首页加载&#39;)
    },
    methods: {
        onClick(){
            //使用replace跳转后不会留下 history 记录,并通过redirect传递当前页面的路径
            this.$router.replace(`/blank?redirect=${this.$route.fullPath}`)
        }
    },
}
//空白页面
let Blank = {
    created(){
        console.log(&#39;空白页加载&#39;)
        //重新跳回之前的页面
        this.$router.replace(this.$route.query.redirect)
    },
    template: `
        <div></div>        
    `
}
//路由配置
let router = new VueRouter({
    routes: [
        {path: &#39;/&#39;, component: Layout, children:[
            {path: &#39;&#39;, component: Home}
        ]},
        //配置空白页面的路由
        {path: &#39;/blank&#39;, component: Layout, children:[
            {path: &#39;&#39;, component: Blank}
        ]}
    ]
}) 
Vue.use(VueRouter)
//根组件
new Vue({
    router,
    el: &#39;#app&#39;
})
</script>
</html>

(c)预览

链接

方式3-通过provide和inject

(a)概述

通过在父页面的975b587bf85a482ea10b0a28848e78a4dd6e4ababe59793a4ac75fb9e5c5550e上添加v-if的控制来销毁和重新创建页面的方式刷新页面,并且用到provideinject实现多层级组件通信方式,父页面通过provide提供reload方法,子页面通过inject获取reload方法,调用方法做刷新

  • 优点:不会出现页面空白,地址栏会不会出现快速切换的过程,用户体验好

  • 缺点:实现稍复杂,涉及到provideinject多层级组件间的通信,和v-if控制组件创建和销毁,和$nextTick, Web-Frontend-Entwicklung

    ]

(b)Code

<!DOCTYPE html>
<html>
<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>
            <div>左侧菜单</div>    
            <!-- 通过v-if实现销毁和重新创建组件 -->
            <div><router-view v-if="isRouterAlive"></router-view></div>
        </div>
    `,
    created() {
        console.log(&#39;框架页加载&#39;)
    },
    // 通过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(&#39;首页加载&#39;)
    },
    //通过inject获取祖先元素的reload方法
    inject: [&#39;reload&#39;],
    methods: {
        onClick(){
            this.reload()
        }
    },
}
//路由配置
let router = new VueRouter({
    routes: [
        {path: &#39;/&#39;, component: Layout, children:[
            {path: &#39;&#39;, component: Home}
        ]}
    ]
}) 
Vue.use(VueRouter)
//根组件
new Vue({
    router,
    el: &#39;#app&#39;
})
</script>
</html>
(c)Vorschau

Link

Methode 2 – Durch eine leere Seite

🎜🎜(a) Übersicht🎜🎜🎜Verwenden Sie die Methode $router.replace, um zu einer leeren Seite zu springen, und rufen Sie dann zurück die vorherige Seite. Es wird vue-router verwendet. Beim Wechseln der Seiten wird die Seite zerstört und eine neue Seite erstellt Es wird keine leeren Seiten geben. Gute Benutzererfahrung. Nachteile: Es erfolgt ein schneller Wechselvorgang in der Adressleiste a href="https://www .php.cn/link/8fd541073cd0266ab7070498cb5e3cd2" target="_blank" title="https://jsrun.net/micKp/edit" ref="nofollow noopener noreferrer">Link 🎜🎜🎜 🎜🎜Methode 3 – durch Bereitstellen und Injizieren 🎜🎜🎜🎜🎜(a) Übersicht🎜🎜🎜Durch Hinzufügen von v-if control auf dem 975b587bf85a482ea10b0a28848e78a4ecd210ced0c2ea965fdec9bec75bf870 >Aktualisieren Sie die Seite, indem Sie sie zerstören und neu erstellen, und verwenden Sie provide und inject, um eine mehrstufige Komponentenkommunikation zu implementieren code>provide Stellen Sie die Methode reload bereit. Die Unterseite erhält die Methode reload über inject und ruft die Methode zum Aktualisieren auf 🎜
    🎜🎜🎜Vorteile🎜: Es gibt keine leeren Seiten, es gibt keinen schnellen Wechselvorgang in der Adressleiste und die Benutzererfahrung ist gut🎜🎜🎜🎜 🎜Nachteile🎜: Die Implementierung ist etwas kompliziert und beinhaltet provideKommunikation zwischen mehrstufigen Komponenten mit inject, Kontrolle der Komponentenerstellung und -zerstörung mit v-if code> und Anwendung der <code>$nextTick-Ereignisschleife🎜🎜 🎜🎜🎜(b) Code🎜🎜rrreee🎜🎜(c) Vorschau🎜🎜🎜🎜 Link🎜🎜🎜 (Lernvideo-Sharing: 🎜vuejs Einführungs-Tutorial🎜, 🎜Grundlegendes Programmiervideo🎜)🎜

Das obige ist der detaillierte Inhalt vonEine kurze Analyse, wie Sie die aktuelle Seite in Vue aktualisieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen