• Vue(九)——页面路由(1)


    目录

    路由的简介

    路由基本使用

    几个注意点

    嵌套(多级)路由

    路由的query参数

    命名路由

    路由的params参数

    路由的props配置


    路由的简介

            理解: 一个路由(route)就是一组映射关系(key - value),多个路由需要路由器(router)进行管理。

    前端路由:key是路径,value是组件。

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

            生活中的路由和路由器是为了完成多台设备的上网,而编码中的路由和路由器是完为了完成实现SPA应用的导航区与展示区的切换。

    对SPA应用的理解

    1. 单页 Web 应用(single page web application,SPA)
    2. 整个应用只有一个完整的页面
    3. 点击页面中的导航链接不会刷新页面,只会做页面的局部更新
    4. 数据需要通过ajax请求获取

    路由基本使用

    提出如下需求:

    将html粘贴到App.vue

     

            在main.js当中引入router之后可以使用一个全新的对象router。但不可像下图一样设置成字符串,需要自己去创建一个路由。

    创建index.js专门用于创建整个应用的路由器 (routes为数组形式)

    ./router/index.js

    1. // 该文件专门用于创建整个应用的路由器
    2. import VueRouter from 'vue-router'
    3. //引入组件
    4. import About from '../components/About'
    5. import Home from '../components/Home'
    6. //创建并暴露一个路由器
    7. export default new VueRouter({
    8. routes:[
    9. {
    10. path:'/about',
    11. component:About
    12. },
    13. {
    14. path:'/home',
    15. component:Home
    16. }
    17. ]
    18. })

     ./components/About.vue

    1. <template>
    2. <h2>我是About的内容h2>
    3. template>
    4. <script>
    5. export default {
    6. name:'About'
    7. }
    8. script>

      ./components/Home.vue

    1. <template>
    2. <h2>我是Home的内容h2>
    3. template>
    4. <script>
    5. export default {
    6. name:'Home'
    7. }
    8. script>

     App.vue

    1. <template>
    2. <div>
    3. <div class="row">
    4. <div class="col-xs-offset-2 col-xs-8">
    5. <div class="page-header"><h2>Vue Router Demoh2>div>
    6. div>
    7. div>
    8. <div class="row">
    9. <div class="col-xs-2 col-xs-offset-2">
    10. <div class="list-group">
    11. <router-link class="list-group-item" active-class="active" to="/about">Aboutrouter-link>
    12. <router-link class="list-group-item" active-class="active" to="/home">Homerouter-link>
    13. div>
    14. div>
    15. <div class="col-xs-6">
    16. <div class="panel">
    17. <div class="panel-body">
    18. <router-view>router-view>
    19. div>
    20. div>
    21. div>
    22. div>
    23. div>
    24. template>
    25. <script>
    26. export default {
    27. name:'App',
    28. }
    29. script>

    1.下载vue-routernpm i vue-router

    2.应用插件:Vue.use(VueRouter)

    3.编写router配置项:

    1. //引入VueRouter
    2. import VueRouter from 'vue-router'
    3. //引入Luyou 组件
    4. import About from '../components/About'
    5. import Home from '../components/Home'
    6. //创建router实例对象,去管理一组一组的路由规则
    7. const router = new VueRouter({
    8. routes:[
    9. {
    10. path:'/about',
    11. component:About
    12. },
    13. {
    14. path:'/home',
    15. component:Home
    16. }
    17. ]
    18. })
    19. //暴露router
    20. export default router

    4. 实现切换(active-class可配置高亮样式)

    vue

    <router-link active-class="active" to="/about">Aboutrouter-link>

    5. 指定展示位置

    vue

       <router-view>router-view>

    几个注意点

            1.靠路由规则匹配出来由路由器渲染出来的组件叫做路由组件,如果自己亲自写的标签叫做一般组件,一般情况下会将他们分为不同的文件夹。

            2.不用的路由组件或者说当切换切走的路由组件其实是被销毁了

     

    3.各个组件上都多了两个东西,route(路由的配置信息)和router(路由器)           (打印出vc)

    每个组件route是不一样的而router是一样的

    1. 路由组件通常存放在```pages```文件夹,一般组件通常存放在```components```文件夹。

    2. 通过切换,“隐藏”了的路由组件,默认是被销毁掉的,需要的时候再去挂载。

    3. 每个组件都有自己的```$route```属性,里面存储着自己的路由信息。

    4. 整个应用只有一个router,可以通过组件的```$router```属性获取到。

    嵌套(多级)路由

    界面分为导航区和展示区,在展示区里还有导航区和展示区

    把相应的结构粘贴到Home/About中的tempalte去

    新建展示区的组件并把结构粘贴进来

    以home为例,把子展示区用问号占位

            去index.js里制定路由规则,路由分为一级路由和二级路由等(多级路由),上一节写的都是一级路由,这个时候使用children配置项,这是一个数组,因为这也有可能有n多个子路由。注意子路由里的path不用再加斜杠,因为底层检测到children就会自动在地址加上斜杠。

    在home里的导航标签改为router-link(),并在组件的呈现位置写上标签

    ./pages/Home.vue

    1. <template>
    2. <div>
    3. <h2>Home组件内容h2>
    4. <div>
    5. <ul class="nav nav-tabs">
    6. <li>
    7. <router-link class="list-group-item" active-class="active" to="/home/news">Newsrouter-link>
    8. li>
    9. <li>
    10. <router-link class="list-group-item" active-class="active" to="/home/message">Messagerouter-link>
    11. li>
    12. ul>
    13. <router-view>router-view>
    14. div>
    15. div>
    16. template>
    17. <script>
    18. export default {
    19. name:'Home',
    20. }
    21. script>

    ./pages/Message.vue

    1. <template>
    2. <div>
    3. <ul>
    4. <li>
    5. <a href="/message1">message001a>  
    6. li>
    7. <li>
    8. <a href="/message2">message002a>  
    9. li>
    10. <li>
    11. <a href="/message/3">message003a>  
    12. li>
    13. ul>
    14. div>
    15. template>
    16. <script>
    17. export default {
    18. name:'Message'
    19. }
    20. script>

    ./pages/New.vue

    1. <template>
    2. <ul>
    3. <li>news001li>
    4. <li>news002li>
    5. <li>news003li>
    6. ul>
    7. template>
    8. <script>
    9. export default {
    10. name:'News'
    11. }
    12. script>

    ./router/index.js

    1. // 该文件专门用于创建整个应用的路由器
    2. import VueRouter from 'vue-router'
    3. //引入组件
    4. import About from '../pages/About'
    5. import Home from '../pages/Home'
    6. import News from '../pages/News'
    7. import Message from '../pages/Message'
    8. //创建并暴露一个路由器
    9. export default new VueRouter({
    10. routes:[
    11. {
    12. path:'/about',
    13. component:About
    14. },
    15. {
    16. path:'/home',
    17. component:Home,
    18. children:[
    19. {
    20. path:'news',
    21. component:News,
    22. },
    23. {
    24. path:'message',
    25. component:Message,
    26. }
    27. ]
    28. }
    29. ]
    30. })

    1. 配置路由规则,使用children配置项

    1. routes:[
    2. {
    3. path:'/about',
    4. component:About,
    5. },
    6. {
    7. path:'/home',
    8. component:Home,
    9. children:[ //通过children配置子级路由
    10. {
    11. path:'news', //此处一定不要写:/news
    12. component:News
    13. },
    14. {
    15. path:'message',//此处一定不要写:/message
    16. component:Message
    17. }
    18. ]
    19. }
    20. ]

    2. 跳转(要写完整路径)

     <router-link to="/home/news">Newsrouter-link>

    路由的query参数

            当点击消息001,就在Detail.vue显示001的细节信息,002、003也是如此。只需要设置一个detail组件,给Detail.vue组件传递参数即可。

    编写detail组件

    这个detail属于message中的子路由,引入detail之后添加子路由

    更改导航标签为router-link和to属性,在需要呈现的地方写入

    此时跳转没有携带参数,所以结果是写死的

    路由是可以携带两种参数的,一种叫query参数,如下所示,这样就可以将参数交给路由组件了

            那么detail组件如何接收呢?还记不记得$route,他是路由的配置信息,在detail中打印出来如下所示:

    取数据接收参数如下所示,to的字符串写法

            可是666和你好啊是假数据,这时需要将变量传进去,但是直接在to属性里换上m.id会被解析成字符串,所以要在to属性前加冒号,还需要用倒引号包裹,模板字符串里面混着js变量要用${}包裹。

            前面加冒号。就会将双引号里的东西当作js来解析,解析发现写的是字符串还是模板字符串,而且里面还混着js变量。

    此时参数完美传过来 

    其实还有一种写法,to的对象写法

            对象里边写两个属性,一个是path,一个是query。path写到要跳转的组件,query写成一个对象并写明要携带的参数。效果同上。

     ./pages/Message.vue

    1. <template>
    2. <div>
    3. <ul>
    4. <li v-for="m in messageList" :key="m.id">
    5. <router-link :to="{
    6. path:'/home/message/detail',
    7. query:{
    8. id:m.id,
    9. title:m.title
    10. }
    11. }">
    12. {{m.title}}
    13. router-link>
    14. li>
    15. ul>
    16. <hr>
    17. <router-view>router-view>
    18. div>
    19. template>
    20. <script>
    21. export default {
    22. name:'Message',
    23. data() {
    24. return {
    25. messageList:[
    26. {id:'001',title:'消息001'},
    27. {id:'002',title:'消息002'},
    28. {id:'003',title:'消息003'}
    29. ]
    30. }
    31. },
    32. }
    33. script>

    ./router/index.js

    1. // 该文件专门用于创建整个应用的路由器
    2. import VueRouter from 'vue-router'
    3. //引入组件
    4. import About from '../pages/About'
    5. import Home from '../pages/Home'
    6. import News from '../pages/News'
    7. import Message from '../pages/Message'
    8. import Detail from '../pages/Detail'
    9. //创建并暴露一个路由器
    10. export default new VueRouter({
    11. routes:[
    12. {
    13. path:'/about',
    14. component:About
    15. },
    16. {
    17. path:'/home',
    18. component:Home,
    19. children:[
    20. {
    21. path:'news',
    22. component:News,
    23. },
    24. {
    25. path:'message',
    26. component:Message,
    27. children:[
    28. {
    29. path:'detail',
    30. component:Detail,
    31. }
    32. ]
    33. }
    34. ]
    35. }
    36. ]
    37. })

    1. 传递参数

    1. <router-link :to="/home/message/detail?id=666&title=你好">跳转router-link>
    2. <router-link
    3. :to="{
    4. path:'/home/message/detail',
    5. query:{
    6. id:666,
    7. title:'你好'
    8. }
    9. }"
    10. >跳转router-link>

    2. 接收参数

    1. $route.query.id
    2. $route.query.title

    命名路由

    给路由命名只需要在js里添加name这个配置项即可,这个名字可以在跳转的时候简化编码。

    在Message.vue里用name替换path(注意只在对象形式中这么用)

    1. 作用:可以简化路由的跳转。

    2. 如何使用

             1. 给路由命名:

    1. {
    2. path:'/demo',
    3. component:Demo,
    4. children:[
    5. {
    6. path:'test',
    7. component:Test,
    8. children:[
    9. {
    10. name:'hello' //给路由命名
    11. path:'welcome',
    12. component:Hello,
    13. }
    14. ]
    15. }
    16. ]
    17. }

             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. }"
    11. >跳转router-link>

    路由的params参数

    路径直接携带参数

    js里用占位符让vue知道detail是路由的层级,下一层级是id,再下一层级是title

    结果发现参数在params里,并且key的名称和占位符是一致的

    所以在取值的时候也要改变,如图所示

    如果使用to的对象写法,只需将query改为params即可。

    注意,如果携带params参数,那么不可以使用path,只能用name。

    1. 配置路由,声明接收params参数

    1. {
    2. path:'/home',
    3. component:Home,
    4. children:[
    5. {
    6. path:'news',
    7. component:News
    8. },
    9. {
    10. component:Message,
    11. children:[
    12. {
    13. name:'xiangqing',
    14. path:'detail/:id/:title', //使用占位符声明接收params参数
    15. component:Detail
    16. }
    17. ]
    18. }
    19. ]
    20. }

    2. 传递参数

            特别注意:路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name配置!

    1. <router-link :to="/home/message/detail/666/你好">跳转router-link>
    2. <router-link
    3. :to="{
    4. name:'xiangqing',
    5. params:{
    6. id:666,
    7. title:'你好'
    8. }
    9. }"
    10. >跳转router-link>

    3. 接收参数

    1. $route.params.id
    2. $route.params.title

    路由的props配置

    分清楚这个是路由的props而不是组件的props。

    在js当中配置一个新的配置项props,他有三种写法:

    1.值为对象,该对象中的所有key-value都会以props的形式传给Detail组件。

    同时在detail中添加props属性声明接收。

    这种方法不推荐因为数据是写死的。 

    2.值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件。

    3.值为函数,该函数返回的对象(返回值)中每一组key-value都会通过props传给Detail组件

    传入参数$route,用来获取query参数,在函数里封装成对象通过props传给Detail组件。

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

    1. {
    2. name:'xiangqing',
    3. path:'detail/:id',
    4. component:Detail,
    5. //第一种写法:props值为对象,该对象中所有的key-value的组合最终都会通过props传给Detail组件
    6. // props:{a:900}
    7. //第二种写法:props值为布尔值,布尔值为true,则把路由收到的所有params参数通过props传给Detail组件
    8. // props:true
    9. //第三种写法:props值为函数,该函数返回的对象中每一组key-value都会通过props传给Detail组件
    10. props(route){
    11. return {
    12. id:route.query.id,
    13. title:route.query.title
    14. }
    15. }
    16. }
  • 相关阅读:
    uView学习(持续更新中)
    NX二次开发-UFUN CSYS坐标系转换UF_CSYS_map_point
    2023五一杯数学建模竞赛ABC题思路解析+代码+论文
    2022百度之星程序设计大赛 - 复赛 1001 子序列
    JDK版本切换 - Windows
    猿创征文|我的技术成长之路&&C++
    【云原生 | 29】Docker运行大数据经典分布式平台Hadoop
    工作任务管理平台作品集源文件 figma格式UX/UI设计师作品集
    Nodejs安装教程
    TCP/IP学习
  • 原文地址:https://blog.csdn.net/m0_52601969/article/details/127895605