首页 > 其他分享 >Vue的Router?一个小demo秒了

Vue的Router?一个小demo秒了

时间:2024-06-23 21:32:51浏览次数:3  
标签:demo Vue name import component vue Router home path

效果展示

正文

登录页

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;

标签:demo,Vue,name,import,component,vue,Router,home,path
From: https://blog.csdn.net/weixin_56440777/article/details/139905882

相关文章

  • 基于SpringBoot+Vue农产品管理与销售APP设计和实现(源码+LW+调试文档+讲解等)
    ......
  • 基于JavaSpringBoot+Vue+uniapp技术的微信小程序鲜花商城购物系统设计与实现
    博主介绍:硕士研究生,专注于Java技术领域开发与管理,以及毕业项目实战✌    从事基于javaBS架构、CS架构、c/c++编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经验。    先后担任过技术总监、部门经理、......
  • 【计算机毕业设计】ssm587企业人才管理与测评系统的设计与实现+vue
    如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统企业人才测评信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个企业人才管理与......
  • Vue 组件打包记录
    一、打包脚本constpath=require('path')constfs=require('fs')const{build,defineConfig}=require('vite')constvue=require('@vitejs/plugin-vue')constdts=require('vite-plugin-dts')constDefineOp......
  • Vue3中watch怎么解决静态问题的
    在Vue3中,`watch`函数用于观察和响应Vue响应式系统中的数据变化。Vue3的响应式系统基于Proxy,这使得它能够更细粒度地追踪依赖和更新DOM。然而,在使用`watch`时,有时可能会遇到所谓的“静态问题”,这通常是指`watch`函数内部引用的静态数据或计算属性在组件的整个生命......
  • 详细分析Js中的Object.entries()基本知识(附Demo)
    目录1.基本知识2.Demo1.基本知识用于将对象的可枚举属性转换为一个数组该数组包含对象自身的可枚举属性的键值对数组,每个键值对数组由两个元素组成:第一个元素是属性名,字符串(或符号)第二个元素是属性值,任何类型对象的属性默认是可枚举的,意味着它们可以在for...i......
  • FFmpeg开发笔记(三十二)利用RTMP协议构建电脑与手机的直播Demo
    不管是传统互联网还是移动互联网,实时数据传输都是刚需,比如以QQ、微信为代表的即时通信工具,能够实时传输文本和图片。其中一对一的图文通信叫做私聊,多对多的图文通信叫做群聊。除了常见的图文即时通信,还有实时音视频通信,比如一对一的音频通话、一对一的视频通话等等,此时可采用WebR......
  • 269:vue+openlayers 利用 MultiPoint 显示多点
    作者:还是大剑师兰特,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。查看本专栏目录-本文是第269个示例文章目录一......
  • 学生读书笔记共享系统-毕业设计-Springboot+mysql+Vue
    介绍学生读书笔记共享系统是一款专为学生设计的平台,旨在通过信息化手段实现读书笔记的共享和交流。系统分为管理端和用户端两个角色,分别为管理员和学生用户提供不同的功能模块,满足各自的需求。该系统不仅促进了学生之间的学习交流,还提升了学习效率和笔记管理的便捷性。技术栈......
  • 基于springboot的技术交流和分享平台 毕业设计 springboot+VUE
    介绍在当今迅速发展的信息时代,技术交流和知识分享已成为推动创新和个人成长的重要途径。然而,许多现有平台在笔记管理和分类上存在不足,缺乏有效的知识组织和分享机制,导致信息获取效率低下,交流互动有限。为了解决这些问题,我开发了一款基于SpringBoot的技术交流和分享平台。该平......