初学Vue(全家桶)-第16天(vue-router):路由的概念、基本使用、$route和 ...

打印 上一主题 下一主题

主题 722|帖子 722|积分 2166

初学Vue

   
   文章目录

  
  
  路由

1、简介

1.1 单页面应用SPA

SPA(single page web application),单页面应用。
简单来说就是整个应用只有一个完整的页面,当点击页面中某个内容时,浏览器不会另外打开一个新页面来显示,而是直接在当前页面把内容显示出来,或者说是让当前页面做个局部更新。
1.2 路由概念

1.2.1 简述

我们先学两个单词:router(路由器)route(路由)
一个路由器可以管理多个路由,一个路由route就是一种key-value的对应关系。这里的key就代表路由器上一个网线接口,value值就代表一台服务器。

编程中的路由也还是key-value这样的对应关系,不过此时key代表一个地址,value是一个组件component或者function。通过key值,来显示key所对应的value的内容。
例如:拿vuex官网举例,都是SPA单页面应用,如下


可以看到,当点击网页导航栏中的链接时,浏览器导航栏中的地址就会发生改变(注意此时页面并没有进行刷新),因为地址发生改变,所以页面产生局部更新,这个过程就是由路由实现的(监视地址,局部更新页面)
1.2.2 路由分类



  • 后端路由:

    • 1) value是function,用于处理客户端提交的请求
    • 2)工作过程:服务器接收到一个请求时,根据请求路径找到匹配的函数来处理请求,返回响应数据

  • 后端路由:

    • value是组件component,用于展示页面内容
    • 工作过程:当浏览器的路径改变时,对应的组件就会显示

1.2.3 关于vue-router

是vue的一个插件库,专门用来实现SPA应用
2、路由的基本使用


  • 安装路由vue-router:npm i vue-router。
    需要注意的是,如果用的vue2,那么路由安装版3,如果用的vue3,那么路由安装版4
  • 在入口文件main.js中导入路由:import VueRouter from 'vue-router',并应用路由插件:Vue.use(VueRouter)
  • 在src/pages目录下创建路由组件Route1.vue、Route2.vue…,将两个结构相似的组件间不同的内容放到组件的template标签中,用于切换时展示不同的内容。
  • 创建一个管理路由的js文件,目录src/router/route.js
    ,编写router配置项
  1. // 引入vue-router
  2. import VueRouter from 'vue-router'
  3. // 引入路由组件
  4. import Route1 from '../pages/Route1.vue'
  5. import Route2 from '../pages/Route2.vue'
  6. // 创建router实例对象,去管理一组一组的路由规则
  7. const router = new VueRouter({
  8.         routes:[
  9.                 {
  10.                         path:'/route1', // key值,组件在浏览器导航栏中的地址
  11.                         component:Route1 // value值,组件名称
  12.                 },
  13.                 {
  14.                         path:'/route2',
  15.                         component:Route2
  16.                 }
  17.         ]
  18. })
复制代码

  • 在main.js入口文件中引入路由器,并配置路由器
main.js
  1. // 引入路由器
  2. import router from './router/route.js'
  3. // 配置路由器
  4. new Vue({
  5.   render: h => h(App),
  6.   router:router // 配置
  7. }).$mount('#app')
复制代码

  • 路由组件的切换
点击就可切换要显示的组件
  1. <router-link to='/route1'>Route1</router-link>
  2. <router-link to='/route2'>Route2</router-link>
复制代码
  to='/route1’是浏览器导航栏中要输入的地址
  

  • 指定组件展示到页面中的位置
  1. [/code] [size=2]实例展示:[/size]
  2. [list]
  3. [*] 实现如下效果:
  4. [img]https://img-blog.csdnimg.cn/daeb2d41c8764e8fa2ac75a821cf7ae5.gif[/img]
  5. 可以看到,并这里不是切换到了另一个页面,而是对当前页面进行局部更新。
  6. [*] 目录展示
  7. [/list] [img]https://img-blog.csdnimg.cn/89d192f873b44f719d3317d153ec7b28.png[/img]
  8. [list]
  9. [*]具体代码
  10. [b]public/index.js[/b]
  11. [/list] [code]<!DOCTYPE html>
  12. <html lang="">
  13.   <head>
  14.     <meta charset="utf-8">
  15.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  16.     <meta name="viewport" content="width=device-width,initial-scale=1.0">
  17.     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
  18.    
  19.     <link rel="stylesheet" href="<%= BASE_URL %>bootstrap.css">
  20.     <title><%= htmlWebpackPlugin.options.title %></title>
  21.   </head>
  22.   <body>
  23.     <noscript>
  24.       <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  25.     </noscript>
  26.    
  27.    
  28.   </body>
  29. </html>
复制代码
src/main.js
  1. // 引入vue
  2. import Vue from 'vue'
  3. // 引入App
  4. import App from './App.vue'
  5. // 导入vue-router
  6. import VueRouter from 'vue-router'
  7. // 引入路由器
  8. import router from './router/route.js'
  9. Vue.config.productionTip = false
  10. // 应用VueRouter路由
  11. Vue.use(VueRouter)
  12. new Vue({
  13.   render: h => h(App),
  14.   router:router // 配置
  15. }).$mount('#app')
复制代码
路由组件
src/pages/About.vue
  1. <template>
  2.   
  3.       <h2>我是About的内容</h2>
  4.   
  5. </template>
复制代码
src/pages/Home.vue
  1. <template>
  2.   
  3.       <h2>我是Home的内容</h2>
  4.   
  5. </template>
复制代码
路由器
src/router/route.js
  1. // 该文件专门用于创建整个应用的路由器
  2. import VueRouter from 'vue-router'
  3. // 引入组件
  4. import About from '../pages/About.vue'
  5. import Home from '../pages/Home.vue'
  6. // 创建一个路由器并暴露
  7. export default new VueRouter({
  8.     routes:[
  9.         {
  10.             path:'/home',
  11.             component:Home
  12.         },
  13.         {
  14.             path:'/about',
  15.             component:About
  16.         }
  17.     ]
  18. })
复制代码
src/App.vue
  1. <template>
  2.   
  3.    
  4.       
  5.         
  6.           <h2>Vue Router Demo</h2>
  7.         
  8.       
  9.       
  10.         
  11.          
  12.             
  13.             <router-link class="list-group-item" active-class="active" to="/about">About</router-link>
  14.             
  15.             <router-link class="list-group-item" active-class="active" to="/home">Home</router-link>
  16.          
  17.         
  18.         
  19.          
  20.             
  21.               
  22.               
  23.               <router-view></router-view>
  24.             
  25.          
  26.         
  27.       
  28.    
  29.   
  30. </template>
复制代码
  (1)这里通过点击导航栏切换组件的过程中,并没有引起任何的网络请求
(2)一般的组件只需要通过components配置项进行配置,而这里的路由组件需要通过路由器(route.js)进行管理,通过router-link和router-view标签进行使用
(3)在路由组件的切换过程中,被切换掉的组件直接被销毁了,通过在路由组件中使用钩子beforeDestroy(){console.log(“被销毁了”)}可以证明。被切换上的路由组件就会被挂载上,挂载上就会被展示。
  3、$route和 $router



$route存储了路由组件的配置信息,每个路由组件都有一个$route。

$router一个应用仅此一个,用来所有管理路由规则的。

4、嵌套(多级)路由

简单来说就是路由中嵌套了其他路由,如下:

主要代码就是在路由器文件route.js中添加一个配置项children,表示嵌套子级路由,如下:
src/router/route.js
  1. // 该文件专门用于创建整个应用的路由器
  2. import VueRouter from 'vue-router'
  3. // 引入组件
  4. import About from '../pages/About.vue'
  5. import Home from '../pages/Home.vue'
  6. import News from '../pages/News.vue'
  7. import Message from '../pages/Message.vue'
  8. // 创建一个路由器并暴露
  9. export default new VueRouter({
  10.     routes:[
  11.         // 一级路由
  12.         {
  13.             path:'/about',
  14.             component:About
  15.         },
  16.         {
  17.             path:'/home',
  18.             component:Home,
  19.             // 子级路由
  20.             children:[
  21.                 {
  22.                     path:'news',
  23.                     component:News,
  24.                 },
  25.                 {
  26.                     path:'message',
  27.                     component:Message
  28.                 }
  29.             ]
  30.         },
  31.     ]
  32. })
复制代码
5、路由传参

$route下由如下属性

5.1 query参数

query参数的数据会直接在浏览器导航栏中显示



  • 传参:
第一种方式:跳转路由并携带query参数的传参方式,to的字符串写法(包裹在模板字符串中)
  1. <ul>
  2.    <li v-for="m in messageList" :key="m.id">
  3.      
  4.      <router-link
  5.      :to="`/home/message/detail?id=${m.id}&title=${m.title}`">
  6.      {{m.title}}
  7.      </router-link>
  8.    </li>
  9. </ul>
复制代码
  :to中是一个字符串
通过模板字符串将数据传入过去
  第二种方式:跳转路由并携带query参数,to的对象写法
  1. <ul>
  2.    <li v-for="m in messageList" :key="m.id">
  3.      
  4.      <router-link :to="{
  5.          path:'/home/message/detail',
  6.          query:{
  7.              id:m.id,
  8.              title:m.title
  9.          }
  10.      }">{{m.title}}</router-link>
  11.    </li>
  12. </ul>
复制代码
  :to中是一个对象
path:‘xxx’,数据传送的对象(组件),(要将数据传送给哪个组件)
query:{xxx},传送的数据,以对象方式传送过去
  

  • 接收参数:
$route.query.xxx接收对应的参数
  1. <ul>
  2.    
  3.     <li>消息编号:{{$route.query.id}}</li>
  4.     <li>消息标题:{{$route.query.title}}</li>
  5. </ul>
复制代码

   

  • 路由命名:简化路由跳转
    1、给路由命名
  1. {
  2.         path:'/demo',
  3.         component:[
  4.                 {
  5.                         path:'test',
  6.                         component:Test,
  7.                         children:[
  8.                                 {
  9.                                         name:'hello' ,// 给路由命名
  10.                                         path:'welcome',
  11.                                         component:Hello,
  12.                                 }
  13.                         ]
  14.                 }
  15.         ]                       
  16. }
复制代码
2、简化跳转
  1. <router-link :to="/demo/test/welcome">跳转</router-link>
  2. <router-link :to="{name:'hello'}">跳转</router-link>
  3. <router-link
  4.         :to="{
  5.                 name:'hello',
  6.                 query:{
  7.                         id:666,
  8.                         title:'你好'
  9.                 }
  10. }">跳转</router-link>
复制代码
5.2 params参数

params传递参数的形式和query相似,但还是有区别


  • params要重新配置一下路由,声明接收params参数
  1. {
  2.         path:'/home',
  3.         comonent:Home,
  4.         children:[
  5.                 {
  6.                         path:'news',
  7.                         conponent:news
  8.                 },
  9.                 {
  10.                         component:Message,
  11.                         children:[
  12.                                 {
  13.                                         name:'xiangqing',
  14.                                         path:'detail/:id/:titel',// 使用占位符声明接收params参数
  15.                                         component:Detail
  16.                                 }
  17.                         }
  18.                 }
  19.         ]
  20. }
复制代码


  • 传递参数
第一种方式:跳转并携带params参数,to的字符串写法
  1. <li v-for="m in messageList" :key="m.id">
  2.        
  3.         <router-link :to="`/home/message/detail/${m.id}/${m.title}`"}>跳转</router-link>
  4. </li>
复制代码
第二种方式:跳转路由并携带params参数,to的对象写法
  1. <li v-for="m in messageList" :key="m.id">
  2.        
  3.         <router-link :to="{
  4.             name:'xijie',
  5.             params:{
  6.                 id:m.id,
  7.                 title:m.title
  8.             }
  9.         }">{{m.title}}</router-link>
  10. </li>
复制代码
  需要注意的是,params方式传参在:to的对象写法中,不能使用path配置项,必须使用命名路由的name配置。
  

  • 接收参数
    $route.params.xxx接收参数
  1. <ul>
  2.    
  3.     <li>消息编号:{{$route.params.id}}</li>
  4.     <li>消息标题:{{$route.params.title}}</li>
  5. </ul>
复制代码
6、路由的props配置项

作用:让路由组件更加方便的接收到参数


  • 传送数据
    src/router/route.js
  1. {
  2.         name:'xiangqing',
  3.         path:'deatil/:id',
  4.         component:Detail,
  5.        
  6.         // 写法一:
  7.         // 值为对象,该对象中的所有key-value都会以props的形式传给目标组件
  8.         // 缺点是:key-value的值是固定的
  9.         /*
  10.         props:{id:002,title:'hello'}
  11.         */
  12.        
  13.         // 写法二:
  14.         // props值为布尔值,布尔值为true,则把路由接收到的所有params且只能是params以props的形式传给目标组件
  15.         // 缺点:有限制,只能传params,不能传query)
  16.         /*
  17.         props:true
  18.         */
  19.        
  20.         // 写法三:(推荐)
  21.         // props值为函数,该函数返回的对象中每一组key-value都会通过props传给目标组件
  22.         props(route){
  23.                 return {
  24.                         id:route.query.id,
  25.                         title:route.query.title
  26.                 }
  27.         }       
  28. }
复制代码


  • 接收数据
  1. // 组件中使用props接收
  2. props:['id','title']
复制代码
7、router-link的replace与push属性


  • 功能:
    控制路由跳转时操作浏览器历史记录的模式
  • 浏览器的历史记录有两种写入方式:分别是push和replace,push是追加历史记录,replace是替换当前记录,路由跳转时候默认为push
  • 开启replace模式:xxx
   简单来说就是,push模式下,通过点击浏览器返回上一页的箭头,可以从当前页面返回到上个页面;replace模式下,不能返回上一页面。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表