自学内容网 自学内容网

Vue实训---5-路由搭建

回顾之前的代码

我们在my-vue-project\src\router\index.js中的代码如下:

// 什么是路由?路由就是url地址和组件的对应关系
// 1.引入vue-router
import { createRouter, createWebHashHistory } from 'vue-router'

// 2.定义路由
const routes = [
    {
        path: '/',    // 路由路径
        name: 'main', // 路由名称
        component: () => import('@/views/Main.vue') // 路由组件
    },
]

// 创建路由实例
const router = createRouter({
    // 设置路由模式, hash模式
    history: createWebHashHistory(),
    routes, // 注入路由配置
})

// 3.导出路由
export default router 

表示我们定义了一个url路径:'/'(即默认路径/)与Main.vue组件的对应关系,然后当项目启动后就默认进到默认路径 '/' 中,即会显示Main.vue路由。Mian.vue组件具体显示在App.vue的路由视图<router-view></router-view>标签的位置。

1.新建组件

在src/views/文件夹下新建Home.vue、Mall.vue、User.vue、Page1.vue、Page2.vue组件,组件内容如下:

<template>
    <div>
        home组件(如果是其他组件的话名字修改一下)
    </div>
</template>

<script setup>

</script>

<style lang="less" scoped></style>

2.修改路由配置

my-vue-project\src\router\index.js

// 什么是路由?路由就是url地址和组件的对应关系

// 1.引入vue-router
import { createRouter, createWebHashHistory } from "vue-router";

// 2.定义路由
const routes = [
  {
    path: "/",
    name: "main",
    component: () => import("@/views/Main.vue"),
    redirect: "/home", //路由重定向
    children: [
      {
        path: "home",
        name: "home",
        component: () => import("@/views/Home.vue"),
      },
      {
        path: "user",
        name: "user",
        component: () => import("@/views/User.vue"),
      },
      {
        path: "mall",
        name: "mall",
        component: () => import("@/views/Mall.vue"),
      },
      {
        path: "page1",
        name: "page1",
        component: () => import("@/views/Page1.vue"),
      },
      {
        path: "page2",
        name: "page2",
        component: () => import("@/views/Page2.vue"),
      },
    ],
  },
];

// 创建路由实例
const router = createRouter({
  // 设置路由模式, hash模式
  history: createWebHashHistory(),
  routes, // 注入路由配置
});

// 3.导出路由
export default router;

3.为Mian.vue的子路由设置路由视图

在Main.vue中的el-main标签内部添加<router-view></router-view>路由视图,表示其子路由会显示在这个位置。

-- 在地址栏输入url地址验证

默认地址页面http://localhost:5173/#/ 会重定向到 http://localhost:5173/#/home,显示

地址页面http://localhost:5173/#/user,显示:

很棒!

5.配置左侧菜单栏与路由的联动

实现点击左侧菜单栏,右侧显示菜单栏项对应的组件。(即我们上一步实现的是地址栏URL与右侧组件的一一对应,现在实现左侧菜单栏与右侧组件的对应)

在CommonAside.vue组件中,找到标签el-menu-item(一共有两个),添加点击事件@click="handleMenu(传参)"

<!-- 循环遍历菜单栏 -->

<!-- 1.没有子菜单的遍历 -->

<el-menu-item @click="handleMenu(item)" v-for="item in noChildren" :key="item.path" :index="item.path">

<!-- 循环遍历子菜单 -->
<el-menu-item @click="handleMenu(child)" v-for="child in item.children" :key="child.path" :index="child.path">
    <!-- 动态获取icon图标 -->
    <component :is="child.icon" class="icons"></component>
    <!-- 显示文字内容 -->
    <span>{{ child.label }}</span>
</el-menu-item> 

继续在script中添加代码:

// 路由

import { useRouter, useRoute } from 'vue-router';

const router = useRouter()

// handleMenu方法的实现

const handleMenu = (item) => {

    router.push(item.path)

}

router.push() 是 Vue Router 提供的一个方法,用于在单页面应用(SPA)中进行路由跳转。

这个方法会改变浏览器的历史记录,并加载对应路径的组件,而不会刷新页面。

 即CommonAside.vue修改后的完整代码为:

<template>
    <!-- 首先最外层是Main.vue中注释的<el-aside width="200px" class="el-aside">Aside</el-aside>,我们将侧边栏改成我们自定义的组件,通过common-aside引入我们自己写的组件 -->
    <el-aside :width="width" class="el-aside">
        <el-menu background-color="#545c64" text-color="#fff" :collapse="isCollapse" :collapse-transition="false">
            <!-- 写菜单栏的大标题————通用后台管理系统 -->
            <h3 v-show="!isCollapse">通用后台管理系统</h3>
            <h3 v-show="isCollapse">后台</h3>
            <!-- 循环遍历菜单栏 -->
            <!-- 1.没有子菜单的遍历 -->
            <el-menu-item @click="handleMenu(item)" v-for="item in noChildren" :key="item.path" :index="item.path">
                <!-- <el-icon><icon-menu /></el-icon> -->
                <!-- 动态获取icon图标 -->
                <component :is="item.icon" class="icons"></component>
                <!-- 显示文字内容 -->
                <span>{{ item.label }}</span>
            </el-menu-item>
            <!-- 2.有子菜单的遍历 -->
            <el-sub-menu v-for="item in hasChildren" :key="item.path" :index="item.path">
                <template #title>
                    <!-- 动态获取icon图标 -->
                    <component :is="item.icon" class="icons"></component>
                    <!-- 显示文字内容 -->
                    <span>{{ item.label }}</span>
                </template>
                <!-- 分组 -->
                <el-menu-item-group>
                    <!-- 循环遍历子菜单 -->
                    <el-menu-item @click="handleMenu(child)" v-for="child in item.children" :key="child.path"
                        :index="child.path">
                        <!-- 动态获取icon图标 -->
                        <component :is="child.icon" class="icons"></component>
                        <!-- 显示文字内容 -->
                        <span>{{ child.label }}</span>
                    </el-menu-item>
                </el-menu-item-group>
            </el-sub-menu>
        </el-menu>
    </el-aside>
</template>

<script setup>
import { ref, computed } from 'vue'
import { storeToRefs } from 'pinia';
import { useAllDateStore } from '@/stores/index';
// 获取 store 实例
const store = useAllDateStore();
// 使用 storeToRefs 解构响应式属性
const { isCollapse } = storeToRefs(store);
// 根据 isCollapse 来计算宽度
const width = computed(() => isCollapse.value ? '64px' : '200px')

const list = ref([
    {
        path: '/home',
        name: 'home',
        label: '首页',
        icon: 'house',
        url: 'Home'
    },
    {
        path: '/mall',
        name: 'mall',
        label: '商品管理',
        icon: 'video-play',
        url: 'Mall'
    },
    {
        path: '/user',
        name: 'user',
        label: '用户管理',
        icon: 'user',
        url: 'User'
    },
    {
        path: 'other',
        label: '其他',
        icon: 'location',
        children: [
            {
                path: '/page1',
                name: 'page1',
                label: '页面1',
                icon: 'setting',
                url: 'Page1'
            },
            {
                path: '/page2',
                name: 'page2',
                label: '页面2',
                icon: 'setting',
                url: 'Page2'
            }
        ]
    }
])
const noChildren = computed(() => list.value.filter(item => !item.children))
const hasChildren = computed(() => list.value.filter(item => item.children))

// 路由
import { useRouter, useRoute } from 'vue-router';
const router = useRouter()
// handleMenu方法的实现
const handleMenu = (item) => {
    router.push(item.path)
}
</script>

<style lang="less" scoped>
.icons {
    width: 18px;
    height: 18px;
    margin-right: 5px;
}

.el-menu {
    border-right: none;

    h3 {
        line-height: 48px;
        color: #fff;
        text-align: center;
    }
}

.el-aside {
    height: 100%;
    background-color: #545c64;
}
</style>
--点击左侧菜单栏验证

点击“商品管理”:

点击“页面1”:

成功!

项目源代码:

通过百度网盘分享的文件:实现路由
链接:https://pan.baidu.com/s/1WaOLqig2MV-x-nv1M-6bMA?pwd=6666 
提取码:6666


原文地址:https://blog.csdn.net/qq_40930841/article/details/144065594

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!