Vue的Router?一个小demo秒了

news2024/10/7 3:18:39

效果展示

正文

登录页

image.png

<template>
  <div>
    <div class="login">
      <h3>图书管理系统</h3>
      <div class="user">
        <span>账号:</span><input type="text" v-model="user" />
      </div>
      <div class="pwd">
        <span>密码:</span><input type="text" v-model="pwd" />
      </div>
      <div class="btn">
        <button @click="login">登录</button>
      </div>
    </div>
  </div>
</template>

这是一个简单的登录页的布局(css参考完整代码)

我们现在要实现输入账号和密码就能够跳转到home页怎么实现?

很简单

  1. 创建home页
  2. 配置路由
  3. 在登录点击事件里实现路由跳转
  • 创建home页

image.png

  • 配置路由
{
      path: "/home",
      component: Home,
      name: "home",
    },
  • 在登录点击事件里实现路由跳转
import { useRouter } from "vue-router";
import { ref } from "vue";

const user = ref("");
const pwd = ref("");
const router = useRouter();

const login = () => {
  if (user.value !== "" && pwd.value !== "") {
    localStorage.setItem("user", user.value);
    router.push("/home");
  }
};

通过 ref 创建了两个响应式变量 userpwd 来存储用户名和密码

然后,使用 useRouter 获取了路由实例 router

定义的 login 函数用于处理登录逻辑。当用户名和密码都不为空时,将用户名存储到本地存储 localStorage 中,并通过 router.push('/home') 跳转到 /home 路由对应的页面

接下来你就能实现下面的效果了

动画.gif

这里我们就了解了一级路由了

home页面

效果演示

动画.gif

我们通过home页面来讲解二级路由

首先我们创建基础页面

<div class="home">
      <header class="header">
        <div class="name">图书管理系统</div>
        <div class="userInfo">
          <span>欢迎 {{ user }}</span>
        </div>
      </header>
      <section class="main">
        <div class="menu">
          <ul class="menu-list">
            <li class="list-item" v-for="item in menu" :key="item.title">
              <router-link :to="`/home${item.path}`">{{
                item.title
              }}</router-link>
            </li>
          </ul>
        </div>

        <div class="content">
          <RouterView></RouterView>
        </div>
      </section>
    </div>

同样是三步走

  1. 创建页面
  2. 配置路由
  3. 添加router-link触发
  • 创建页面

image.png

创建好对应的页面

  • 配置路由
{
      path: "/home",
      component: Home,
      name: "home",
      children: [
        {
          path: "/home/add-book",
          component: AddBook,
          name: "addbook",
        },
        {
          path: "/home/borrow",
          component: Borrow,
          name: "borrow",
        },
        {
          path: "/home/category",
          component: Category,
          name: "category",
        },
        {
          path: "/home/search",
          component: Search,
          name: "search",
        },
      ],
    },
  • 添加router-link触发

我们首先创建一个用来存储菜单数据

export const menu = [
    {id: 1, title: '图书分类', path: '/category'},
    {id: 2, title: '查询图书', path: '/search'},
    {id: 3, title: '添加图书', path: '/add-book'},
    {id: 4, title: '借阅管理', path: '/borrow'}
  ]

image.png

通过import { menu } from "../menuData";可以导入数据

使用v-for渲染数据

<li class="list-item" v-for="item in menu" :key="item.title">
              <router-link :to="`/home${item.path}`">{{
                item.title
              }}</router-link>
</li>

现在我们就能实现二级路由的效果了

一级路由和二级路由的区别主要在于路由的配置是不同的

总结

本文通过一个小demo,讲解了路由的使用,路由的使用主要就是在于路由的配置,相信看到这里的你一定会有收获的

完整代码

  • login
<template>
  <div>
    <div class="login">
      <h3>图书管理系统</h3>
      <div class="user">
        <span>账号:</span><input type="text" v-model="user" />
      </div>
      <div class="pwd">
        <span>密码:</span><input type="text" v-model="pwd" />
      </div>
      <div class="btn">
        <button @click="login">登录</button>
      </div>
    </div>
  </div>
</template>

<script setup>
import { useRouter } from "vue-router";
import { ref } from "vue";

const user = ref("");
const pwd = ref("");
const router = useRouter();

const login = () => {
  if (user.value !== "" && pwd.value !== "") {
    localStorage.setItem("user", user.value);
    router.push("/home");
  }
};
</script>

<style lang="css" scoped>
.login {
  background-color: #a6f9bb;
  border: 1px solid #ccc;
  width: 400px;
  height: 230px;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  box-shadow: 0 0 10px #ff000080;
  padding: 20px;
  box-sizing: border-box;
}
.input {
  border-radius: 10px;
}
.user {
  margin-bottom: 20px;
  display: flex;
  align-items: center;
}
.user span {
  width: 50px;
}
.user input {
  flex: 1;
  font-size: 20px;
  padding: 3px 10px;
}
.pwd {
  display: flex;
  align-items: center;
  margin-bottom: 10px;
}
.pwd span {
  width: 50px;
}

.pwd input {
  flex: 1;
  font-size: 20px;
  padding: 3px 10px;
}

button {
  display: block;
  width: 80%;
  margin: 0 auto;
  padding: 5px 0;
  background-color: #009688;
  border: none;
  border-radius: 20px;
  cursor: pointer;
}
h3 {
  margin-bottom: 20px;
  text-align: center;
}
</style>

  • home
<template>
  <div>
    <div class="home">
      <header class="header">
        <div class="name">图书管理系统</div>
        <div class="userInfo">
          <span>欢迎 {{ user }}</span>
        </div>
      </header>
      <section class="main">
        <div class="menu">
          <ul class="menu-list">
            <li class="list-item" v-for="item in menu" :key="item.title">
              <router-link :to="`/home${item.path}`">{{
                item.title
              }}</router-link>
            </li>
          </ul>
        </div>

        <div class="content">
          <RouterView></RouterView>
        </div>
      </section>
    </div>
  </div>
</template>

<script setup>
import { menu } from "../menuData";

const user = localStorage.getItem("user");
</script>

<style lang="css" scoped>
.home {
  height: 100vh;
  display: flex;
  flex-direction: column;
}
.header {
  height: 60px;
  background-color: #beffca;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0px 50px;
}
.name {
  font-size: 30px;
  font-weight: bold;
}
.main {
  flex: 1;
  display: flex;
}
.menu {
  flex: 0 0 200px;
  background-color: #00a00d;
}
.content {
  flex: 1;
}
.menu-list {
  padding: 20px 0;
}
.list-item {
  height: 40px;
  line-height: 40px;
  font-size: 16px;
}
.list-item a {
  display: block;
  width: 100%;
  height: 100%;
  text-align: center;
}
.list-item:hover {
  background-color: #ecc536;
}
</style>

  • 路由
import { createRouter, createWebHistory } from "vue-router";
import Login from "../views/Login.vue";
import Home from "../views/Home.vue";
import AddBook from "../views/pages/AddBook.vue";
import Borrow from "../views/pages/Borrow.vue";
import Category from "../views/pages/Category.vue";
import Search from "../views/pages/Search.vue";

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: "/",
      redirect: "/login",
    },
    {
      path: "/login",
      component: Login,
      name: "login",
    },
    {
      path: "/home",
      component: Home,
      name: "home",
      children: [
        {
          path: "/home/add-book",
          component: AddBook,
          name: "addbook",
        },
        {
          path: "/home/borrow",
          component: Borrow,
          name: "borrow",
        },
        {
          path: "/home/category",
          component: Category,
          name: "category",
        },
        {
          path: "/home/search",
          component: Search,
          name: "search",
        },
      ],
    },
  ],
});

export default router;
import { createRouter, createWebHistory } from "vue-router";
import Login from "../views/Login.vue";
import Home from "../views/Home.vue";
import AddBook from "../views/pages/AddBook.vue";
import Borrow from "../views/pages/Borrow.vue";
import Category from "../views/pages/Category.vue";
import Search from "../views/pages/Search.vue";

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: "/",
      redirect: "/login",
    },
    {
      path: "/login",
      component: Login,
      name: "login",
    },
    {
      path: "/home",
      component: Home,
      name: "home",
      children: [
        {
          path: "/home/add-book",
          component: AddBook,
          name: "addbook",
        },
        {
          path: "/home/borrow",
          component: Borrow,
          name: "borrow",
        },
        {
          path: "/home/category",
          component: Category,
          name: "category",
        },
        {
          path: "/home/search",
          component: Search,
          name: "search",
        },
      ],
    },
  ],
});

export default router;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1854936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

监控 Promethus的监控告警Alertmanager、Grafana

Promethus的监控告警Alertmanager Alertmanager 介绍 Prometheus的一个组件&#xff0c;用于定义和发送告警通知&#xff0c;内置多种第三方告警通知方式&#xff0c;同时还提供了对Webhook通知的支持基于警报规则对规则产生的警报进行分组、抑制和路由&#xff0c;并把告警发…

Nginx基础概念和常用操作

文章目录 1. 安装、启动、连接2. 快速尝试部署网站3. 配置文件1. nginx.conf全局配置事件模块HTTP 模块性能优化建议 2. default.confserver 块基本设置日志设置根路径设置 4. 反向代理1. 模拟3个Web2. 链接 5. 负载均衡1. 加权轮询&#xff0c;Weighted Round Robin2. 最少连接…

【LeetCode刷题】232.用栈实现队列

目录 题目链接 图解思路 整体结构 实现过程 入队列 出队列 实现代码 MyQueue.h MyQueue.c stack.h stack.c test.c 题目链接 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 图解思路 整体结构 实现过程 入队列 插入数据时&#xff0c;插入到ist。…

SpringBoot使用AutoConfigure实现依赖库自动导入配置

我们知道导入配置有两种&#xff0c;一种是Value&#xff0c;一种是ConfigurationProperties&#xff0c;将对应的类标记为Component即可导入。但是被注解标识的类创建Bean有一个前提&#xff0c;只对启动类所在的包路径下的所有带有Component等注解的类才会创建Bean。如果我们…

Java智慧工地源码 5G智慧工地系统源码 使用SAAS部署 三维可视化管理,与一线生产过程相融合,集成数据后台,统一前端入口,呈现多方项目信息;

Java智慧工地源码 5G智慧工地系统源码 使用SAAS部署 三维可视化管理&#xff0c;与一线生产过程相融合&#xff0c;集成数据后台&#xff0c;统一前端入口&#xff0c;呈现多方项目信息; 智慧工地是指运用信息化手段&#xff0c;通过三维设计平台对工程项目进行精确设计和施工…

Java程序之素数问题

题目&#xff1a; 判断101-200之间有多少个素数&#xff0c;并输出所有素数。 程序分析&#xff1a; 判断素数的方法&#xff1a;用一个数分别去除2到sqrt(这个数)&#xff0c;如果能被整除&#xff0c;则表明此数不是素数&#xff0c;反之是素数。素数被利用在密码学上&#…

Kubernetes排错(七)-Pod 状态一直 ContainerCreating

查看 Pod 事件 $ kubectl describe pod apigateway-6dc48bf8b6-l8xrw -n cn-staging 异常原因 1&#xff09;no space left on device ... Events:Type Reason Age From Message---- ------ …

移远通信发布高性价比智能模组SC200P系列,赋能金融支付等行业智慧升级

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;为满足智慧金融、智能家居、智能穿戴、工业手持等消费和工业应用对高速率、多媒体、长生命周期等终端性能的需求&#xff0c;其正式推出基于紫光展锐UNISOC 7861平台的全新8核4G智能模组SC200P系列…

TypedDict 解析

TypedDict 解析 文章目录 TypedDict 解析1. 类型安全性2. 可读性3. 可维护性TypedDict 的解决方案没有 TypedDict 会发生什么&#xff1f;使用 TypedDict 的优势 TypedDict 应用场景1. 配置文件解析2. API 数据解析3. 数据库记录表示4. 表单数据验证5. 大型团队协作6. 静态类型…

数据可视化在智慧社区中的关键应用

数据可视化能够在智慧社区中发挥重要作用&#xff0c;通过直观和交互的方式将复杂的数据呈现出来&#xff0c;提升社区管理效率&#xff0c;优化居民生活体验&#xff0c;促进社区的可持续发展。在智慧社区中&#xff0c;数据可视化的应用涵盖了安全、环境、能源、交通和公共服…

AI播客下载:Eye on AI(AI深度洞察)

"Eye on A.I." 是一档双周播客节目&#xff0c;由长期担任《纽约时报》记者的 Craig S. Smith 主持。在每一集中&#xff0c;Craig 都会与在人工智能领域产生影响的人们交谈。该播客的目的是将渐进的进步置于更广阔的背景中&#xff0c;并考虑发展中的技术的全球影响…

【React】登录-封装Token的存取删方法--共享复用

在token.js中 // 封装存取方法const TOKENKEY token_keyfunction setToken (token) {return localStorage.setItem(TOKENKEY, token) }function getToken () {return localStorage.getItem(TOKENKEY) }function clearToken () {return localStorage.removeItem(TOKENKEY) }ex…

tensorRT C++使用pt转engine模型进行推理

目录 1. 前言2. 模型转换3. 修改Binding4. 修改后处理 1. 前言 本文不讲tensorRT的推理流程&#xff0c;因为这种文章很多&#xff0c;这里着重讲从标准yolov5的tensort推理代码&#xff08;模型转pt->wts->engine&#xff09;改造成TPH-yolov5&#xff08;pt->onnx-…

微信小程序毕业设计-在线厨艺平台系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

XSS漏洞实验

本篇为xss漏洞实验练习&#xff0c;练习网址来源于网络 练习网址&#xff1a;XSS平台|CTF欢迎来到XSS挑战|XSS之旅|XSS测试 一、前置说明 在测试过程中&#xff0c;有哪些东西是我们可以利用来猜测与判断的&#xff1a; 网页页面的变化&#xff1b;审查网页元素&#xff1b;查…

奇瑞复活经典路虎!中国技术,英国车标,卖向全球

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 6月19日&#xff0c;奇瑞和捷豹路虎宣布签署战略合作意向书&#xff0c;将复活“Freelander神行者”品牌。 小编当课代表&#xff0c;做个简单总结&#xff1a; 英国品牌&#xff0c;中国技术&#xf…

数组 (java)

文章目录 一维数组静态初始化动态初始化 二维数组静态初始化动态初始化 数组参数传递可变参数关于 main 方法的形参 argsArray 工具类sort 中的 comparable 和 comparatorcomparator 比较器排序comparable 自然排序 一维数组 线性结构 静态初始化 第一种&#xff1a;int[] a…

基于uni-app和图鸟UI开发上门服务小程序

一、技术栈选择 uni-app&#xff1a;我们选择了uni-app作为开发框架&#xff0c;因为它基于Vue.js&#xff0c;允许我们编写一次代码&#xff0c;发布到多个平台&#xff0c;包括iOS、Android、Web以及各种小程序。uni-app的丰富组件库、高效的状态管理以及便捷的预览调试功能&…

无霍尔BLDC驱动

目前主要的无霍尔控制方案是基于反电势检测信 息判断换相点,本文研究反电势在 PWM - OFF 点的检 测方案确定换相点。 1. 反电动势检测方案 BLDC 的模型做等效,将线圈阻抗看成是一个 线性电阻和一个储能电感的等效,其等效电路图如图 1所示。 电机三相绕组输出端电压的电压…

【PL理论深化】(3) MI 归纳法:归纳假设 (IH) | 结构归纳法 | 归纳假设的证明

&#x1f4ac; 写在前面&#xff1a;所有编程语言都是通过归纳法定义的。因此&#xff0c;虽然编程语言本身是有限的&#xff0c;但用该语言编写的程序数量是没有限制的&#xff0c;本章将学习编程语言研究中最基本的归纳法。本章我们继续讲解归纳法&#xff0c;介绍归纳假设和…