【VUE】vue.js中的路由router

简介: 【VUE】vue.js中的路由router

前言:

本章节我们将为大家介绍 Vue.js 路由。

Vue.js 路由允许我们通过不同的 URL 访问不同的内容。

通过 Vue.js 可以实现多视图的单页Web应用(single page web application,SPA)。

Vue.js 路由需要载入 vue-router 库

中文文档地址:vue-router文档

一、安装router:

1、直接下载 / CDN

https://unpkg.com/vue-router/dist/vue-router.js

2、CNPM

推荐使用淘宝镜像:

cnpm install vue-router  //会默认安装在node_modules文件中
//cnpm install -g vue-router //会安装在全局目录中(类似python的虚拟环境和全局环境)

image.gif

二、简单路由

    1. 创建路由规则文件
      1. 路径:src/router/index.js
        1. 将router挂载到vue实例
          1. main.js文件中的注释5.2
            1. 路由参数类型
              1. 路径参数 (params只能通过name来引入路由,path会undefined)
              2. 查询字符串参数 (query可以通过name或path来引入路由)
                1. 路由跳转
                  1. 使用router-link
                  2. to属性可以为path路径、命名路由以及路径参数和查询字符串参数
                    1. element ui的案例

                    步骤:

                    1、将example里的。。。粘贴到src/router/index.js里

                    路由的创建站们放到单独的文件里components/router/index.js

                    // track number of popstate listeners
                    import Vue from 'vue'
                    import VueRouter from 'vue-router'
                    // 1. Use plugin.
                    // This installs <router-view> and <router-link>,
                    // and injects $router and $route to all router-enabled child components
                    Vue.use(VueRouter)
                    // 2. Define route components 在src/router/index.js中导入子组件
                    import greeting from "../components/greeting";
                    import projectlist from "../components/projectlist";
                    import projectlistNew from "../components/projectlistNew";
                    import login from "../components/login";
                    import loginNew from "../components/loginNew";
                    import HelloWorld from "@/components/HelloWorld";
                    // 3. Create the router 在src/router/index.js中创建路由:一个routers数组中的一个对象,就是一条路由
                    const router = new VueRouter({
                        mode: 'history',
                        routes: [
                            { path: '/', component: HelloWorld,name:'hello-world'},
                            { path: '/projectlist1', component: projectlist,name:'projectlist1' },
                            { path: '/projectlist2', component: projectlistNew,name:'projectlist2' },
                            { path: '/login1', component: login,name:'login1' },
                            { path: '/login2', component: loginNew,name:'login2' },
                            { path: '/greeting', component: greeting,name:'greeting' }
                        ]
                    });
                    // 4、导出路由
                    export default router;

                    image.gif

                    main.js文件:

                    //导入vue.js
                    import Vue from 'vue'
                    import ElementUI from 'element-ui'
                    import 'element-ui/lib/theme-chalk/index.css'
                    //导入App.vue根组件
                    import App from './App.vue'
                    //5.1、导入vue router对象
                    import router from './router/index'
                    import loginNew from "@/components/loginNew";
                    //创建全局组件
                    Vue.component('login-New',loginNew);
                    //在导入Vue实例之前,要将element-ui插件加入到Vue中
                    Vue.use(ElementUI);
                    Vue.config.productionTip = false
                    new Vue({
                        //5.2、把router挂载到Vue实例中去
                      router,
                      render: h => h(App),//渲染App根组件
                    }).$mount('#app')

                    image.gif

                    App.vue文件

                    使用路由前:

                    <template>
                      <div id="app">
                        <img alt="Vue logo" src="./assets/jack_li.png">
                        <HelloWorld msg="欢迎来到 Vue.js App"/>
                        <greeting data_1="这是个app父组件传参给子组件"/>
                        <projectlist></projectlist>
                        <projectlistNew></projectlistNew>
                        <login></login>
                        <login-New></login-New>
                      </div>
                    </template>
                    <script>
                    import HelloWorld from './components/HelloWorld.vue'
                    import greeting from './components/greeting.vue'
                    import projectlist from "@/components/projectlist";
                    import projectlistNew from "@/components/projectlistNew";
                    import login from "@/components/login";
                    import loginNew from "@/components/loginNew";
                    export default {
                      name: 'App',
                      components: {
                        HelloWorld,
                        greeting,
                        projectlist,
                        projectlistNew,
                        login,
                        loginNew
                      }
                    }
                    </script>
                    <style>
                    #app {
                      font-family: Avenir, Helvetica, Arial, sans-serif;
                      -webkit-font-smoothing: antialiased;
                      -moz-osx-font-smoothing: grayscale;
                      text-align: center;
                      color: #2c3e50;
                      margin-top: 60px;
                    }
                    img {
                      width: 150px;
                      height: 150px;
                    }
                    </style>

                    image.gif

                    image.gif编辑

                    不足:我们需要手动的修改路径才能跳转到不同页面

                     使用路由后:

                    <template>
                      <div id="app">
                        <img alt="Vue logo" src="./assets/jack_li.png">
                        <ul>
                          <li>
                            <router-link :to="{name:'hello-world'}">菜单一HelloWorld</router-link>
                          </li>
                          <li>
                            <router-link :to="{name:'projectlist1'}">菜单二projectlist</router-link>
                          </li>
                          <li>
                            <router-link :to="{name:'projectlist2'}">菜单三projectlistNew</router-link>
                          </li>
                          <li>
                            <router-link :to="{name:'login1'}">菜单四login</router-link>
                          </li>
                          <li>
                            <router-link :to="{name:'login2'}">菜单五loginNew</router-link>
                          </li>
                          <li>
                            <router-link :to="{name:'greeting',params:{username:'高老庄'}}">菜单六greeting</router-link>
                          </li>
                          <li>
                            <router-link :to="{name:'xibo_test_index'}">菜单七xibo_index</router-link>
                          </li>
                        </ul>
                        <!--    展示路由的页面内容-->
                        <router-view></router-view>
                      </div>
                    </template>
                    <script>
                    export default {
                      name: 'App',
                    }
                    </script>
                    <style>
                    #app {
                      font-family: Avenir, Helvetica, Arial, sans-serif;
                      -webkit-font-smoothing: antialiased;
                      -moz-osx-font-smoothing: grayscale;
                      text-align: center;
                      color: #2c3e50;
                      margin-top: 60px;
                    }
                    img {
                      width: 150px;
                      height: 150px;
                    }
                    </style>

                    image.gif

                    image.gif编辑

                      • 在App.vue的<template>标签内中<router-view></router-view>展示路由的页面内容
                        • 不足:必须要手动改变路由才能跳转到不同页面
                        • 优化:在父组件的标签内使用<router-link to="路由路径"></router-link>可以达到点击标签就可以跳转页面
                          • to属性默认为path路径值,
                            • 不足:如果一个地方改变,就要修改2个地方路径
                            • 优化:可以在path中添加name属性,然后在父组件中:to="{name:name_value"}

                                  三、嵌套路由

                                  在index.js文件中,

                                  {
                                      path: '/login1',
                                      component: login,
                                      name: 'login1',
                                      children: [
                                          // an empty path will be treated as the default, e.g.
                                          // components rendered at /parent: Root -> Parent -> Default
                                          // {path: '', component: login, name: 'login1'},
                                          //如果加/,则会从根路由开始匹配,http://localhost:8081/login2
                                          {path: '/login2', component: loginNew, name: 'login2'},
                                          //如果不加/,则会自动拼接到父路由后面,http://localhost:8081/login1/login2
                                          {path: 'login2', component: loginNew, name: 'login2'},

                                  image.gif

                                  四、查询字符串参数/路径参数

                                  4.1、在子组件中可以通过this.$route.query.username来获取查询字符串参数

                                  methods:{
                                    //方法一:
                                    // changeusername:function (){
                                    //   this.username="dalao"
                                    // },
                                    //方法二:推荐使用
                                    changeusername(){
                                      this.username="一个没有整容需求的人"
                                    }
                                  },
                                  created() {
                                    console.log("实例创建之后,能够获取到this");
                                    console.log("username为:",this.username);
                                    this.username=this.$route.query.name;
                                    this.age=this.$route.query.age;

                                  image.gif

                                  image.gif编辑

                                  4.2、路径参数:在url上(在ptah中路径+":参数")

                                  查询路径参数,this.$route.params.username

                                  路由文件index.js
                                  const router = new VueRouter({
                                      mode: 'history',
                                      routes: [
                                          { path: '/', component: HelloWorld,name:'hello-world'},
                                          { path: '/projectlist1', component: projectlist,name:'projectlist1' },
                                          { path: '/projectlist2', component: projectlistNew,name:'projectlist2' },
                                          { path: '/login1', component: login,name:'login1' },
                                          { path: '/login2', component: loginNew,name:'login2' },
                                          //路径参数:在url上(在ptah中路径+":参数")
                                          { path: '/greeting/:username', component: greeting,name:'greeting' }
                                      ]

                                  image.gif

                                  子组件 greeting.vue
                                  created() {
                                    console.log("实例创建之后,能够获取到this");
                                    console.log("username为:",this.username);
                                    this.username=this.$route.query.name;
                                    this.age=this.$route.query.age;
                                    this.username=this.$route.params.username;
                                    // this.age=this.$route.params.age;
                                  },

                                  image.gif

                                  4.2.1、还有一种方法获取路径参数 就是:

                                  在template里参数写成{{this.$route.params.username}}

                                  <p>username为:{{this.$route.params.username}}</p>

                                  image.gif

                                  然后在created()就不用写this.username=this.$route.params.username

                                  created() {
                                      //获取路径参数
                                  // this.username=this.$route.params.username;
                                      }

                                  image.gif

                                  jquery传参和params传参的区别

                                  1、用法上:

                                  上文已经提到query可以用name或path来引入

                                  params必需要用name来引入,接收参数都是类似的,分别是:

                                  this.$route.query.name和

                                  2、地址栏表现形式上:

                                  query:

                                  /login?id=10&name=zs

                                  params:

                                  /login/12/ls

                                  注意:

                                  这里的12和ls对应的是/:id/:name;

                                  这两个参数可以不写,那么就不会再地址栏上显示;

                                  不过刷新页面,参数会消失;

                                  写上参数刷新页面,参数不会消失。

                                  query方式传参和接收参数

                                  传参:

                                  this.$router.push({
                                          path:'/detail/:id',
                                          query:{
                                            id:id
                                          }
                                        })

                                  image.gif

                                  接收参数:

                                  this.$route.query.id

                                  image.gif

                                  params方式传参和接收参数

                                  传参:

                                  this.$router.push({
                                          name:'Detail',
                                          params:{
                                            id:id
                                          }
                                        })

                                  image.gif

                                  接收参数:

                                  this.$route.params.id

                                  image.gif

                                  Tips:

                                  params传参,push里面只能是 name:‘xxxx’,不能是path:’/xxx’,因为params只能用name来引入路由,如果这里写成了path,接收参数页面会是undefined!!!

                                  切换路由

                                  // query通过path切换路由
                                  <router-link :to="{path: 'Detail', query: { id: 1 }}">前往Detail页面</router-link>
                                  // params通过name切换路由
                                  <router-link :to="{name: 'Detail', params: { id: 1 }}">前往Detail页面</router-link>

                                  image.gif

                                  简单说query相当于get请求,页面跳转的时候,可以在地址栏看到请求参数,浏览器刷新页面不会消失,而params相当于post请求,参数不会在地址栏中显示,浏览器刷新页面后消失。

                                  相关文章
                                  |
                                  4天前
                                  |
                                  缓存 JavaScript 前端开发
                                  vue学习第四章
                                  欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
                                  vue学习第四章
                                  |
                                  4天前
                                  |
                                  JavaScript 前端开发
                                  vue学习第九章(v-model)
                                  欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
                                  vue学习第九章(v-model)
                                  |
                                  4天前
                                  |
                                  JavaScript 前端开发 开发者
                                  vue学习第十章(组件开发)
                                  欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
                                  vue学习第十章(组件开发)
                                  |
                                  10天前
                                  |
                                  JavaScript 前端开发
                                  如何在 Vue 项目中配置 Tree Shaking?
                                  通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
                                  |
                                  10天前
                                  |
                                  存储 缓存 JavaScript
                                  在 Vue 中使用 computed 和 watch 时,性能问题探讨
                                  本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
                                  |
                                  10天前
                                  |
                                  存储 缓存 JavaScript
                                  如何在大型 Vue 应用中有效地管理计算属性和侦听器
                                  在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
                                  |
                                  10天前
                                  |
                                  存储 缓存 JavaScript
                                  Vue 中 computed 和 watch 的差异
                                  Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
                                  |
                                  9天前
                                  |
                                  JavaScript 前端开发 UED
                                  vue学习第二章
                                  欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
                                  |
                                  11天前
                                  |
                                  存储 JavaScript 开发者
                                  Vue 组件间通信的最佳实践
                                  本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
                                  |
                                  9天前
                                  |
                                  JavaScript 前端开发 开发者
                                  vue学习第一章
                                  欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
                                  下一篇
                                  无影云桌面