Vue 入门到实战 十

10Vue Router​​​​​​​

目录

10.1 什么是路由

10.2 Vue Router的安装

10.2.1 本地独立版本方法

10.2.2 CDN方法

10.2.3 NPM方法

10.2.4 命令行工具(Vue CLI)方法

10.3 Vue Router的基本用法

10.3.1 跳转与传参

10.3.2 配置路由

10.4 Vue Router高级应用

10.4.1 动态路由匹配

10.4.2 嵌套路由

 10.4.3 编程式导航

10.4.4 命名路由

10.4.5 重定向​编辑

10.4.6 路由组件props传参

10.4.7 HTML5 历史记录模式

 10.5 路由钩子函数

10.5.1 全局前置钩子函数

10.5.2 全局解析钩子函数

10.5.3 全局后置钩子函数

10.5.4 某个路由的钩子函数

10.5.5 组件内的钩子函数

10.6 路由元信息


10.1 什么是路由

路由,本是一个网络工程术语,是指分组从源到目的地时,决定端到端路径的网络范围的进程。在Web前端单页面应用中,路由描述的是URLUI之间的映射关系,这种映射是单向的,即URL变化引起UI更新(无需刷新页面)。

Vue Router Vue.js 官方的路由管理器,它和 Vue.js 的核心深度集成,使构建单页面应用变得更加容易。

10.1.1 SPA与前端路由

SPA指的是一个web网站只有唯一的一个HTML页面,所有组件的展示与切换都在唯一的一个页面内完成。

此时,不同组件之间的切换需要通过前端路由来实现。

结论:在 SPA 项目中,不同功能之间的切换,要依赖于前端路由来完成!

10.1.2 什么是前端路由

Hash地址与组件之间的对应关系

图是参考这篇文章:vue-router 路由超详细教程_vue router-CSDN博客

10.2 Vue Router的安装

10.2.1 本地独立版本方法

可通过地址“https://unpkg.com/vue-router@next将最新版本的Vue Router库(vue-router.global.js)下载到本地(在页面上右击,在弹出的快捷菜单中选择另存为),编写本书时,最新版本是4.0.13。然后,在界面文件中引入vue-router.global.js库,示例代码如下。

<script src="js/vue-router.global.js"></script>

10.2.2 CDN方法

在界面文件中可通过CDNContent Delivery Network,内容分发网络)引入最新版本的Vue Router库,示例代码如下。

<script src="https://unpkg.com/vue-router@next"></script>

对于生产环境,建议使用固定版本,以免因版本不同带来兼容性问题,示例代码如下。

<script src="https://unpkg.com/vue-router@4.0.13/dist/vue-router.global.js"></script>

10.2.3 NPM方法

在使用Vue.js构建大型应用时推荐使用NPM安装最新稳定版的Vue Router,因为NPM能很好地和webpack模块打包器配合使用,示例如下。

npm install vue-router@next

10.2.4 命令行工具(Vue CLI)方法

为提高单页面应用程序的开发效率,我们现在开始使用Vue CLIVue 脚手架)搭建Vue.js项目。

Vue CLI是一个基于Vue.js进行快速开发的完整系统,提供如下功能。

l  通过@vue/cli实现交互式项目脚手架;

l  通过@vue/cli + @vue/cli-service-global实现零配置原型开发;

l  一个运行时依赖@vue/cli-service,该依赖可升级,基于webpack构建,并带有合理的默认配置;可通过项目的配置文件进行配置;可通过插件进行扩展;

l  一个丰富的官方插件集合,集成了前端生态工具;

l  提供一套创建和管理Vue.js项目的用户界面。

Vue CLI 致力于将Vue.js生态工具基础标准化。确保各种构建工具平稳衔接,让开发者专注在撰写应用上,而不必纠结配置的问题。

1.全局安装Vue CLI

打开cmd命令行窗口,输入命令npm install -g @vue/cli全局安装Vue脚手架,输入命令vue --version查看版本(测试是否安装成功)。如果需要升级全局Vue CLI,在cmd命令行窗口运行npm update -g @vue/cli命令即可。

2.打开图形化界面

安装成功后,在命令行窗口,继续输入命令vue ui打开一个浏览器窗口,并以图形化界面引导至项目创建的流程。

3.创建项目--创建项目界面        

4.使用VSCode打开项目

使用VSCode打开(File —> Open Folder,选择项目目录)第3步创建的项目router-demo。打开后,在Terminal终端输入npm run serve命令启动服务。

5.运行项目

在浏览器地址栏中,访问http://localhost:8080/即可运行项目router-demo。通过http://localhost:8080/访问时,打开的页面是public目录下的index.htmlindex.html是一个普通的html文件,让它与众不同的是“<div id="app"></div>这句程序,下面有一行注释,构建的文件将会被自动注入,也就是说我们编写的其他的内容都将在这个div中展示。另外,整个项目只有这一个html文件,所以这是一个单页面应用,当我们打开这个应用,表面上可以看到很多页面,实际上它们都在这一个div中显示。

main.js中,创建了一个Vue对象。该Vue对象的挂载目标是“#app”(与index.html中的id="app"对应);router代表该对象包含Vue Router,并使用项目中定义的路由(在src/router目录下的index.js文件里定义)。

10.3 Vue Router的基本用法

使用Vue Router动态加载不同组件时,需要将组件(Components)映射到路由(Routers),然后告诉Vue Router在哪里显示它们。

vue-router 是 vue.js 官方给出的路由解决方案。它只能结合 vue 项目进行使用,能够轻松的管理 SPA 项目中组件的切换。

10.3.1 路由安装

① 安装 vue-router 包

npm install vue-router@4

② 创建路由模块(vue3.0)

 在 src 源代码目录下,新建 router/index.js 路由模块,并初始化如下的代码:

import { createRouter, createWebHistory } from 'vue-router'
//导入组件
import SecondView from '../views/SecondView.vue'
import ThirdView from '../views/ThirdView.vue'
//定义路由
const routes = [{path: '/first',name: 'first',//导入组件component: () => import('../views/FirstView.vue')},{path: '/second/:uname/:pwd',name: 'second',//导入组件component: SecondView},{path: '/third/:uname/post/:pwd/post/:age',name: 'third',//导入组件component: ThirdView}
] 
//创建路由实例router(管理路由),传入routes配置
const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes
})
export default router

③ 导入并挂载路由模块

在 src/main.js 入口文件中,导入并挂载路由模块。示例代码如下:

import './assets/main.css'
// import Vue from 'vue'
// import App from './App.vue'
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
const app = createApp(App)
app.use(router)
app.mount('#app')

④ 声明路由链接和占位符

在 src/App.vue 组件中,使用 vue-router 提供的 <router-link> 和 <router-view> 声明路由链接和占位符:

<template><nav><router-link to="/first?uname=chenheng&pwd=123456">第一个页面</router-link> |<router-link to="/second/chenheng1/654321">第二个页面</router-link>|<router-link to="/third/:张三/post/:654321/post/:18">第三个页面</router-link></nav><!--router-view表示路由出口,将匹配到的组件(相当于链接的页面)渲染在这里。 --><router-view/>
</template><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;
}
nav {padding: 30px;
}
nav a {font-weight: bold;color: #2c3e50;
}
nav a.router-link-exact-active {color: #42b983;
}
</style>

10.3.2 跳转与传参

Vue Router有两种跳转,第一种是使用内置的<router-link>组件,默认渲染一个<a>标签,示例代码如下。

<router-link>组件与一般组件一样,to是一个prop,指定跳转的路径。使用<router-link>组件,在HTML5History模式下将拦截点击,避免浏览器重新加载页面。

Vue Router的第二种跳转方式需要在JavaScript里进行,类似于window.location.href。这种方式需要使用router实例方法pushreplace

Vue Router的第二种跳转方式需要在JavaScript里进行,类似于window.location.href。这种方式需要使用router实例方法push或replace。
<template><div>第一个页面</div><button @click="goto">去第二个页面</button>
</template>
<script>
export default {methods: {goto () {// 也可以使用replace方法,与replace属性一样不会向history添加新记录this.$router.push('/MView2')}}
}

路由传参,一般有两种方式:queryparams。不管哪种方式都可以是通过修改URL来实现。

1query传参

query传递参数的示例代码如下:

<router-link to="/?id=888&pwd=999">

通过$route.query获取路由中的参数,示例代码如下:

<h4>id{{$route.query.id}}</h4>

<h4>pwd{{$route.query.pwd}}</h4>

2params传参

在路由规则中定义参数,修改路由规则的path属性(动态匹配),示例代码如下。

{

    path: '/:id/:pwd',

    name: 'MView1',

    component: MView1

}

<router-link to="/888/999">

通过$route.params获取路由中的参数,示例代码如下:

<h4>id{{$route.params.id}}</h4>

<h4>pwd{{$route.params.pwd}}</h4>

10.3.3 配置路由

路由配置,通常在前端工程项目的src/router/index.js文件中进行。首先,需要在前端工程项目的src/main.jssrc/router/index.js文件中,分别导入vuevue-router模块,并在main.js中执行use方法注册路由。

10.4 Vue Router高级应用

10.4.1 动态路由匹配

 如果有多个参数,即多个冒号,则$route.params中保存为对象。例如,路由路径path/user/:uname/:pwd,则对应的访问路径为/user/zhangsan/123456$route.params中的对象为{ uname: 'zhangsan', pwd: '123456'}。另外,也可以使用post进行多个动态参数传递,例如,路由路径path/user/:uname/post/:pwd/post/:age,则对应的访问路径为/user/:lisi/post/:654321/post/:18$route.params中的对象为{ uname: 'lisi', pwd: '123456', age: '18'}

$route路由信息对象表示当前激活的路由状态信息,每次成功导航后都将产生一个新的对象。除了$route.params外,$route对象还提供其他许多有用的信息

序  号

属 性 名 称

  

1

$route.path

对应当前路由的路径,如/third/:张三/post/:654321/post/:18

2

$route.params

一个key:value对象,包含了所有动态参数,如果没有参数,则是一个空对象,如{ "uname": ":张三", "pwd": ":654321", "age": ":18" }

3

$route.query

一个key:value对象,表示URL查询参数。例如,/first?uname=chenheng&pwd=123456,则有$route.query.unamechenheng。如果没有查询参数,则是空对象

4

$route.hash

当前路由的哈希值(不带#),如果没有哈希值,则为空字符串

5

$route.fullPath

完成解析后的URL,包含查询参数和哈希的完整路径

6

$route.matched

返回数组,包含当前匹配的路径中包含的所有片段所对应的配置

7

$route.name

当前路径名称

8

$route.meta

路由元信息

10.4.2 嵌套路由

嵌套路由,即路由的多层嵌套,也称为子路由。在实际应用中,嵌套路由相当于多级菜单,一级菜单下有二级菜单,二级菜单下有三级菜单,等等。

首先,在根组件App.vue中定义基础路由(相当于一级菜单)导航;其次,定义基础路由对应的组件;最后,完成所有嵌套路由组件的定义,并在router/index.js文件中定义嵌套路由。

如果'vue-cli-service' 不是内部或外部命令,也不是可运行的程序

npm install -g@vue/cli

 

详细代码:

代码目录

main.js

//main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'createApp(App).use(router).mount('#app')

 router/index.js

//router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
import ProductView from '../views/ProductView.vue'const routes = [{path: '/',name: 'home',component: HomeView},{path: '/about',name: 'about',component: () => import('../views/AboutView.vue')},{path: '/product',name: 'product',component: ProductView,children:[//子路由{path: '',  //空子路由为基础路由的默认显示component: () => import('../views/AlldevView.vue')},{path: 'alldev',  //注意这里没有'/'component: () => import('../views/AlldevView.vue')},{path: 'JavaEE',component: () => import('../views/JavaEEView.vue')},{path: 'SpringBoot',component: () => import('../views/SpringBoot.vue')}]}
]const router = createRouter({history: createWebHistory(process.env.BASE_URL),routes
})export default router

 app.vue

//app.vue
<template><h1>嵌套路由</h1><nav><router-link to="/">首页</router-link> |<router-link to="/about">关于我们</router-link> |<router-link to="/product">产品介绍</router-link></nav><router-view class="my-view"> </router-view>
</template><style>#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;}nav {padding: 30px;}nav a {font-weight: bold;color: #2c3e50;}nav a.router-link-exact-active {color: #42b983;}.my-view {width: 500px;margin: 0 auto;text-indent: 2em;text-align: left;padding: 5px 10px;border: 1px dashed #42b983;}
</style>

 alldevView.vue

<template><div><img alt="alldev" src="../images/091883-all.jpg" width="200" height="300"></div>
</template>

 JavaEEView.vue

<template><div><img alt="javaee" src="../images/079720-javaee.jpg" width="200" height="300"></div>
</template>

ProductView.vue 

<template><div><p><!--定义嵌套路由--><router-link to="/product/alldev">全栈开发</router-link> |<router-link to="/product/JavaEE">Java EE整合开发</router-link> |<router-link to="/product/SpringBoot">Spring Boot开发</router-link></p><router-view/></div>
</template>
<style scoped>p a {text-decoration: none;}
</style>

 SpringBoot.vue

<template><div><img alt="springboot" src="../images/083960-springboot.jpg" width="200" height="300"></div>
</template>

 10.4.3 编程式导航

除了使用内置的<router-link>组件,渲染一个<a>标签定义导航链接外,还可以通过编程调用路由(routerthis.$router)的实例方法实现导航链接。

前一步

   go1(){this.$router.forward()},

 后退一步

    back1(){this.$router.back()},

 回首页

    goHome(){this.$router.push('/') //字符串路由path},

看产品介绍

    goProduct(){this.$router.push({ //对象path: '/product'})},

 代替关于我们

    repAbout(){this.$router.replace({name: 'home', //命名路由params:{uname:'123', pwd:'abc'} //传参})}

 

  

方 法 名 称

功 能 说 明

1

push()

跳转到由参数指定的新路由地址,在历史记录中添加一条新记录

2

replace()

跳转到由参数指定的新路由地址,替换当前的历史记录

3

go(n)

n为整数,在历史记录中向前或后退n

4

forward()

在历史记录中向前一步,相当于this.$router.go(1)

5

back()

在历史记录中后退一步,相当于this.$router.go(-1)

push()方法和replace()方法的用法相似,唯一不同的是push()方法在历史记录中添加一条新记录,replace()方法不会添加新记录,而是替换当前记录。点击返回,会跳转到上上一个页面。

上面这个小视频的看产品介绍是push模式,看产品介绍1是replace模式,我们点返回的时候,看出来两个返回是不一样的,一个是上一步,一个调回到百度首页。

push()方法和replace()方法的参数可以是字符串、对象、命名路由、带查询参数等多种形式,示例如下。

//字符串路由path

this.$router.push('/') 

//对象

this.$router.push({path: '/product'})

//命名路由及params传参,params更像post,是隐性传参

this.$router.push({name: 'home', params:{uname:'123', pwd:'abc'} })

//带查询参数,/product?uname=123&pwd=abc,更像get传参,是显性传参

this.$router.push({path: '/product', query:{uname:'123', pwd:'abc'} })

this.$router.push({name: 'home', state:{uname:'123', pwd:'abc'} })

home对应的页面可以使用history.state接收数据。

10.4.4 命名路由

{

    path: '/',

    name: 'home',

    component: HomeView

}

<router-link :to="{name: 'home', params: {uname: '123', pwd: 'abc'}}">首页</router-link>

与编程式导航this.$router.push({name: 'home', params:{uname:'123', pwd:'abc'} })功能相同。

10.4.5 重定向

10.4.6 路由组件props传参

10.4.7 HTML5 历史记录模式

对比hash 模式history 模式
url 显示url 中带"#"url 中不带"#"
回车刷新(浏览器刷新按钮)页面正常显示后端未配置则页面显示404
支持版本支持低版本浏览器和 IE 浏览器HTML5 新推出的 API

代码对比

 10.5 路由钩子函数

10.5.1 全局前置钩子函数

Vue Router中,使用router.beforeEach注册一个全局前置钩子函数(在路由跳转前执行),注册示例代码如下。

router.beforeEach(async (to, from) => {

     //ES7标准中新增了asyncawait关键字,作为处理异步请求的一种解决方案

if (

     // 检查用户是否已登录

     !isAuthenticated &&

     // 避免无限重定向

     to.name !== 'Login'

   ) {

     // 将用户重定向到登录页面

     return { name: 'Login' }

   }

 })

10.5.2 全局解析钩子函数

Vue Router中,使用router.beforeResolve注册一个全局解析钩子函数。与router.beforeEach 类似,在每次导航时都会触发,但是确保在导航被确认之前,同时在所有组件内钩子函数和异步路由组件被解析之后,解析钩子函数就被正确调用。

router.beforeResolve(async to => {

  if (to.meta.requiresCamera) {

    try {

      await askForCameraPermission()

    } catch (error) {

      if (error instanceof NotAllowedError) {

        // ... 处理错误,然后取消导航

        return false

      } else {

        //意料之外的错误,取消导航并把错误传给全局处理器

        throw error

      }

    }

  }

})

10.5.3 全局后置钩子函数

Vue Router中,也可以使用router.afterEach注册全局后置钩子函数,该钩子函数不接收next参数,也不会改变导航本身,在跳转之后判断。对于分析、更改页面标题、声明页面等辅助功能都很有用。示例代码如下。

router.afterEach((to, from) => {

  // ...

})

10.5.4 某个路由的钩子函数

10.5.5 组件内的钩子函数

const UserDetails = {

  template: `...`,

  beforeRouteEnter(to, from) {

    // 在渲染该组件的对应路由被验证前调用,不能获取组件实例 `this` !因为当该钩子函数执行时,组件实例还没被创建!

  },

  beforeRouteUpdate(to, from) {

    // 在当前路由改变,但是该组件被复用时调用。举例来说,对于一个带有动态参数的路径`/users/:id`,在`/users/1``/users/2`之间跳转的时候,由于渲染同样的`UserDetails` 组件,因此组件实例会被复用,此钩子函数在此情况下也被调用。因为在这种情况发生的时候,组件已经挂载好了,该钩子函数可以访问组件实例 `this`

  },

  beforeRouteLeave(to, from) {

    // 在导航离开渲染该组件的对应路由时调用与 `beforeRouteUpdate` 一样,它可以访问组件实例 `this`

  },

}

10.6 路由元信息

有时,可能希望将任意信息附加到路由上,如过渡名称、访问路由权限等。这些工作可以通过接收属性对象的meta属性来实现,并且它可以在路由地址和导航守卫(路由钩子函数)中都能被访问到。

下面我们用一个完整的例子把路由守卫说明白,首先了解路由守卫是干什么的,就如下这个例子,我开始点击home的页签,系统提示我没有登录,然后页面切入到登录的页面,这是一个很常见的拦截器的功能,就是判断是否有登录,在vue我们就用路由守卫干这件事,所以路由守卫其实简单理解就是拦截器。这个最重要的就是router.beforeEach,代码是写在main.JS中

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java并发中的CAS机制:原理、应用与挑战(通俗易懂版)

上一期文章内容&#xff1a;Java并发中的乐观锁与悲观锁&#xff0c; 本期文章我们来讲一下Java并发中的CAS机制 一、从银行账户案例理解CAS CAS 是一种乐观锁机制&#xff0c;用于在不使用锁的情况下实现多线程对共享资源的并发访问。 它包含三个操作数&#xff1a;内存位置&a…

SpringBoot自动配置-以Mybatis配置为例

SpringBoot自动配置 无基础的直接看链接内容&#xff0c;有基础就直接顺着往下看就可以 Spring底层&#xff08;自动配置&#xff09; 自动配置就是EnableXXX封装Improt&#xff08;ImportSelector的实现类&#xff09;对应方法selectImoprt返回字符串数组为类名会注册为bean…

2025 docker可视化管理面板DPanel的安装

1.什么是 DPanel &#xff1f; DPanel 是一款 Docker 可视化管理面板&#xff0c;旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能&#xff0c;使用户能够更轻松地管理和部署 Docker 环境。 软件特点&#xff1a; 可视化管理&#xff1a;提供直观的用户界面&#…

DeepSeek从入门到精通(清华大学)

​ DeepSeek是一款融合自然语言处理与深度学习技术的全能型AI助手&#xff0c;具备知识问答、数据分析、编程辅助、创意生成等多项核心能力。作为多模态智能系统&#xff0c;它不仅支持文本交互&#xff0c;还可处理文件、图像、代码等多种格式输入&#xff0c;其知识库更新至2…

Word 里面嵌入DeepSeek

目录 一、问题描述 二、解决方法 三、代码 四、注意事项 五、总结 一、问题描述 如何在Word里面嵌入DeepSeek? 二、解决方法 1、新建文档&#xff0c;按 AltF11&#xff0c;进入VB界面。 2、选中文档&#xff0c;右键->插入->模块。 3、进入模块&#xff0c;粘入…

java面试题-集合篇

Collection 1.Collection有哪些类&#xff1f; Java集合框架中的Collection接口是所有集合类的基础接口&#xff0c;定义了一些基本的集合操作&#xff0c;如添加元素、删除元素、判断是否包含某个元素等。常见的集合类包括List、Set和Queue。 List List接口定义了按照索引…

国内 网络安全沙箱

CSRF攻击 CSRF攻击概述&#xff1a; CSRF&#xff08;Cross Site Request Forgery, 跨站域请求伪造&#xff09;是一种网络的攻击方式&#xff0c;它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患&#xff0c;比如 SQL 脚本注入&#xff0c;跨站域脚本攻击等在近…

Web3 的虚实融合之路:从虚拟交互到元宇宙构建

在这个数字技术日新月异的时代&#xff0c;我们正站在 Web3 的门槛上&#xff0c;见证着互联网的又一次革命。Web3 不仅仅是技术的迭代&#xff0c;它代表了一种全新的交互方式和价值创造模式。本文将探讨 Web3 如何推动虚拟交互的发展&#xff0c;并最终实现元宇宙的构建&…

项目中菜单按照层级展示sql

效果如图&#xff1a; 直接上脚本 查四级菜单 select EFT_FLAG,MENU_ID, CASE LEN(MENU_LVL)WHEN 4THEN MENU_NAME ELSE - END AS MENU_NAME1, CASE LEN(MENU_LVL)WHEN 8THEN MENU_NAME ELSE - END AS MENU_NAME2, CASE LEN(MENU_LVL)WHEN 12THEN MENU_NAME ELSE - END …

Reasoning in High Gear 推理加速发展

Reasoning in High Gear 推理加速发展 关键信息&#xff1a;OpenAI推出GPT - 3 - mini&#xff0c;它是GPT - 1模型后续版本&#xff0c;在速度、成本及特定领域能力上有显著优势。 模型特性 推理强度可选&#xff1a;提供低、中、高三个推理 “强度” 级别&#xff0c;不同级别…

Linux驱动层学习:LED 驱动开发

前置知识&#xff1a; 1、地址映射 MMU 全称叫做 Memory Manage Unit&#xff0c;也就是内存管理单元。 MMU 主要完成的功能如下&#xff1a; ①、完成虚拟空间到物理空间的映射。 ②、内存保护&#xff0c;设置存储器的访问权限&#xff0c;设置虚拟存储空间的缓冲特性。 第…

数据挖掘智能Agent

&#x1f917; CodeGenie - 智能编程助手 数据处理和分析对于数据分析工作人员来说&#xff0c;往往既复杂又令人头疼&#xff0c;需要耗费大量精力进行重复性工作。为了解决这一问题&#xff0c;我们开发了一款集成了自然语言处理和代码生成功能的智能编程助手——CodeGenie。…

【C++】Vector容器

为什么要学习vector&#xff1f; 1. 上一章分享了string&#xff0c;而string实际上是一个管理字符的顺序表。 2. 而除了字符以外&#xff0c;我们经常用到整形数组&#xff0c;所以我们需要针对其他类型数据的顺序表。 3. vector实际上也是一个顺序表&#xff0c;而且主要用来…

国内 ChatGPT Plus/Pro 订阅教程

1. 登录 chat.openai.com 依次点击 Login &#xff0c;输入邮箱和密码 2. 点击升级 Upgrade 登录自己的 OpenAI 帐户后&#xff0c;点击左下角的 Upgrade to Plus&#xff0c;在弹窗中选择 Upgrade plan。 如果升级入口无法点击&#xff0c;那就访问这个网址&#xff0c;htt…

Winform禁止高分辨下缩放布局成功方法

Windows自动缩放布局会导致窗体上的按钮和文本挤在一起根本看不清楚。 那么该如何解决呢&#xff1f; 具体操作步骤如下&#xff1a; 1、在项目属性上切换到【安全性】菜单&#xff0c;勾选【启用ClickOnce安全设置】&#xff0c;然后立刻取消勾选&#xff1b; 为了生成app.…

数据结构——Makefile、算法、排序(2025.2.13)

目录 一、Makefile 1.功能 2.基本语法和相关操作 &#xff08;1&#xff09;创建Makefile文件 &#xff08;2&#xff09;编译规则 &#xff08;3&#xff09;编译 &#xff08;4&#xff09;变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 &#xff…

Xcode证书密钥导入

证书干嘛用 渠道定期会给xcode证书&#xff0c;用来给ios打包用&#xff0c;证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中&#xff0c;选择系统。(选登录也行&#xff0c;反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥&#xff…

span标签 鼠标移入提示框 el-tooltip element-ui

<el-tooltip :content"item.value" placement"top"><span>{{ item.valueHidden }}</span></el-tooltip>

[创业之路-300]:进一步理解货币与金钱, 货币与货币政策

目录 一、货币 1.1 概述 1、货币的定义 2、货币的形态演变 3、货币的职能 4、货币的价值衡量 1.2 货币的分层 1、货币分层的目的与意义 2、货币分层的划分标准与层次 3、各国货币分层的实践 4、货币分层的影响与应用 1.3、M0、M1、M2变化对股市的影响 1、M0变化对…

pnpm的使用

pnpm的使用 1.安装和使用2.统一包管理工具下载依赖 1.安装和使用 pnpm:performant npm &#xff0c;意味“高性能的npm”。 pnpm由npm/yarn衍生而来,解决了npm/yarn内部潜在的bug,极大的优化了性能,扩展了使用场景。被誉为“最先进的包管理工具”。 pnpm安装指令: npm i -g p…