• 一文看懂Vue2和Vue3中设置404界面


    vue页面中,如果跳转了不存在的路由那么,那么页面就会出现白屏状态,为了解决这个问题,我们可以自己写一个404界面,让其跳转过去。

    一.vue2

    1.index.js

    在此文件中,一般存放的都是我们的路由信息,我们经常使用path:'*'来进行捕获我们的路由,度过不存在那么我们就让它进行跳转至我们自定义的404页面。

    import Vue from 'vue'
    import Router from 'vue-router'
    import Homepage from '@/components/Homepage'
    Vue.use(Router)
    
    export default new Router({
      routes: [
        {
          path: '/',
          component: Homepage,
        },
        {
          path:'*',
          component:()=>import('../views/404.vue')
        }
      ]
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    注意:这个path一定要写在最外面

    2.404.vue页面

    这个页面通常我们可以自定义,一般包括跳转某个页面的超链接或者就是定时多长时间进行跳转。

    <template>
        <div class="not_found">
            <p>
                页面将在<span>{{ time }}span>秒后自动跳转首页,<br>
                您也可以点击这里跳转<a href="/">首页a>
            p>
        div>
    template>
    
    <script>
    // 这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
    
    export default {
        name: '',
        components: {
    
        },
        // 定义属性
        data() {
            return {
                time: '10',
                time_end: null
            }
        },
        // 计算属性,会监听依赖属性值随之变化
        computed: {},
        // 监控data中的数据变化
        watch: {},
        // 方法集合
        methods: {
            GoIndex() {
                let _t = 9
                this.time_end = setInterval(() => {
                    if (_t !== 0) {
                        this.time = _t--;
                    } else {
                        this.$router.replace('/')
                        clearTimeout(this.time_end)
                        this.time_end = null
                    }
                }, 1000)
            }
        },
        // 生命周期 - 创建完成(可以访问当前this实例)
        created() {
            this.GoIndex()
        },
        // 生命周期 - 挂载完成(可以访问DOM元素)
        mounted() {
    
        },
        beforeCreate() { }, // 生命周期 - 创建之前
        beforeMount() { }, // 生命周期 - 挂载之前
        beforeUpdate() { }, // 生命周期 - 更新之前
        updated() { }, // 生命周期 - 更新之后
        beforeDestroy() { }, // 生命周期 - 销毁之前
        destroyed() {
            clearTimeout(this.time_end)
            this.time_end = null
        }, // 生命周期 - 销毁完成
        activated() { }, // 如果页面有keep-alive缓存功能,这个函数会触发
    }
    script>
    
    <style scoped lang='less'>
    .not_found {
        width: 100%;
        height: 100%;
        background: url('../../static/img/404.gif') no-repeat;
        background-position: center;
        background-size: cover;
    
        p {
            position: absolute;
            top: 50%;
            left: 20%;
            transform: translate(-50%, 0);
            color: #fff;
            span{
                color: orange;
                font-family: '仿宋';
                font-size: 25px;
            }
            a {
                font-size: 30px;
                color: aqua;
                text-decoration: underline;
            }
        }
    }
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91

    那么实现的效果就如下图所示:

    在这里插入图片描述

    404实现效果

    二.vue3

    为什么要分开说呢?因为在vue3中我们进行如下设置:

     {
          path:'*',
          component:()=>import('../views/404.vue')
        }
    
    • 1
    • 2
    • 3
    • 4

    会产生错误,错误信息:Catch all routes ("*") must now be defined using a param with a custom regexp.,意思就是:现在必须使用与自定义Regexp的参数定义所有路由(“*”)。

    那么官方是这么说的:

    // plan on directly navigating to the not-found route using its name
    { path: '/:pathMatch(.*)*', name: 'not-found', component: NotFound },
    // if you omit the last `*`, the `/` character in params will be encoded when resolving or pushing
    { path: '/:pathMatch(.*)', name: 'bad-not-found', component: NotFound },
    
    • 1
    • 2
    • 3
    • 4

    那么我们vue2中的index.js文件中的代码就变成了如下:

    ...
    
    export default new Router({
      routes: [
        ...{
          path:'/:pathMatch(.*)*',
          component:()=>import('../views/404.vue')
        }
        //或者
         {
          path:'/:pathMatch(.*)',
          component:()=>import('../views/404.vue')
        }
      ]
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    java计算机毕业设计专利查询与发布系统设计与实现源码+mysql数据库+系统+部署+lw文档
    Nginx 反向代理,负载均衡,动静分离和高可用 实操
    YB4058是一款经济高效、完全集成的高输入电压单电池锂离子电池充电器
    Piramiko实现root权限登录
    Mbedtls PEM 证书解析失败,错误码-9570: ASN1 tag was of an unexpected value
    使用ENVI进行监督分类
    c++最短路模型(抓住那头牛)
    c语言系统编程之多进程
    CTFHUB-WEB-WEB前置技能-HTTP协议-302跳转
    webpack loader 用于对模块的源代码进行转换
  • 原文地址:https://blog.csdn.net/qq_45096273/article/details/125990869