1天搞定SpringBoot+Vue全栈开发 (8)前端路由VueRouter(进行组件切换)

简介: 1天搞定SpringBoot+Vue全栈开发 (8)前端路由VueRouter(进行组件切换)

1.VueRouter安装与使用


0f9242c8a43f4861be9b34fe2fc182a7.jpg


2.参数传递


创建路由组件

在项目中定义Discover.vue、Friends.vue、My.vue三个组件,将来要使用vue-router来控制它们的展示与切换:

Discover.vue

<template>
  <div>
    <h1>发现音乐</h1>
  </div>
</template>


Friends.vue

<template>
  <div>
    <h1>关注</h1>
  </div>
</template>


My.vue

<template>
  <div>
    <h1>我的</h1>
  </div>
</template>


声明路由链接和占位标签

可以使用<router-link> 标签来声明路由链接,并使用<router-view> 标签来声明路由占位符

App.vue:

<template>
  <div id="app">
    <!-- 声明路由链接 -->
    <router-link to="/discover"> 发现音乐 </router-link>
    <router-link to="/my"> 我的音乐 </router-link>
    <router-link to="/friends"> 关注音乐 </router-link>
    <!-- 声明路由展位标签 -->
    <router-view></router-view>
  </div>
</template>
 
<script>
export default {
  name: "App",
  components: {},
};
</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;
}
</style>


Main.js:

import Vue from 'vue'
import App from './App.vue'
import router from './router'
Vue.config.productionTip = false
 
new Vue({
  render: h => h(App),
  router: router
}).$mount('#app')


Index.js(在新建的src下面的router文件夹里)

import VueRouter from "vue-router";
import Vue from "vue";
import Discover from "../components/Discover.vue"
import Friends from "../components/Friends.vue"
import My from "../components/My.vue"
 
Vue.use(VueRouter);
 
const router = new VueRouter({
  // 指定hash属性与组件的对应关系
  routes: [
    { path: "/discover", component: Discover },
    { path: "/friends", component: Friends },
    { path: "/my", component: My },
  ],
})
export default router;


测试:

f3a4e7e2f9fc4341af03774d2b26b960.jpg

529be4d293ba4904908a6c211781553a.jpg

dc02c993d35b4cb88e275ae8f7ab241b.jpg


3.子路由


嵌套路由

Discover.vue

<template>
    <div>
        <h1>发现音乐</h1>
        <!-- 子路由链接 -->
        <router-link to="/discover/toplist">推荐</router-link>
        <router-link to="/discover/playlist">歌单</router-link>
        <hr>
        <router-view></router-view>
    </div>
</template>


TopList.vue

<template>
    <h3>推荐</h3>
</template>


PlayList.vue

<template>
    <h3>歌单</h3>
</template>


index.js:

import VueRouter from "vue-router";
import Vue from "vue";
import Discover from "../components/Discover.vue";
import Friends from "../components/Friends.vue";
import My from "../components/My.vue";
import TopList from "@/components/TopList.vue";
import PlayList from "@/components/PlayList.vue";
 
Vue.use(VueRouter);
 
const router = new VueRouter({
  // 指定hash属性与组件的对应关系
  routes: [
    { path: "/", redirect: "/discover" },
    {
      path: "/discover",
      component: Discover,
      //通过children属性,嵌套声明子路由
      children: [
        { path: "toplist", component: TopList },
        { path: "playlist", component: PlayList },
      ],
    },
    { path: "/friends", component: Friends },
    { path: "/my", component: My },
  ],
});
export default router;


测试:

1e0cf5be458149b1b821f34fa53f4a73.jpg

动态路由

动态路由指的是:把 Hash 地址中可变的部分定义为参数项,从而提高路由规则的复用性。在 vue-router 中使用英文的冒号(:)来定义路由的参数项:

{path:'/product/:id',component:Product}


Product.vue:

<template>
    <h3>商品</h3>
</template>


My.vue:

import VueRouter from 'vue-router';
<template>
  <div>
    <h1>我的</h1>
    <router-link to="/my/1">商品1</router-link>
    <router-link to="/my/2">商品2</router-link>
    <router-link to="/my/3">商品3</router-link>
    <VueRouter></VueRouter>
  </div>
</template>


index.js:

{ path: "/my", component: My },


改成

  {
      path: "/my",
      component: My,
      children: [{ path: ":id", component: Product }],
  },


或者将Producr.vue改成:

<template>
  <div>
   <h3>商品{{ $route.params.id }}</h3> 
  </div>
</template>
 
<script>
export default {
  props: ["id"],
};
</script>


4.导航守卫


控制路由的访问权限

全局导航守卫会拦截每个路由规则,从而对每个路由进行访问权限的控制.

你可以使用 router.beforeEach 注册一个全局前置守卫

router.beforeEach((to, from, next) => {
  if (to.path==='/main'&&!isAuthenticated) {
    next('/login');
  } else {
    next();
  }
});


to:即将要进入的目标

from:当前导航正要离开的路由

在守卫方法中如果声明了 next 形参,则必须调用 next() 函数,否则不允许用户访问任何一个路

       直接放行:next()

       强制其停留在当前页面: next(false)

       强制其跳转到登录页面: next('/login')

相关文章
|
5月前
|
JSON 监控 前端开发
AMIS:百度开源的前端低代码神器,18.4k star 背后的开发效率提升利器
AMIS(前端低代码框架)是百度开源的低代码前端框架,基于纯 JSON 配置即可生成完整后台页面,包括表单、表格、图表、CRUD 列表,支持可视化拖拽编辑。,星标数已达 18.4k,百度内部已沉淀超过 5 万个页面,广泛应用于审核系统、数据管理后台、模型监控等落地场景
1038 0
|
4月前
|
人工智能 前端开发 JavaScript
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
716 18
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
|
4月前
|
前端开发 安全 Java
基于springboot+vue开发的会议预约管理系统
一个完整的会议预约管理系统,包含前端用户界面、管理后台和后端API服务。 ### 后端 - **框架**: Spring Boot 2.7.18 - **数据库**: MySQL 5.6+ - **ORM**: MyBatis Plus 3.5.3.1 - **安全**: Spring Security + JWT - **Java版本**: Java 11 ### 前端 - **框架**: Vue 3.3.4 - **UI组件**: Element Plus 2.3.8 - **构建工具**: Vite 4.4.5 - **状态管理**: Pinia 2.1.6 - **HTTP客户端
574 4
基于springboot+vue开发的会议预约管理系统
|
5月前
|
前端开发 JavaScript Java
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
本系统基于SpringBoot与Vue3开发,实现校园食堂评价功能。前台支持用户注册登录、食堂浏览、菜品查看及评价发布;后台提供食堂、菜品与评价管理模块,支持权限控制与数据维护。技术栈涵盖SpringBoot、MyBatisPlus、Vue3、ElementUI等,适配响应式布局,提供完整源码与数据库脚本,可直接运行部署。
315 6
基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
|
Java Spring
SpringBoot 开发秘籍 - 启动时配置校验
在项目开发过程中,某个功能需要依赖在配置文件中配置的参数。
344 0
SpringBoot 开发秘籍 - 启动时配置校验
|
3月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。
|
3月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
3月前
|
JavaScript Java 关系型数据库
基于springboot的古树名木保护管理系统
本研究针对古树保护面临的严峻挑战,构建基于Java、Vue、MySQL与Spring Boot技术的信息化管理系统,实现古树资源的动态监测、数据管理与科学保护,推动生态、文化与经济可持续发展。
|
3月前
|
监控 安全 JavaScript
2025基于springboot的校车预定全流程管理系统
针对传统校车管理效率低、信息不透明等问题,本研究设计并实现了一套校车预定全流程管理系统。系统采用Spring Boot、Java、Vue和MySQL等技术,实现校车信息管理、在线预定、实时监控等功能,提升学校管理效率,保障学生出行安全,推动教育信息化发展。