vue 路由

本文详细介绍了 Vue Router 的核心功能,包括路由配置、声明式与编程式导航、路由重定向、路由嵌套、路由守卫及面包屑导航等。通过实际案例展示了如何使用 Vue Router 进行页面间的跳转与数据传递。

目录

一、路由配置

二、声明式导航

1.声明式导航 - 基础使用

2.声明式导航 -传值

三、编程式导航

1.编程式导航 - js方式跳转路由

2.编程式导航 - 传参

四、路由重定向

五、路由嵌套

六、路由守卫

七、面包屑导航


一、路由配置

二、声明式导航

1.声明式导航 - 基础使用

本质:vue-router提供的全局组件"router-link"替代a标签

router-link替代a标签

to属性  替代href属性

好处:router-link自带高亮的类名(激活时类名)

<template>
  <div>
    <div class="footer_wrap">
      <router-link to="/find">发现音乐</router-link>
      <router-link to="/my">我的音乐</router-link>
      <router-link to="/part">朋友</router-link>
    </div>
    <div class="top">
      <!-- 7.设置挂载点-当url的hash值路径切换,显示规则里对应的组件到这里 -->
      <router-view></router-view>
    </div>
  </div>
</template>

2.声明式导航 -传值

方式一

to="/path?参数名=参数值"

接收:$route.query.参数名

<template>
  <div>
    <div class="footer_wrap">
      <router-link to="/find">发现音乐</router-link>
      <router-link to="/my">我的音乐</router-link>
      <router-link to="/part?name=小传">朋友-小传</router-link>
    </div>
    <div class="top">

      <router-view></router-view>
    </div>
  </div>
</template>
<template>
  <div>
    <p>关注明星</p>
    <p>发现精彩</p>
    <p>寻找伙伴</p>
    <p>加入我们</p>
    <p>人名-{{$route.query.name}}</p>
  </div>
</template>

方式二

(1)路由规则path上定义 /path/:参数名

(2)to='/path/值'

接收:$route.params.参数名

const routes = [
  { path: "/find", component: Find },
  { path: "/my", component: My },
  { path: "/part", component: Part },
  { path: "/part/:username", component: Part },
];
<template>
  <div>
    <div class="footer_wrap">
      <router-link to="/find">发现音乐</router-link>
      <router-link to="/my">我的音乐</router-link>
      <router-link to="/part?name=小传">朋友-小传</router-link>
      <router-link to="/part/小智">朋友-小智</router-link>
    </div>
    <div class="top">

      <router-view></router-view>
    </div>
  </div>
</template>
<template>
  <div>
    <p>关注明星</p>
    <p>发现精彩</p>
    <p>寻找伙伴</p>
    <p>加入我们</p>
    <p>人名-{{$route.query.name}}--{{$route.params.username}}</p>
  </div>
</template>

三、编程式导航

1.编程式导航 - js方式跳转路由

 注意:

    虽然用name跳转,但是url的hash值还是切换path路径值

 场景:

    方便修改:name路由名(在页面上看不见随便定义)

    path可以在url的hash值看到(尽量符合组内规范)

方式一:

  this.$router.push({path:'路由路径'})

  this.$router.push({name:'路由名'})

  this.$router.push('路径')

 methods: {
    btn(targetPath,targetName){
      //方式一:path跳转
      //方式二:name跳转
      this.$router.push({
        // path:targetPath
        name:targetName
      })
      // 方式三
      //  this.$router.push('路径')
    }
  }

方式二:

this.$router.replace('路径')

<template>
  <div>
    <div class="footer_wrap">
      <span @click="$router.replace('/part')">朋友</span>
    </div>
    <div class="top">
      <router-view></router-view>

    </div>
  </div>
</template>

方式三:

this.$router.go('前进或后退几步')

<template>
  <div>
    <div class="footer_wrap">
      <span @click="$router.go(2)">发现音乐</span>
    </div>
    <div class="top">
      <router-view></router-view>

    </div>
  </div>
</template>

注意:path和replace方法的区别

    path: 使用push方法跳转到浏览器将会跳转之前的页面路径path记录到历史栈中,点击返回浏览器返回可以直接返回上一级

     replace: 使用replace方法跳转,浏览器不会例句跳转之前的页面路径path,点击跳转不会返回到跳转之前的页面

       如下代码返回时会跳过【我的音乐】

<template>
  <div>
    <div class="footer_wrap">
      <span @click="$router.go(2)">发现音乐</span>
      <span @click="btn('/my','My')">我的音乐</span>
      <span @click="$router.replace('/part')">朋友</span>
    </div>
    <div class="top">
      <router-view></router-view>
    </div>
  </div>
</template>

2.编程式导航 - 传参

 方式一:

  params => $route.params.参数名

  方式二:

  query => $route.query.参数名

  重要:path会自动忽略params

  推荐:name+query方式传参

  注意:如果当前url上"hash值和?参数"与你要跳转的"hash值和?参数"一致,会导致冗余导航问                   题,不会跳转路由

<template>
  <div>
    <div class="footer_wrap">
      <span @click="btn('/find','Find')">发现音乐</span>
      <span @click="btn('/my','My')">我的音乐</span>
      <span @click="btnOne">朋友-张三</span>
      <span @click="btnTwo">朋友-李四</span>
      <span @click="btnThree(1)">朋友-李四</span>
  
    </div>
    <div class="top">
      <router-view></router-view>

    </div>
  </div>
</template>
 methods: {
    btn(targetPath,targetName){
      //方式一:path跳转
      //方式二:name跳转
      this.$router.push({
        // path:targetPath
        name:targetName
      })
    },
    btnOne(){
      this.$router.push({
        name:'Part',
        params:{
          username:'张三'
        }
      })
    },
    btnTwo(){
      this.$router.push({
        name:'Part',
        query:{
          name:'李四'
        }
      })
    },
    btnThree(id){
      this.$router.push(`/part/${id}`)
    }
  }

四、路由重定向

 配置路由规则数组
const routes = [
  //redirect可以将特定的path路径重定向到指定路径
  {
    path: "/",
    redirect: "/home",
  },
 .............其他配置
  {
    path: "/404",
    component: () => import("@/views/NotFound"),
  },
  //path:'*'代表如果用户访问的路径在路由规则数组中都没有配置过,就触发此条配置规则,重定向到404页面
  {
    path: "*",
    redirect: "/404",
  },
];

五、路由嵌套

const routes = [
  {
    path: "/", //默认hash值路径
    redirect: "/find", //重定向到/find
    //浏览器url中#后的路径被变成/find-重新匹配规则
  },
  {
    path: "/find",
    name: "Find",
    component: Find,
    children: [
      {
        path: "recommend",
        component: Recommend,
      },
      {
        path: "ranking",
        component: Ranking,
      },
      {
        path: "songList",
        component: SongList,
      },
    ],
  },
  { path: "/my", name: "My", component: My },
  { path: "/part", name: "Part", component: Part },

  //404页面一定要写在数组最后
  { path: "*", component: NotFound },
];
<template>
  <div>
    <!-- <p>推荐</p>
    <p>排行榜</p>
    <p>歌单</p> -->
    <div class="nav_main">
      <router-link to="/find/recommend">推荐</router-link>
      <router-link to="/find/ranking">排行榜</router-link>
      <router-link :to="{path:'/find/songlist',query:{id:10} }">歌单</router-link>
    </div>

    <div style="1px solid red;">
      <router-view></router-view>
    </div>
  </div>
</template>

六、路由守卫

场景:当你要对路由权限判断时

语法:router.beforeEach((to,from,next)=>{路由跳转之前先执行这个函数,判断是否跳转})

参数1-to:要跳转到的路由(路由对象信息) 目标

参数2-from从哪个路由跳转  来源

参数3-next():只有写next()才会让路由正常跳转切换,next(false)在原地停留,next("强制修改到另一个路由路径上")

注意:如果不调用next,页面停留在原地

 meta: { noAuth: true },表示进入此页面不需要验证

const routes = [
  //redirect可以将特定的path路径重定向到指定路径
  {
    path: "/",
    redirect: "/home",
  },
  {
    name: "Login",
    path: "/login",
    component: Login,
    meta: { noAuth: true },
  },
  //首页
  {
    path: "/home",
    component: () => import("@/views/Home"),
    meta: { noAuth: true },
  },
 
  {
    path: "/404",
    component: () => import("@/views/NotFound"),
    meta: { noAuth: true },
  },
.....其他路由配置
  {
    path: "*",
    redirect: "/404",
  },
];

// 4. 实例化VueRouter
const router = new VueRouter({
  // mode: "history",
  routes,
});

router.beforeEach((to, from, next) => {
  console.log(to, "====to====");
  console.log(from, "====from====");
  console.log(next, "====next====");
  const flag = localStorage.getItem("LoginFlag");
  if (to.meta.noAuth) {
    next();
  } else {
    if (flag === "Login") {
      next();
    } else {
      next("/login");
    }
  }
});

七、面包屑导航

meta: { title: "导航名" }

const routes = [
  //redirect可以将特定的path路径重定向到指定路径
  {
    path: "/",
    redirect: "/home",
  },
  {
    name: "Login",
    path: "/login",
    component: Login,
    meta: { noAuth: true },
  },
 .....其他路由配置
  {
    path: "/usercenter",
    component: () => import("@/views/UserCenter"),
    redirect: "/usercenter/welcome",
    meta: { title: "用户中心" },
    children: [
      {
        path: "welcome",
        component: () => import("@/views/UserCenter/child/welcome.vue"),
        meta: { title: "欢迎" },
      },
      {
        path: "information",
        component: () => import("@/views/UserCenter/child/Information.vue"),
        meta: { title: "我的资料" },
      },
      {
        path: "order",
        component: () => import("@/views/UserCenter/child/order.vue"),
        meta: { title: "我的订单" },
      },
    ],
  },
  {
    path: "/404",
    component: () => import("@/views/NotFound"),
    meta: { noAuth: true },
  },
  //path:'*'代表如果用户访问的路径在路由规则数组中都没有配置过,就触发此条配置规则,重定向到404页面
  {
    path: "*",
    redirect: "/404",
  },
];
  <div class="pos">
              <span>xx,欢迎您!<button>退出</button></span>
              <div class="breadcrumb_content">
              <span>当前位置:</span>
          <Breadcrumb :list="$route.matched" />
       </div>
  </div>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值