vue3路由详解,从0开始手动配置路由(vite,vue-router)

 创建一个不含路由的vue项目

(查看路由配置可以直接跳过这一段)

输入npm指令,然后写一个项目名称,之后一路回车即可

npm create vue@latest

注意这里我们不选引入vue router,成功后可以 查看目录

然后按提示信息输入指令,进入项目,安装node包,并启动项目

  cd myRouter
  npm install
  npm run dev

最后创建完成的目录 

成功启动了一个vue项目,接下面我们开始配置路由

配置路由

首先我们在src目录下新建两个文件夹,router和view

然后分别在这两个目录下创建几个新文件

安装vue-router包

npm install vue-router --save

安装完成后可以在package.json中查看

成功安装后我们再配置views下的home.vue,about.vuerouter下的index.js

home.vue: 

<script setup>//组合式API
import { ref,reactive,onMounted } from 'vue';

</script>

<template>
<p>home</p>
</template>

<style scoped>
/* 当 <style> 标签带有 scoped attribute 的时候,它的 CSS 只会影响当前组件的元素 */

</style>

about.vue: 

<script setup>//组合式API
import { ref,reactive,onMounted } from 'vue';

</script>

<template>
<p>about</p>
</template>

<style scoped>
/* 当 <style> 标签带有 scoped attribute 的时候,它的 CSS 只会影响当前组件的元素 */

</style>

 index.js:

import { createRouter,createWebHashHistory } from "vue-router";
import home from "../views/home.vue";

const routes = [
    {
        path:"/", //路径描述
        name:"home",
        component: home // 主动引用,无论是否访问均加载页面
    },
    {
        path:"/about",
        name:"about",
        component: ()=> import("../views/about.vue")// 异步加载的路由的组件位置,只有页面被访问才加载
    }
]

const router = createRouter({
    history:createWebHashHistory(), // 跳转方式
    routes :routes // 路由配置
})
export default router

        这要注意index.js中的 routes,这里是配置了页面的跳转路径和路径,同时设置了页面的加载方式,component异步的加载方式可以优化主页面的加载通常我们选择主页直接加载页面,而其他页面选择异步加载),而跳转方式我们尽量使用createWebHashHistory()方法

配置好路由页面和路由后,我们将它从入口文件(main.js,app.vue)导入进项目,

main.js:

import './assets/main.css'

import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index';

createApp(App).use(router).mount('#app');

app.vue:

<script setup>
import {RouterLink,RouterView} from "vue-router"
</script>

<template>
  <header>
    <img alt="Vue logo" class="logo" src="./assets/logo.svg" width="125" height="125" />
  </header>

  <main>
    <router-link to="/">home</router-link>
    <router-link to="/about">about</router-link>
    <router-view></router-view>
  </main>
</template>

<style scoped>
header {
  line-height: 1.5;
}

.logo {
  display: block;
  margin: 0 auto 2rem;
}

@media (min-width: 1024px) {
  header {
    display: flex;
    place-items: center;
    padding-right: calc(var(--section-gap) / 2);
  }

  .logo {
    margin: 0 2rem 0 0;
  }

  header .wrapper {
    display: flex;
    place-items: flex-start;
    flex-wrap: wrap;
  }
}
</style>

 在app.vue中router-link的作用是导航跳转,通过to属性跳转页面,to的值为index.js中的routes的path跳转路径,router-view的作用是展示页面,跳转的页面在这个标签内展示

可以看到实现了基本的单页面跳转

路由传参

        页面直接跳转还可以传递参数,在实际应用中,我们可以通过不同的参数在同一个网页展示不同的信息

我们下view下新建两个文件 news.vue , newData.vue

news.vue:

<script setup>//组合式API
import { ref,reactive,onMounted } from 'vue';

</script>

<template>
<p>news</p>
<ul>
    <li><router-link to="/newData/新闻1">new1</router-link></li>
    <li><router-link to="/newData/新闻2">new2</router-link></li>
    <li><router-link to="/newData/新闻3">new3</router-link></li>
</ul>
</template>

<style scoped>
/* 当 <style> 标签带有 scoped attribute 的时候,它的 CSS 只会影响当前组件的元素 */

</style>

newData.vue: 

<script setup>//组合式API
import { ref,reactive,onMounted } from 'vue';

</script>

<template>
<p>这里展示的是{{ $route.params.key }}</p>
</template>

<style scoped>
/* 当 <style> 标签带有 scoped attribute 的时候,它的 CSS 只会影响当前组件的元素 */

</style>

然后再配置index.js:

import { createRouter,createWebHashHistory} from 'vue-router'
import home from '../views/home.vue'
const routes = [
    {
        path:'/',
        name:'home',
        component: home
    },
    {
        path:'/about',
        name:'about',
        component: ()=> import('../views/about.vue')
    },
    {
        path:'/news',
        name:'news',//路由的名称
        component: ()=> import('../views/news.vue')
    },
    {
        path:"/newData/:key",
        name:"newData",
        component: ()=> import('../views/newData.vue')
    }
]
const router = createRouter({
    history:createWebHashHistory(),
    routes:routes
})
export default router;

这里要注意 news.vue中的跳转标签属性to除了指向newData.vue之外,还带有一个参数,这个参数在index.js中用:key来表示,在newData.vue中通过$route.params.key获取(这里的key就是:key,可以自行定义)

这样我们就成功实现了页面跳转时传递参数

嵌套路由

        除了传递参数能向下访问页面,还有另一种方式也可以向下访问页面,也就是二级导航(会保留导航)

        我们在view文件夹下新建一个文件夹aboutViews,并在aboutViews文件夹下新建aboutA.vue和aboutB.vue

aboutA.vue:

<script setup>//组合式API
import { ref,reactive,onMounted } from 'vue';

</script>

<template>
<p>关于信息A</p>
</template>

<style scoped>
/* 当 <style> 标签带有 scoped attribute 的时候,它的 CSS 只会影响当前组件的元素 */

</style>

aboutB.vue:

<script setup>//组合式API
import { ref,reactive,onMounted } from 'vue';

</script>

<template>
<p>关于信息B</p>
</template>

<style scoped>
/* 当 <style> 标签带有 scoped attribute 的时候,它的 CSS 只会影响当前组件的元素 */

</style>

然后再修改about.vue和index.js

about.vue:

<script setup>//组合式API
import { ref,reactive,onMounted } from 'vue';

</script>

<template>
    <div>
        <router-link to="/about/A">A</router-link>
        <router-link to="/about/B">B</router-link>
        <router-view></router-view>
    </div>

</template>

<style scoped>
/* 当 <style> 标签带有 scoped attribute 的时候,它的 CSS 只会影响当前组件的元素 */

</style>

index.js:

import { createRouter,createWebHashHistory} from 'vue-router'
import home from '../views/home.vue'
const routes = [
    {
        path:'/',
        name:'home',
        component: home
    },
    {
        path:'/about',
        name:'about',
        component: ()=> import('../views/about.vue'),
        children:[
            {
                path: "A" ,//注意这里不加'/'
                component: ()=> import("../views/aboutViews/aboutA.vue"),
            },
            {
                path:'B',
                component: ()=> import('../views/aboutViews/aboutB.vue')
            }
        ]
    },
    {
        path:'/news',
        name:'news',//路由的名称
        component: ()=> import('../views/news.vue')
    },
    {
        path:"/newData/:key",
        name:"newData",
        component: ()=> import('../views/newData.vue')
    }
]
const router = createRouter({
    history:createWebHashHistory(),
    routes:routes
})
export default router;

        在about.vue中添加router-link和router-view标签,并加上2级路径,然后在index.js的about的路由属性中添加children属性,在children属性绑定对应的2级路由

这里就成功实现了2级路由

到这里我们就成功的手动搭建路由,并实现了多种路由的方式

系统路由

完成了手动路由,我们可以参照对比一下系统路由的结构

重新新建一个项目

npm create vue@latest

这里我们选择引入vue Router构建项目,其他的不变选择默认即可

我们进入目录可以看到在src下已经有router和views文件夹以及对应的文件,

package.json文件中也有vue-router包

启动项目查看

通过这个路由的url可以知道,系统路由默认是采用的createWebHistory()方法进行跳转

        其他的基本格式都没有区别,了解了手动搭建路由后,在新项目中配置路由就可以使用系统路由并在此基础上进行一定的修改,这样可以很大程度的提高开发效率

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PLC通过Profinet转Modbus网关与流量计通讯案例

1、案例背景 在工业自动化系统中&#xff0c;PLC(可编程逻辑控制器)与流量计之间的通信是保证以后设备生产数据准确传输和实现控制功能的关键。但是&#xff0c;由于PLC和流量计可能使用不同的通信协议(如Profinet和Modbus)&#xff0c;因此需要一种转换机制来实现它们之间的通…

Telnet发邮件的功能如何实现?有哪些限制?

Telnet发邮件有哪些步骤&#xff1f;使用Telnet发送邮件安全吗&#xff1f; 虽然大多数人使用图形化的电子邮件客户端发送和接收邮件&#xff0c;但了解如何通过Telnet发邮件依然是有益的。AokSend将详细介绍Telnet发邮件的功能如何实现&#xff0c;帮助读者掌握这种基础但有用…

问题:材料题请点击右侧查看材料问题 查看材料 #学习方法#经验分享#学习方法

问题&#xff1a;材料题请点击右侧查看材料问题 查看材料 A.Colleges may reduce their enrollment. B.Top universities become increasingly competitive. C.Universities become selective in student admission. D.Colleges invest less in academy and infrastructure…

模拟超市收银系统

题目 模拟超市收银系统 内容要求&#xff1a;使用文本命令行窗口设计模拟超市收银系统。要求由收银员输入顾客的会员卡卡号&#xff08;若有卡&#xff09;、所购商品的货号等。从文件中取出有关价格信息&#xff0c;再把这些信息返回给收银台。同时把该收银台的销售总量和有…

「动态规划」如何求地下城游戏中,最低初始健康点数是多少?

174. 地下城游戏https://leetcode.cn/problems/dungeon-game/description/ 恶魔们抓住了公主并将她关在了地下城dungeon的右下角。地下城是由m x n个房间组成的二维网格。我们英勇的骑士最初被安置在左上角的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。骑士…

Node.js环境搭建

背景 想接触下node开发, 打算做个node环境 一、安装包获取 我喜欢使用压缩包解压然后配置的方式进行 地址为: Index of /download/release/ ,可按需选择自己的版本,我选择了如下版本 二、解压配置 将压缩包解压只自己想要安装的文件加下,配置环境变量,解压如下所示: …

Polar Web【中等】写shell

Polar Web【中等】写shell Contents Polar Web【中等】写shell思路&探索EXP运行&总结 思路&探索 初看题目&#xff0c;预测需要对站点写入木马&#xff0c;具体操作需要在过程中逐步实现。 打开站点(见下图)&#xff0c;出现 file_put_contents 函数&#xff0c;其…

HarmonyOS开发-鸿蒙UiAbility 组件间跳转

前言 随着春节假期结束各行各业复产复工&#xff0c;一年一度的春招也持续火热起来。最近&#xff0c;有招聘平台发布了《2024年春招市场行情周报&#xff08;第一期&#xff09;》。总体来说今年的就业市场还是人才饱和的状态&#xff0c;竞争会比较激烈。 但是&#xff0c;…

算法学习笔记(7.6)-贪心算法(霍夫曼编码)

目录 1.什么是霍夫曼树 2.霍夫曼树的构造过程 3.霍夫曼编码 3.1具体的作用-频率统计 ##实战题目 1.什么是霍夫曼树 给定N个权值作为N个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树的带权路径长度达到最小&#xff0c;称这样的二叉树为最优二叉树&#xff0c;也…

计算机组成结构—IO方式

目录 一、程序查询方式 1. 程序查询基本流程 2. 接口电路 3. 接口工作过程 二、程序中断方式 1. 程序中断基本流程 2. 接口电路 3. I/O 中断处理过程 三、DMA 方式 1. DMA 的概念和特点 2. DMA 与 CPU 的访存冲突 3. DMA 接口的功能 4. DMA 接口的组成 5. DMA 的…

STCunio数字电源带PID数字闭环(带详细的代码说明文档)

STCunio&#xff0c;即 system on chip unusual i/o,采用类似 arduino 构架设计&#xff0c;即使没有单片机知 识的设计师和艺术家们能够很快地通过它学习电子和传感器的基础知识&#xff0c;并应用到他们的设 计当中。设计中所要表现的想法和创意才是最主要的&#xff0c;至于…

Windows 搭建C++ 纯开源开发环境 进行 YOLOv8 模型推理的开发测试环境

文章大纲 IDE 选择纯开源首选 Codeblocks 跨平台开发IDE其次选择 visual studio 社区版 or visual studio code包管理MSYS2pacmanconda & mambavcpkgNuGetapt-get其他手动配置 Visual studio 开发环境下载 visual studio基本配置基本测试:打开图片,打开摄像头读取图片读取…

STL中stack和queue模拟实现+容器适配器

目录 容器适配器 STL标准库中stack和queue的底层结构 deque的简单介绍 deque的缺陷 为什么选择deque作为stack和queue的底层默认容器 stack的模拟实现 queue的模拟实现 容器适配器 适配器是一种设计模式&#xff08;设计模式是一套被反复使用的&#xff0c;多数人知晓…

吴谨言墨雨背后用真诚柱铸就爆款之路

吴谨言&#xff1a;墨雨背后&#xff0c;用真诚铸就爆款之路在繁华的娱乐圈&#xff0c;每一个成功的背后隐藏着不为人知的努力和汗水。而今天&#xff0c;我们要讲述的&#xff0c;正是这样一位用真诚和执着&#xff0c;一步步走向成功的演员——吴谨言。近日&#xff0c;一则…

cs与msf权限传递

cs传递到msf 1&#xff0c;先启动cs ┌──(root㉿ring04h)-[~/cobalt_strike_4.7] └─# ./teamserver 192.168.196.144 123456 ​ ┌──(root㉿ring04h)-[~/cobalt_strike_4.7] └─# ./start.sh ​ 2&#xff0c;上传木马&#xff0c;上线主机 3&#xff0c;msf配置一个…

出售iPhone前的必做步骤:完全擦除个人数据的方法

当您准备在闲鱼上转售旧 iPhone、将其捐赠、送给朋友或通过 Apple 回收之前&#xff0c;您可能会选择执行“恢复”操作来擦除您的数据。但请注意&#xff0c;这一操作并不能真正删除设备中的数据。被“删除”或“格式化”的数据实际上仍存在于 iPhone 中&#xff0c;只是被系统…

106、python-第四阶段-3-设计模式-单例模式

不是单例类&#xff0c;如下&#xff1a; class StrTools():pass str1StrTools() str2StrTools() print(str1) print(str2) 运用单例&#xff0c;先创建一个test.py class StrTools():pass str1StrTools()然后创建一个hello.py&#xff0c;在这个文件中引用test.py中的对象&a…

Day14:响应式网页

通过媒体查询、Bootstrap 框架完成腾讯全端网页响应式布局。 一、响应式布局方案 1、什么是响应式布局 它的主要特点是能够使网页根据不同的设备屏幕尺寸&#xff08;如桌面电脑、平板电脑、手机等&#xff09;和分辨率自动调整布局和显示效果&#xff0c;以提供最佳的用户体…

解决:Navicat导入sql脚本时报2006

目录 问题复现原因分析解决办法问题小结 1) MySQL 服务宕了 2) mysql连接超时 3) mysql请求链接进程被主动kill 4) Your SQL statement was too large. 问题复现 今天在用Navicat 16.0.6导入.sql文件时&#xff0c;运行一半就报错了。错误如下&#xff1a; [E…

FPGA新起点V1开发板(十)——按键控制LED

文章目录 一、实验任务二、代码展示三、管脚分配 一、实验任务 二、代码展示 module key_led(input sys_clk,input rst_n,input [3:0] key,output reg [3:0] led);// reg define reg [23:0] cnt; reg [1:0] led_ctrl;//0.2s计数器 always (posed…