Vue的Router?一个小demo秒了

效果展示

正文

登录页

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;

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值