• Vue2路由知识大杂烩, 一下给你全整明白(上)


            现在就来讲解一下在vue中非常重要的一个技术, 也就是路由; 只要是使用vue书写的项目必定会涉及到路由的问题.

            从生活中出发, 我们说路由首先会想到路由器.

            生活中的路由器可以让多台设备同时上网, 也就是说每一个接口都会对应着一个设备; 一个接口对应一个接口.

            路由就是一组key-value的对应关系, 多个路由(多组对应关系route)就需要被路由器所管理router.

            生活中的路由是为了能够上完, 那么代码中路由就是为了spa单页面应用的导航区和展示区的来来回回切换.

            在以前的项目都是多页面的应用, 多个页面互相跳转, 不好的就是有抖动; 单页面就是不断的匹配路由, 然后切换显示组件.

            router会一直监听的路由变化, 如果路由发送变化就会找到与当前路由匹配的组件显示到页面, 这就是路由的整个流程.

    1. 注册router:

            想要将router挂载到vue实例上面, 我们就得借助到vue-router这个插件库了(npm i vue-router或yarn add vue-router).

            但是现在推出了vue-router 4 的版本, 它只服务于vue3. 3的版本是服务于vue2的, 所以就得指定版本下载npm i vue-router@3.

    1. // 第一步, 导入Vue, 后面将vue-router注册插件
    2. import Vue from 'vue'
    3. // 第二步, 导入VueRouter构造器
    4. import VueRouter from 'vue-router'
    5. // 第三步, 将路由插件库注册
    6. Vue.use(VueRouter)
    7. // 第四步, 使用VueRouter创建实例对象
    8. const router = new VueRouter({
    9. // 第五步, 创建路由规则
    10. routes: [
    11. {
    12. path: '/home',
    13. component: () => import('@/views/HomeView')
    14. },
    15. {
    16. path: '/about',
    17. component: () => import('@/views/AboutView')
    18. }
    19. ]
    20. })
    21. // 第六步, 将路由实例导出
    22. export default router
    1. import Vue from 'vue'
    2. import App from './App.vue'
    3. import store from './store'
    4. // 第七步, 将路由实例导入
    5. import router from './router/index.js'
    6. Vue.config.productionTip = false
    7. new Vue({
    8. // 第八步, 将路由实例挂载到Vue的实例上面
    9. router,
    10. store,
    11. render: h => h(App)
    12. }).$mount('#app')
    1. <template>
    2. <div id="app">
    3. <nav>
    4. <!-- 第十步, 设置链接 -->
    5. <router-link to="/home">home</router-link> |
    6. <router-link to="/about">about</router-link>
    7. </nav>
    8. <!-- 第九步, 设置路由出口 -->
    9. <router-view></router-view>
    10. </div>
    11. </template>
    12. <style lang="less">
    13. #app {
    14. font-family: Avenir, Helvetica, Arial, sans-serif;
    15. -webkit-font-smoothing: antialiased;
    16. -moz-osx-font-smoothing: grayscale;
    17. text-align: center;
    18. color: #2c3e50;
    19. }
    20. nav {
    21. padding: 30px;
    22. a {
    23. font-weight: bold;
    24. color: #2c3e50;
    25. &.router-link-exact-active {
    26. color: #42b983;
    27. }
    28. }
    29. }
    30. </style>

    注意点:

    • home组件和about组件, 我们并没有这样使用<home />和<about />
    • 这两个组件是通过router对路由进行检测而进行路由匹配自动切换的组件
    • 我管这样的组件叫做路由组件, 我们通常将路由组件放在views或pages文件夹中

    • 然而自己手动<组件名 />这样的组件我们叫做一般组件
    • 在实际开发中, 我们都会将路由组件和一般组件进行区分管理, 会将一般组件放在component文件中
    • 一般组件又分为全局组件和局部组件, 局部组件会在当前的父文件家中创建component文件夹, 人后将其放入

    那我们再思考一个问题, 现在路由匹配规则匹配的组件是about组件; 那home组件去哪了?

    我们home组件被效果了, 上代码:

    1. <template>
    2. <h3>home</h3>
    3. </template>
    4. <script>
    5. export default {
    6. name: 'HomeCom',
    7. beforeDestroy () {
    8. console.log('home组件即将被销毁')
    9. },
    10. mounted () {
    11. console.log('home组件挂载完毕')
    12. }
    13. }
    14. </script>
    15. <template>
    16. <h3>
    17. about
    18. </h3>
    19. </template>
    20. <script>
    21. export default {
    22. name: 'AboutCom',
    23. beforeDestroy () {
    24. console.log('about组件即将被销毁')
    25. },
    26. mounted () {
    27. console.log('about组件挂载完毕')
    28. }
    29. }
    30. </script>

    这里我们再抛出一个面试题:

    router和route区别在哪?

    • 简单的来说route就是当前跳转的路由对象, router是VueRouter的实例对象

     

    2. 嵌套路由:

    嵌套路由我们也可以称之为多级路由, 我们需要在一级路由中设置一个属性"children", 它得是一个数组. 因为一个一级路由可以有n多个二级路由, 以数组包对象的形式.

    1. // 第一步, 导入Vue, 后面将vue-router注册插件
    2. import Vue from 'vue'
    3. // 第二步, 导入VueRouter构造器
    4. import VueRouter from 'vue-router'
    5. // 第三步, 将路由插件库注册
    6. Vue.use(VueRouter)
    7. // 第四步, 使用VueRouter创建实例对象
    8. const router = new VueRouter({
    9. // 第五步, 创建路由规则
    10. routes: [
    11. {
    12. path: '/home',
    13. component: () => import('@/views/HomeView'),
    14. // children得是一个数组, 因为一个一级路由可以有n多个二级路由
    15. children: [
    16. {
    17. path: 'secondone',
    18. component: () => import('@/views/Second_one')
    19. },
    20. {
    21. path: '/secondtwo',
    22. component: () => import('@/views/Second_two')
    23. }
    24. ]
    25. },
    26. {
    27. path: '/about',
    28. component: () => import('@/views/AboutView')
    29. }
    30. ]
    31. })
    32. // 第六步, 将路由实例导出
    33. export default router
    1. <template>
    2. <div>
    3. <h3>home</h3>
    4. <!-- 在书写二级路由的路径的时候, 需要加上一级路由的路径 -->
    5. <router-link to="/home/secondone">第一个子组件</router-link> |
    6. <router-link to="/home/secondtwo">第二个子组件</router-link>
    7. <!-- 当然二级路由也需要设置路由出口, 我们将这个出口称为二级路由出口 -->
    8. <router-view></router-view>
    9. </div>
    10. </template>
    11. <script>
    12. export default {
    13. name: 'HomeCom'
    14. }
    15. </script>
    16. <style>
    17. </style>

    注意:

    • 子路由的path路径的前面最好不要加"/", 因为路由在遍历子路由的时候, 会在路径前面自动加上'"/".

     3. 路由传参(query):

    query传参的方法是在路径后面以"?"进行拼接, 以键值对的形式显示在地址栏, 比如搜索引擎的搜索.

    • 这是一个字符串拼接的方法, 此方法不便于阅读, 看上去很费劲
    1. <template>
    2. <div>
    3. <h3>我是第三个页面</h3>
    4. <template v-for="item in threeList">
    5. <router-link :to="`/one/three/threeDetail?id=${item.id}&name=${item.name}`" :key="item.id">第三个页面的第{{ item.id }}个详情页</router-link>&emsp;
    6. </template>
    7. <router-view></router-view>
    8. </div>
    9. </template>
    10. <script>
    11. export default {
    12. name: 'ThreeCom',
    13. data () {
    14. return {
    15. threeList: [
    16. { id: 1, name: '大帅' },
    17. { id: 2, name: '张三' },
    18. { id: 3, name: '李四' }
    19. ]
    20. }
    21. }
    22. }
    23. </script>
    24. <style>
    25. </style>
    1. <template>
    2. <div>
    3. <h3>我是第三个页面</h3>
    4. <template v-for="item in threeList">
    5. <router-link :to="{
    6. path: '/one/three/threeDetail',
    7. query: {
    8. id: item.id,
    9. name: item.name
    10. }
    11. }" :key="item.id">我是第三个页面的第{{ item.id }}个详情页面</router-link>&emsp;
    12. </template>
    13. <router-view></router-view>
    14. </div>
    15. </template>
    16. <script>
    17. export default {
    18. name: 'ThreeCom',
    19. data () {
    20. return {
    21. threeList: [
    22. { id: 1, name: '大帅' },
    23. { id: 2, name: '张三' },
    24. { id: 3, name: '李四' }
    25. ]
    26. }
    27. }
    28. }
    29. </script>
    30. <style>
    31. </style>
    • 其实router-link还有一个对象的写法
    1. <template>
    2. <div>
    3. <h3>我是第三个页面</h3>
    4. <template v-for="item in threeList">
    5. <router-link :to="{
    6. path: '/one/three/threeDetail',
    7. query: {
    8. id: item.id,
    9. name: item.name
    10. }
    11. }" :key="item.id">我是第三个页面的详情页面</router-link>&emsp;
    12. </template>
    13. <router-view></router-view>
    14. </div>
    15. </template>
    16. <script>
    17. export default {
    18. name: 'ThreeCom',
    19. data () {
    20. return {
    21. threeList: [
    22. { id: 1, name: '大帅' },
    23. { id: 2, name: '张三' },
    24. { id: 3, name: '李四' }
    25. ]
    26. }
    27. }
    28. }
    29. </script>
    30. <style>
    31. </style>

     

    4. 命名路由:

    顾名思义就是跟你的路由起一个规则, 想给路由起个名字非常简单, 直接配置一个name属性, 它是一个字符串.

    它的作用就是可以简化一些编码. 比如, 如果router-link中to属性的值太多的话, 我们可以直接使用name代替. 来上代码:

    1. import Vue from 'vue'
    2. import VueRouter from 'vue-router'
    3. Vue.use(VueRouter)
    4. const router = new VueRouter({
    5. routes: [
    6. {
    7. path: '/one',
    8. name: 'OneCom',
    9. component: () => import('@/pages/One.vue'),
    10. children: [
    11. {
    12. path: 'three',
    13. name: 'ThreeCom',
    14. component: () => import('@/pages/Three.vue'),
    15. children: [
    16. {
    17. path: 'threeDetail',
    18. name: 'ThreeDetail',
    19. component: () => import('@/pages/ThreeDetail')
    20. }
    21. ]
    22. },
    23. {
    24. path: 'four',
    25. name: 'FourCom',
    26. component: () => import('@/pages/Four.vue')
    27. }
    28. ]
    29. },
    30. {
    31. path: '/two',
    32. name: 'TwoCom',
    33. component: () => import('@/pages/Two.vue')
    34. }
    35. ]
    36. })
    37. export default router
    • 我们直接这样写to="FourCom"是无效的, 浏览器会把它当做path来进行解析
    • 所以必须得使用键值对的方法书写, 且加上v-bind 
    1. <template>
    2. <div>
    3. <h3>我是第一个页面</h3>
    4. <router-link to="/one/three">第三个页面</router-link> |
    5. <router-link :to="{name: 'FourCom'}">第四个页面</router-link>
    6. <router-view></router-view>
    7. </div>
    8. </template>
    9. <script>
    10. export default {
    11. name: 'OneCom'
    12. }
    13. </script>
    14. <style>
    15. </style>
    • 如果to属性的属性值是以对象的显示存在的, 我们就需要将path替换成name 
    1. <template>
    2. <div>
    3. <h3>我是第三个页面</h3>
    4. <template v-for="item in threeList">
    5. <router-link :to="{
    6. name: 'ThreeDetail',
    7. query: {
    8. id: item.id,
    9. name: item.name
    10. }
    11. }" :key="item.id">我是第三个页面的第{{ item.id }}个详情页面</router-link>&emsp;
    12. </template>
    13. <router-view></router-view>
    14. </div>
    15. </template>
    16. <script>
    17. export default {
    18. name: 'ThreeCom',
    19. data () {
    20. return {
    21. threeList: [
    22. { id: 1, name: '大帅' },
    23. { id: 2, name: '张三' },
    24. { id: 3, name: '李四' }
    25. ]
    26. }
    27. }
    28. }
    29. </script>
    30. <style>
    31. </style>

     

     5. 路由params传参:

    • 上述query传参方式是在路径后面用"?"键值对的方法进行拼接: localhost:8080?id=1&name=大帅.
    • 这里params传参的形式就是在路径后面以"/"进行拼接: localhost:8080/1/大帅.
    • query传参更适合于关键字的搜索, 如: 搜索引擎.
    • params传参更适合于详情页面的查询, 如: 一个新闻页面点击新闻, 通过id跳转到详情页面.
    1. {
    2. path: 'four',
    3. name: 'FourCom',
    4. component: () => import('@/pages/Four.vue'),
    5. children: [
    6. {
    7. // params传参需要对路由匹配规则进行配置一下
    8. path: 'fourDetail/:id/:name',
    9. name: 'FourDetail',
    10. component: () => import('@/pages/FourDetail.vue')
    11. }
    12. ]
    13. }
    • 我们需要先对路由匹配规则做配合, 通常称之为占位符
    1. <template>
    2. <div>
    3. <h3>我是第四个页面</h3>
    4. <router-link to="/one/four/fourDetail/1/大帅">第四个页面的详情页</router-link>
    5. <router-view></router-view>
    6. </div>
    7. </template>
    8. <script>
    9. export default {
    10. name: 'FourCom'
    11. }
    12. </script>
    13. <style>
    14. </style>

     

    • 当然params传参也是可以使用对象的方式表示的, 上代码:
    1. <template>
    2. <div>
    3. <h3>我是第四个页面</h3>
    4. <router-link :to="{
    5. name: 'FourDetail',
    6. params: {
    7. id: 1,
    8. name: '大帅'
    9. }
    10. }">第四个页面的详情页</router-link>
    11. <router-view></router-view>
    12. </div>
    13. </template>
    14. <script>
    15. export default {
    16. name: 'FourCom'
    17. }
    18. </script>
    19. <style>
    20. </style>

    注意:

    • 如果是params传参且使用对象的显示传递, 就不能使用path属性书写地址.
    • 而是使用name属性书写地址, 不然浏览器是不认的.

    演示一下, 将name改为path:

    1. <template>
    2. <div>
    3. <h3>我是第四个页面</h3>
    4. <!-- <router-link to="/one/four/fourDetail/1/大帅">第四个页面的详情页</router-link> -->
    5. <router-link :to="{
    6. path: 'FourDetail',
    7. params: {
    8. id: 1,
    9. name: '大帅'
    10. }
    11. }">第四个页面的详情页</router-link>
    12. <router-view></router-view>
    13. </div>
    14. </template>

     

  • 相关阅读:
    R语言编写用户自定义函数:编写自定义函数并创建局部变量(函数内部的变量、在函数内部使用、函数运行完成后自动删除)
    【Spatial-Temporal Action Localization(六)】论文阅读2021年
    ESP32网络开发实例-使用NTP获取当前时间
    计算机毕设(附源码)JAVA-SSM绩效考核管理系统
    【Vue的初识--学习小结】
    【C】(笔试题)指针与数组,指针
    【精通Java】集合类体系之Collection
    什么是电商云仓储?
    界面组件DevExpress WPF v23.2新功能预览 - 更轻量级的主题
    【C++】之类和对象 - static静态成员
  • 原文地址:https://blog.csdn.net/weixin_48524561/article/details/125567465