路由高阶用法 Vue2

news2025/1/29 14:13:35

1.几个注意点

Home.vue 

<template>
  <div>
    <h2>我是Home内容</h2>
    <ul class="nav nav-tabs">
      <li class="nav-item">
        <router-link class="nav-link" active-class="active" to="/home/news">News</router-link>
      </li>
      <li class="nav-item">
        <router-link class="nav-link" active-class="active" to="/home/message">Message</router-link>
      </li>
    </ul>

    <router-view></router-view>

  </div>
</template>

<script>
export default {
  name: "MyHome",
  // mounted() {
  //   console.log("MyHome组件挂载完毕了",this);
  // },
  //  beforeDestroy() {
  //     console.log("MyHome组件销毁了");

  //   },
};
</script>

<style>
</style>

 router.js

//该文件专门创建整个应用的路由器

import VueRouter from 'vue-router';
//引入组件
import MyAbout from '../pages/MyAbout.vue'
import MyHome from '../pages/MyHome.vue'

import MyNews from '../pages/MyNews.vue'
import MyMessage from '../pages/MyMessage.vue'
/**
 * 创建一个路由器
 */
const router = new VueRouter({
    routes: [
        {
            path: '/about',
            // component: MyAbout
            component: () => import('../pages/MyAbout.vue')
        },
        {
            //导入的两种方式
            path: '/home',
            // component: () => import('../pages/MyHome.vue')
            component: MyHome,
            children: [//二级路由 不加斜杠
                {
                    path: 'news',
                    component:MyNews
                },
                {
                    path: 'message',
                    component: MyMessage
                }
            ]
        }
    ]
})

export default router;

2.简化路由跳转 命名路由

命名重名了会优先找到前面先匹配的 也就是浅层次的 跳转

3.路由参数

 4.路由的props 的配置

5.路由replace属性 <route-link>

6.编程式路由导航

7.缓存路由组件

8.两个新的生命周期钩子 

剩下三个没有讲的钩子就在这了

 一个 nextTick 下一次模板渲染完毕时执行的回调

一个 activated 路由缓存切换到这个页面或者新建组件实例对象的时候

一个 deactivated 路由缓存切换走的时候 或者 组件销毁的时候

9.路由守卫

1.全局路由守卫 

route.js 

//该文件专门创建整个应用的路由器

import VueRouter from 'vue-router';
//引入组件
import MyAbout from '../pages/MyAbout.vue'
import MyHome from '../pages/MyHome.vue'

import MyNews from '../pages/MyNews.vue'
import MyMessage from '../pages/MyMessage.vue'
import MyDetail from '../pages/MyDetail.vue'
/**
 * 创建一个路由器
 */
const router = new VueRouter({
    routes: [
        {
            name: 'guanyu',
            path: '/about',
            // component: MyAbout
            component: () => import('../pages/MyAbout.vue'),
           meta:{
            title: '关于'
           }

        },
        {
            //导入的两种方式
            path: '/home',
            name: 'zhuye',
            // component: () => import('../pages/MyHome.vue')
            component: MyHome,
            meta:{
                title: '主页'
               },
            children: [//二级路由 不加斜杠
                {
                    
                    name: 'xinwen',
                    path: 'news',
                    component: MyNews,
                    meta:{
                        isAuth:true,
                          title: '新闻'
                    }
                },
                {
                    name: 'xiaoxi',
                    path: 'message',
                    component: MyMessage,
                    meta:{
                        isAuth:true,
                          title: '消息'
                    },
                    children: [
                        {
                            name: 'xiangqing',
                            // path: 'detail/:id/:title',
                            path: 'detail',
                            component: MyDetail,
                            meta:{
                                  title: '详情'
                            },
                            props($route) {
                                return {
                                    id: $route.query.id,
                                    title: $route.query.title
                                }
                            }
                        }
                    ]
                }
            ]
        }
    ]
})
//在每一次路由切换之前都会帮你调用一个函数

//全局前置路由守卫 初始化的时候被调用, 每次路由切换之前被调用
router.beforeEach((to,from,next)=>{
    console.log('路由全局前置守卫执行了');
    
    if(to.meta.isAuth){
        if(localStorage.getItem('school')==='shangguigu'){
            next()
        }else{
            alert('学校名不对暂无权限!')
        }
        
    }else{
        next()
    }
    
})

//全局前置路由守卫 初始化的时候被调用, 每次路由切换之后被调用
router.afterEach((to,from)=>{
    console.log('路由全局后置守卫执行了',to,from);
   const title = to.meta.title;
   if(title){
    document.title= title
   }else{
    document.title= '项目'
   }
    
})


export default router;

 2.独享路由守卫

3.组件内守卫

 route.js

//该文件专门创建整个应用的路由器

import VueRouter from 'vue-router';
//引入组件
import MyAbout from '../pages/MyAbout.vue'
import MyHome from '../pages/MyHome.vue'

import MyNews from '../pages/MyNews.vue'
import MyMessage from '../pages/MyMessage.vue'
import MyDetail from '../pages/MyDetail.vue'
/**
 * 创建一个路由器
 */
const router = new VueRouter({
    routes: [
        {
            name: 'guanyu',
            path: '/about',
            // component: MyAbout
            component: () => import('../pages/MyAbout.vue'),
            meta: {
                title: '关于'
            },
            //独享路由 只有前置没有后置
            beforeEnter(to, from, next) {
              console.log('独享路由前置守卫执行了');
              next()
            }

        },
        {
            //导入的两种方式
            path: '/home',
            name: 'zhuye',
            // component: () => import('../pages/MyHome.vue')
            component: MyHome,
            meta: {
                title: '主页'
            },
            children: [//二级路由 不加斜杠
                {

                    name: 'xinwen',
                    path: 'news',
                    component: MyNews,
                    meta: {
                        isAuth: true,
                        title: '新闻'
                    },
                    //独享路由 只有前置没有后置
                    beforeEnter(to, from, next) {
                        if (localStorage.getItem('school') === 'shangguigu') {
                            next()
                        } else {
                            alert('学校名不对暂无权限!')
                        }

                    }
                },
                {
                    name: 'xiaoxi',
                    path: 'message',
                    component: MyMessage,
                    meta: {
                        isAuth: true,
                        title: '消息'
                    },
                    children: [
                        {
                            name: 'xiangqing',
                            // path: 'detail/:id/:title',
                            path: 'detail',
                            component: MyDetail,
                            meta: {
                                title: '详情'
                            },
                            props($route) {
                                return {
                                    id: $route.query.id,
                                    title: $route.query.title
                                }
                            }
                        }
                    ]
                }
            ]
        }
    ]
})
//在每一次路由切换之前都会帮你调用一个函数

//全局前置路由守卫 初始化的时候被调用, 每次路由切换之前被调用
// router.beforeEach((to,from,next)=>{
//     console.log('路由全局前置守卫执行了');

//     if(to.meta.isAuth){
//         if(localStorage.getItem('school')==='shangguigu'){
//             next()
//         }else{
//             alert('学校名不对暂无权限!')
//         }

//     }else{
//         next()
//     }

// })

// //全局前置路由守卫 初始化的时候被调用, 每次路由切换之后被调用
router.afterEach((to, from) => {
    console.log('路由全局后置守卫执行了', to, from);
    const title = to.meta.title;
    if (title) {
        document.title = title
    } else {
        document.title = '项目'
    }

})


export default router;

myAbout.vue 

<template>
  <div>
    <h2>我是About内容</h2>
  </div>
</template>

<script>
export default {
  name:'MyAbout',
  // mounted() {
  //   console.log("MyAbout组件挂载完毕了");
  // },
  // beforeDestroy() {
  //   console.log("MyAbout组件销毁了");
    
  // },
//通过路由规则 进入该组件时被调用  组件内路由守卫
beforeRouteEnter(to,from,next){
  console.log("App--beforeRouteEnter",to,from,next);
  next()//放行
},
//通过路由规则 离开该组件时被调用
beforeRouteLeave(to,from,next){
   console.log("App--beforeRouteLeave",to,from,next);
   next()//放行
},

}
</script>

<style>

</style>

10.打包上线

1.执行打包 命令

npm run build

会在项目目录下生成一个dist文件夹

2.需要在服务器上面部署,才能够运行

在一个新的文件夹下输入  终端输入命令

npm init

然后输入打包的名字,然后一路回车 就是添基本信息, 这里我们可以不填,我们就一路回车

 3.安装 express

npm i express

右键 在工程目录下 新建一个文件夹 名为 server.js

const express = require('express'); //common模块化引入 相当于 ES6 import

const app = express();//就是一个函数,执行创建一个app实例对象

app.get('/person',(req,res)=>{
    res.send({
        name:'tom',
        age:18
    })
})

app.listen(5005,(err)=>{
    if(!err) return console.log('服务器启动成功!');

})

4.启动一个微型服务器

node server

加上一个静态资源配置

const express = require('express'); //common模块化引入 相当于 ES6 import

const app = express();//就是一个函数,执行创建一个app实例对象

app.use(express.static(__dirname+'/static'));//指定静态资源目录 __dirname:当前目录下


app.get('/person',(req,res)=>{
    res.send({
        name:'tom',
        age:18
    })
})

app.listen(5005,(err)=>{
    if(!err) return console.log('服务器启动成功!');

})

把dist目录下的东西拷贝到static文件夹下 ,重启服务器,就部署上去了

11.history模式问题

 这里要说明一个问题

history在 路径上面 的改变 重新刷新是会发送给服务器的 ,但是 服务器没有这个资源会 404 无法找到

但是hash就没有 这个问题 因为/#/ 后面跟的路径是不会被发往服务器的也就是会被当作Hash值。

1.HISTORY模式的解决办法

1.java解决

2.node.js有一个类库 专门解决这个问题

npm | Home (npmjs.com) 这个网站

connect-history-api-fallback 这个类库

下载类库

npm install  connect-history-api-fallback

服务器中间件

在服务器里面安装

const express = require('express'); //common模块化引入 相当于 ES6 import
const history = require('connect-history-api-fallback');


const app = express();//就是一个函数,执行创建一个app实例对象

app.use(history());//应用

app.use(express.static(__dirname+'/static'));//指定静态资源目录 __dirname:当前目录下


app.get('/person',(req,res)=>{
    res.send({
        name:'tom',
        age:18
    })
})

app.listen(5005,(err)=>{
    if(!err) return console.log('服务器启动成功!');

})

神奇般的解决了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2058351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TilesetLaye存在时,使用mask遮罩层,会出现锯齿的解决方案

TilesetLaye存在时&#xff0c;使用mask遮罩层&#xff0c;会出现锯齿 function addDemoGeoJsonLayer1() {const tiles3dLayer new mars3d.layer.TilesetLayer({name: "合肥市建筑物",url: "//data.mars3d.cn/3dtiles/jzw-hefei/tileset.json",maximumSc…

SparkSQL数据类型

支持的数据类型 SparkSQL支持的数据类型如下&#xff1a; 数值类型 ByteType&#xff1a;表示1字节带符号整数&#xff08;“带符号”意味着它可以表示正数和负数。&#xff09;。数字的范围是-128到127。ShortType&#xff1a;表示2字节带符号整数。数字的范围是-32768到32…

打造更高效的项目:如何选择合适的管理工具

国内外主流的 10 款项目工程管理系统对比&#xff1a;PingCode、Worktile、Asana、Trello、Monday.com、ClickUp、Wrike、泛微项目协同工具、广联达项目管理软件、泛普OA。 在选择项目工程管理系统时&#xff0c;你是否经常感到无从下手&#xff0c;担心投资不当或工具不适合自…

细数全球七大网络空间安全搜索引擎

随着网络攻击的频率和复杂性不断增加&#xff0c;安全专业人士需要利用各种工具来识别和应对潜在的威胁&#xff0c;网络安全搜索引擎就是其中之一&#xff0c;它们帮助安全专家查找漏洞、分析威胁情报以及监控互联网活动&#xff0c;本文将介绍全球七大网络安全搜索引擎。 1.…

误闯机器学习(第一关-概念和流程)

以下内容&#xff0c;皆为原创&#xff0c;实属不易&#xff0c;请各位帅锅&#xff0c;镁铝点点赞赞和关注吧&#xff01; 好戏开场了。 一.什么是机器学习 机器学习就是从数据中自动分析获取模型&#xff08;总结出的数据&#xff09;&#xff0c;并训练模型&#xff0c;去预…

Gadmin极速开发平台,几分钟给你整一个OA系统出来

Gadmin极速开发平台 在企业信息化的大潮中&#xff0c;Gadmin极速开发平台以其独特的低代码开发模式&#xff0c;为企业提供了一套高效、灵活的解决方案。本文将介绍Gadmin平台的基本信息、核心特点&#xff0c;以及它如何帮助企业快速实现信息化建设。 软件简介 Gadmin是一个…

华为:数据入湖,企业数据的逻辑汇聚(附数据湖建设方案下载)

往期回顾>> 华为内部“维度数据”解析 数据入湖是个什么鬼&#xff1f; 为什么数据治理工作越来越迷茫&#xff1f;(附数据治理方案PPT下载) 数字化的本质逻辑:连接、数据、智能 125页PPT&#xff1a;数据中台应用技术方案 数据中台解决方案&#xff0c;附55页PPT…

React 学习——forwardRef,暴漏子组件的dom元素

父组件拿到子组件的值&#xff1a;使用forwardRef import { forwardRef,useRef } from react;const Input forwardRef((props,ref)>{return <input type"text" ref{ref} /> })const App () > {const inputRef useRef(null);const showRef () > …

[答疑]心脏的功能是泵血,心脏是个模块,所以“功能模块”没毛病啊!

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 有同学在我的视频下留言&#xff1a; 其实认真看我的视频或书就明白&#xff0c;这和我说的不是一回事。 这个留言有点新意&#xff0c;和以往的留言如“人能说话&#xff0c;嘴就是…

Python | Leetcode Python题解之第352题将数据流变为多个不想交区间

题目&#xff1a; 题解&#xff1a; from sortedcontainers import SortedDictclass SummaryRanges:def __init__(self):self.intervals SortedDict()def addNum(self, val: int) -> None:intervals_ self.intervalskeys_ self.intervals.keys()values_ self.intervals…

常见分布式ID解决方案的优缺点

分布式系统之所以难,很重要的原因之一是“没有一个全局时钟,难以保证绝对的时序”。 一、分布式ID的特性或要求: 唯一性:确保生成的ID是应用系统内唯一。高可用性:确保任何时候都能正确的生成ID。有意义:或者说包含更多信息,例如时间、业务等信息。如:有序性,通常都需…

多重示例详细说明Eureka原理实践

Eureka原理&#xff08;Eureka Principle&#xff09;是指在长时间的思考和积累之后&#xff0c;通过偶然的瞬间获得灵感或发现解决问题的方法的一种认知现象。这个过程通常包括三个主要阶段&#xff1a;准备阶段、潜伏期以及突然的灵感爆发。下面详细说明Eureka原理的实践步骤…

零拷贝并非万能解决方案:重新定义数据传输的效率极限

PageCache有什么作用&#xff1f; 在我们前面讲解零拷贝的内容时&#xff0c;我们了解到一个重要的概念&#xff0c;即内核缓冲区。那么&#xff0c;你可能会好奇内核缓冲区到底是什么&#xff1f;这个专有名词就是PageCache&#xff0c;也被称为磁盘高速缓存。也可以看下wind…

TY6802 同步整流PCB设计注意事项

TY6802 系列是一款用于反激式电源次级同步整流芯片&#xff0c;TY6802能可靠支持包括 DCM、CCM和准谐振模式。TY6802 集成了一个 100V 功率 MOSFET&#xff08;TY6802A&#xff1a;100V15mR; TY6802B&#xff1a;100V10mR; TY6802C&#xff1a;100V7.5mR;) &#xff0c;可以取代…

基于ESP32的OEE分析开发板上MQTT协议的实现

整理自 《Implementation of MQTT Protocol on ESP32-Based OEE Analysis Development Board》&#xff0c;作者是Amir Akbar Wicaksono, Yuli Kurnia Ningsih, 和 Indra Surjati&#xff0c;发表于《MITOR: Jurnal Teknik Elektro》。论文讨论了在工业4.0背景下&#xff0c;通…

数字化技术分别有哪些,数字化技术特点和优势是什么?

​随着企业数字化进程的加速&#xff0c;人工智能、工业互联网、低代码等底层技术正全面重塑企业运营生产体系&#xff0c;推动新的生产要素、研发范式和商业模式的建立。 这个变革过程不仅是对原有制造体系的颠覆&#xff0c;而且会影响各行各业的所有细分行业和产业链价值链…

探索地理空间分析的新世界:Geopandas的魔力

文章目录 探索地理空间分析的新世界&#xff1a;Geopandas的魔力背景&#xff1a;为何选择Geopandas&#xff1f;这个库是什么&#xff1f;如何安装这个库&#xff1f;五个简单的库函数使用方法场景应用&#xff1a;Geopandas在实际工作中的应用常见bug及解决方案总结 探索地理…

UE5 日期时间蓝图变量 加减节点

参考链接&#xff1a;Having troubles with DateTime in UE5 - General / Feedback & Requests - Epic Developer Community Forums (unrealengine.com) 直接粘贴到UE5蓝图图表可用。&#xff08;反之相加&#xff0c;用负号操作一下&#xff09; 减号蓝图节点&#xff08;…

php源码编译与初始化

1 php源码编译 解压 yum install -y bzip2 # 安装解压工具 tar -xf php-7.4.12.tar.bz2 # 解压文件./condigure ./configure --prefix/usr/local/php --with-config-file-path/usr/local/php/etc --enable-fpm --with-fpm-usernginx --with-fpm-groupnginx --with-curl --wi…

Nginx--流量控制

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、流量限制 1、介绍 流量限制 (rate-limiting)&#xff1b;可用来限制用户在给定时间内HTTP请求的数量。请求&#xff0c;可以是一个简单网站首页…