走进Vue【三】vue-router详解
目录
- 🌟前言
- 🌟路由
- 🌟什么是前端路由?
- 🌟前端路由优点缺点
- 🌟vue-router
- 🌟安装
- 🌟路由初体验
- 1.路由组件
- router-link
- router-view
- 2.步骤
- 1. 定义路由组件
- 2. 定义路由
- 3. 创建 router 实例
- 4. 挂载实例
- 合并
- 🌟动态路由匹配
- 1.匹配优先级
- 2.路由信息对象属性
- 🌟嵌套路由
- 1. 组件内部使用标签
- 2. 在路由器对象中给组件定义子路由
- 🌟命名路由
- 🌟路由重定向/别名
- 1.重定向
- 2.别名
- 🌟编程式的导航
- 1.router.push
- 2.router.replace
- 3.router.go
- 4.操作 History
- 🌟写在最后
- 🌟JSON包里写函数,关注博主不迷路
🌟前言
哈喽小伙伴们,上一期给大家结合Vue、Element-Plus以及Canvas实现了一个简易的画板功能,私下也收到了好多小伙伴的私信和评论;小伙伴们都觉得挺好玩的自己也进行了尝试,和大家一起共同学习进步真的很开心。今天博主继续咱们之前的走进Vue,来说一下vue-router的一些知识;一起来看下吧。
🌟路由
随着前端应用的业务功能越来越复杂、用户对于使用体验的要求越来越高,单页应用(SPA)成为前端应用的主流形式。大型单页应用最显著特点之一就是采用前端路由系统,通过改变URL,在不重新请求页面的情况下,更新页面视图。
🌟什么是前端路由?
前端路由就是SPA(单页应用)的路径管理器。
随着 ajax 的流行,异步数据请求交互运行在不刷新浏览器的情况下进行。而异步交互体验的更高级版本就是 SPA —— 单页应用。单页应用不仅仅是在页面交互是无刷新的,连页面跳转都是无刷新的,为了实现这种交互体验,所以就有了前端路由。
类似于服务端路由,前端路由实现起来其实也很简单,就是匹配不同的 url 路径,进行解析,然后动态的渲染出区域 html 内容。但是这样存在一个问题,就是 url 每次变化的时候,都会造成页面的刷新。那解决问题的思路便是在改变 url 的情况下,保证页面的不刷新。
“更新视图但不重新请求页面” 是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有两种方式:
- 基于URL中的hash(“#”)实现
- 基于HTML5 History中新增的方法实现
在单页面应用程序,只有一个完整的页面;它在加载页面时,不会加载整个页面,而是只更新某个指定的容器中内容。单页面应用(SPA)的核心之一是: 更新视图而不重新请求页面。
vue-router在实现单页面前端路由时,提供了两种方式:Hash模式和History模式;根据mode参数来决定采用哪一种方式。
🌟前端路由优点缺点
优点:
1. 良好的前后端分离。SPA和RESTful架构一起使用,后端不再负责模板渲染、输出页面工作,web前端和各种移动终端地位对等,后端API通用化。
2. 用户体验好、快,内容的改变不需要重新加载整个页面,快速展现给用户
3. 同一套后端程序代码,不用修改就可以用于Web界面、手机、平板、等多种客户端
缺点:
1. 不利于SEO
2. 使用浏览器的前进,后退键的时候回重新发送请求,没有合理的利用缓存
3. 单页面无法记住之前滚动的位置,无法在前进,后退的时候记住滚动位置
🌟vue-router
- vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。 vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。
- 传统的页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。
名称 | 地址 |
---|---|
Vue-router文档 | Vue-router文档 |
🌟安装
- 直接下载 / CDN引入
- 点击打开vue-router文件,下载到本地
- Unpkg.com 提供了基于 npm 的 CDN 链接。上述链接将始终指向 npm 上的最新版本。 你也可以通过像 https://unpkg.com/vue-router@4.0.15/dist/vue-router.global.js 这样的 URL 来使用特定的版本或 Tag。
- 在 Vue 后面加载 vue-router,它会自动安装的:
<script src="/path/to/vue.js"></script><script src="/path/to/vue-router.js"></script>
- NPM
-
npm install vue-router@4##yarn add vue-router@4
-
🌟路由初体验
用 Vue.js + Vue Router 创建单页应用,是非常简单的。使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 Vue Router 添加进来,我们需要做的是,将组件 (components)
映射到路由 (routes),然后告诉 Vue Router 在哪里渲染它们。
1.路由组件
router-link
router-link
标签用来进行来导航,通过传入to
属性指定链接<router-link>
默认会被渲染成一个<a>
标签
<div id="app"><router-link to="/Home">Go to Home</router-link><router-link to="/About">Go to About</router-link>
</div>
router-view
- 路由出口,路由匹配到的组件将渲染在该标签中
<div id="app"><router-link to="/Home">Go to Home</router-link><router-link to="/About">Go to About</router-link><router-view></router-view>
</div>
2.步骤
1. 定义路由组件
可以从其他文件 import 进来
const Home = { template: '<div>Home</div>' }
const About = { template: '<div>About</div>' }
2. 定义路由
映射路由,每个路由对应一个组件。 其中"component" 可以是通过 Vue.extend() 创建的组件构造器,或者,只是一个组件配置对象。
const routes = [{ path: '/home', component: Home },{ path: '/about', component: About }
]
3. 创建 router 实例
创建router
实例,将定义好的路由routers传入。
const router = new VueRouter({routers:routers
})
4. 挂载实例
通过VUe实例的 router
属性将路由注入,整个实例中就有了路由功能。
new Vue({router
}).$mount('#app')
合并
const Home = { template: '<div>Home</div>' }
const About = { template: '<div>About</div>' }const router = new VueRouter({routes:[{path: '/Home',component: { template: '<div>Home</div>' }},{path: '/About',component: { template: '<div>About</div>' }}]
})
new Vue({router
}).$mount('#app')
要注意,当 <router-link>
对应的路由匹配成功,将自动设置 class 属性值 .router-link-active
。
<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>路由</title><link rel="stylesheet" href="../bootstrap.min.css"><script src="../vue.js"></script><script src="../vue-router.js"></script>
</head>
<body>
<div id="app"><div><ul class="nav nav-pills nav-justified"><li><router-link to="/">首页</router-link><router-link to="/list">列表</router-link><router-link to="/show">详情</router-link></li></ul><div>//页面展示区域<router-view></router-view></div></div>
</div>
<script>/*** 单页面 vue+vueRouter* 一个HTML+若干组件(页面组件)* VueRouter* 1.组件he路径对应* 2.组件现实的位置*///1.定义页面组件const index = {template:"<div> <h1>Hello Index</h1> </div>"}const list = {template:"<div> <h1>Hello list</h1> </div>>"}const show = {template:"<div> <h1>Hello show</h1> </div>>"}//2.组件和路由(路径)映射const routes = [{path:'/',component:index},{path:'/list',component:list},{path:'/show',component:show}]//3.创建路由实例const router = new VueRouter({routes})//4.创建Vue实例,并挂在路由new Vue({el:"#app",router,data:{}})
</script>
</body>
</html>
🌟动态路由匹配
我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件。例如,我们有一个 Type 组件,对于所有 信息 各不相同的页面,都要使用这个组件来渲染。那么,我们可以在 vue-router 的路由路径中使用『动态路径参数』来达到这个效果:
const Type = {template: '<div>Type</div>'
}
const router = new VueRouter({routes: [// 动态路径参数 以冒号开头{ path: '/main/:id', component: Type }]
})
现在,像 /main/Home
和 /main/About
都将映射到相同的路由。
一个『路径参数』使用冒号 : 标记。当匹配到一个路由时,参数值会被设置到 this.$route.params
,可以在每个组件内使用。于是,我们可以更新模板,输出当前页面的 ID:
const Type = {template: '<div>Type {{ $route.params.id }}</div>'
}
你可以在一个路由中设置多段『路径参数』,对应的值都会设置到 $route.params 中。例如:
模式 | 匹配路径 | $route.params |
---|---|---|
/user/:username | /user/evan | { username: ‘evan’ } |
/user/:username/post/:post_id | /user/evan/post/123 | { username: ‘evan’, post_id: 123 } |
应用动态路由匹配后的代码:
<body><router-link to="/main/home">Home</router-link><router-link to="/main/type">About</router-link>
</body>
<template id="type"><div>Type {{$route.params.id}}</div>
</template>
const router = new VueRouter({routes:[{path: '/main/:id',component: { template: '#type' }}]
})
new Vue({el:"#app",router:router
})
1.匹配优先级
有时候,同一个路径可以匹配多个路由,此时,匹配的优先级就按照路由的定义顺序:谁先定义的,谁的优先级就最高。
2.路由信息对象属性
属性 | 类型 | 说明 |
---|---|---|
$route.path | string | 字符串,对应当前路由的路径,总是解析为绝对路径,如 /main/Home 。 |
$route.params | Object | 一个 key/value 对象,包含了 动态片段 和 全匹配片段,如果没有路由参数,就是一个空对象。 |
$route.query | Object | 一个 key/value 对象,表示 URL 查询参数。例如,对于路径 /main?user=1 ,则有 $route.query.user == 1 ,如果没有查询参数,则是个空对象。 |
$route.hash | string | 当前路由的 hash 值 (带 #) ,如果没有 hash 值,则为空字符串。 |
$route.fullPath | string | 完成解析后的 URL,包含查询参数和 hash 的完整路径。 |
$route.matched | Array | 一个数组,包含当前路由的所有嵌套路径片段的路由记录 。路由记录就是 routes 配置数组中的对象副本 (还有在 children 数组)。 |
$route.name | string | 当前路由的名称,如果有的话。 |
$route.meta | Object | 给当前路由添加的一些数据。 |
测试路由对象属性:
<div><p>当前路径:{{$route.path}}</p><p>当前参数:{{$route.params}}</p><p>路由名称:{{$route.name}}</p><p>路由查询参数:{{$route.query}}</p><p>路由匹配项:{{$route.matched}}</p>
</div>
🌟嵌套路由
在实际开发中,通常由多层嵌套的组件组合而成
嵌套路由是个常见的需求,假设用户能够通过路径/home/news
和/home/message
访问一些内容,一个路径映射一个组件,访问这两个路径也会分别渲染两个组件。
实现嵌套路由有两个要点:
- 在组件内部使用标签
- 在路由器对象中给组件定义子路由
1. 组件内部使用标签
<template id="home"><div><h1>动态路由1{{$route.params.id}}</h1><router-link to="/home/news">child1</router-link><router-link to="/home/message">child2</router-link><router-view></router-view></div>
</template>
当调用该组件时,会显示组件当中的 <router-link>
。
点击组件内的<router-link>
会将路由匹配到的组件渲染到 <router-view>
中
2. 在路由器对象中给组件定义子路由
const router = new VueRouter({routes:[{path: '/home',component: { template: '#home' } ,children:[{ // 当 /home/news 匹配成功,// <h3>news</h3> 会被渲染在 #home 的 <router-view> 中path: 'news',component: { template: '<h3>news</h3>' }},{path: 'message',component: { template: '<h3>message</h3>' }}]},{path: '/about',component: { template: '#about' }}]
})
在 /home
路由下定义了一个 children
选项,/news
和 /message
是两条子路由,它们分别表示路径 /home/news
和 /home/message
,这两条路由分别映射组件 <h3>news</h3>
和 <h3>message</h3>
。
要注意,以 /
开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径。
此时,基于上面的配置,当你访问 /home
时,#home
的出口是不会渲染任何东西,这是因为没有匹配到合适的子路由。如果你想要渲染点什么,可以提供一个 空的 子路由:
const router = new VueRouter({routes:[{path: '/home',component: { template: '#home' } ,children:[{ // 当 /home 匹配成功,// <h3>news</h3> 会被渲染在 #home 的 <router-view> 中path: '',component: { template: '<h3>news</h3>' }},// ...其他子路有]})
🌟命名路由
在有些情况下,给一条路径加上一个名字能够让我们更方便地进行路径的跳转,尤其是在路径较长的时候。
const router = new VueRouter({routes:[{path: '/home',component: { template: '#home' } ,children:[{ path: 'news',name:'one', // 为该路径/home/news命名为 onecomponent: { template: '<h2>news</h2>' }},{path: 'message',name:'two', // 为该路径/home/message命名为 twocomponent: { template: '<h2>message</h2>' }}]}
})
要链接到一个命名路由,可以给 router-link
的 to
属性传一个对象(传值需要使用属性绑定 V-bind):
<router-link :to="{name:'one'}">child0</router-link>
to
属性传入的对象,除了有 name
属性,还可以传入params
等:
<router-link :to="{ name: 'user', params: { id: 122 }}">User</router-link>
🌟路由重定向/别名
1.重定向
『重定向』的意思是,当用户访问 /a
时,URL 将会被替换成 /b
,然后匹配路由为 /b
。
重定向也是通过 routes 配置来完成,下面例子是从 /a
重定向到 /b
:
const router = new VueRouter({routes: [{ path: '/a', redirect: '/b' }]
})
重定向的目标也可以是一个命名的路由:
const router = new VueRouter({routes: [{ path: '/a', redirect: { name: 'foo' }}]
})
甚至是一个方法,动态返回重定向目标:
const router = new VueRouter({routes: [{ path: '/a', redirect: to => {// 方法接收 目标路由 作为参数// return 重定向的 字符串路径/路径对象}}]
})
2.别名
/a
的别名是 /b
,意味着,当用户访问 /b
时,URL 会保持为 /b
,但是路由匹配则为 /a
,就像用户访问 /a
一样。
const router = new VueRouter({routes: [{ path: '/a', component: A, alias: '/b' }]
})
『别名』的功能让你可以自由地将 UI 结构映射到任意的 URL,而不是受限于配置的嵌套路由结构。
🌟编程式的导航
除了使用 <router-link>
创建 a 标签来定义导航链接,我们还可以借助 router
的实例方法,通过编写代码来实现。
1.router.push
router.push(location, onComplete?, onAbort?)
该方法的参数可以是一个字符串路径,或者一个描述地址的对象。例如:
// 字符串
router.push('home')// 对象
router.push({ path: 'home' })// 命名的路由
router.push({ name: 'user', params: { userId: 123 }})// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})
2.router.replace
router.replace(location, onComplete?, onAbort?)
跟 router.push 很像,唯一的不同就是,它不会向 history 添加新记录,而是跟它的方法名一样 —— 替换掉当前的 history 记录。
声明式 | 编程式 |
---|---|
<router-link :to="..." replace> | router.replace(...) |
3.router.go
router.go(n)
这个方法的参数是一个整数,意思是在 history 记录中向前或者后退多少步,类似 window.history.go(n)
。
例子
// 在浏览器记录中前进一步,等同于 history.forward()
router.go(1)// 后退一步记录,等同于 history.back()
router.go(-1)// 前进 3 步记录
router.go(3)// 如果 history 记录不够用,那就默默地失败呗
router.go(-100)
router.go(100)
4.操作 History
你也许注意到
router.push
、router.replace
和router.go
跟window.history.pushState
、window.history.replaceState
和
window.history.go
好像, 实际上它们确实是效仿window.history
API 的。
🌟写在最后
以上就是vue-router的一些基础知识,小伙伴们一定要记得去尝试哦,下篇给大家准备了路由守卫的讲解,敬请期待吧。喜欢的小伙伴们可以支持一下博主;你们的支持就是我创作的动力。各位小伙伴让我们 let’s be prepared at all times!
🌟JSON包里写函数,关注博主不迷路
✨原创不易,还希望各位大佬支持一下!
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/9fdf1b88b2992ec97434f82c4fa32d23.png)
走进Vue【三】vue-router详解
目录🌟前言🌟路由🌟什么是前端路由?🌟前端路由优点缺点🌟vue-router🌟安装🌟路由初体验1.路由组件router-linkrouter-view2.步骤1. 定义路由组件2. 定义路由3. 创建 router 实例4. 挂…...
![](https://img-blog.csdnimg.cn/10beb06b21424085847147ed2525c535.png)
html+css制作
<!DOCTYPE html> <html><head><meta charset"utf-8"><title>校园官网</title><style type"text/css">*{padding: 0;margin: 0;}#logo{width:30%;float: left;}.nav{width: 100%;height: 100px;background-color…...
![](https://www.ngui.cc/images/no-images.jpg)
Python实现rar、zip和7z文件的压缩和解压
一、7z压缩文件的压缩和解压 1、安装py7zr 我们要先安装py7zr第三方库: pip install py7zr如果python环境有问题,执行上面那一条安装语句老是安装在默认的python环境的话,我们可以执行下面这条语句,将第三方库安装在项目的虚拟…...
![](https://img-blog.csdnimg.cn/182a06eefb2748de9acbad4838029d7d.jpeg#pic_center)
从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala
从Hive源码解读大数据开发为什么可以脱离SQL、Java、Scala 前言 【本文适合有一定计算机基础/半年工作经验的读者食用。立个Flg,愿天下不再有肤浅的SQL Boy】 谈到大数据开发,占据绝大多数人口的就是SQL Boy,不接受反驳,毕竟大…...
![](https://img-blog.csdnimg.cn/223ad4f512784e21af7938af3993ee97.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP546L5pu-5piv5bCR5bm0,size_14,color_FFFFFF,t_70,g_se,x_16#pic_center)
RocketMQ 事务消息 原理及使用方法解析
🍊 Java学习:Java从入门到精通总结 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2023年3月24日 &#x…...
![](https://img-blog.csdnimg.cn/0fc52e80716941e39883a0f07379def2.gif)
为什么 ChatGPT 输出时经常会中断,需要输入“继续” 才可以继续输出?
作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐…...
![](https://img-blog.csdnimg.cn/b53e7b380d2d40cdaaf86f49dd7792a0.png)
PyTorch 之 基于经典网络架构训练图像分类模型
文章目录一、 模块简单介绍1. 数据预处理部分2. 网络模块设置3. 网络模型保存与测试二、数据读取与预处理操作1. 制作数据源2. 读取标签对应的实际名字3. 展示数据三、模型构建与实现1. 加载 models 中提供的模型,并且直接用训练的好权重当做初始化参数2. 参考 pyto…...
![](https://img-blog.csdnimg.cn/9baca07b7f8a4ea38cc2c6cce3f54f25.png)
Scrapy的callback进入不了回调方法
一、前言 有的时候,Scrapy的callback方法直接被略过了,不去执行其中的回调方法,可能排查好久都排查不出来,我来教大家集中解决方法。 yield Request(urlurl, callbackself.parse_detail, cb_kwargs{item: item})二、解决方法 1…...
![](https://img-blog.csdnimg.cn/img_convert/8013ccd04fe753aac638052f290273c0.jpeg)
第二十一天 数据库开发-MySQL
目录 数据库开发-MySQL 前言 1. MySQL概述 1.1 安装 1.2 数据模型 1.3 SQL介绍 1.4 项目开发流程 2. 数据库设计-DDL 2.1 数据库操作 2.2 图形化工具 2.3 表操作 3. 数据库操作-DML 3.1 增加(insert) 3.2 修改(update) 3.3 删除(delete) 数据库开发-MySQL 前言 …...
![](https://img-blog.csdnimg.cn/0d58f8f68de049578f0c9dbc99ecc06e.png)
蓝桥杯每日一真题—— [蓝桥杯 2021 省 AB2] 完全平方数(数论,质因数分解)
文章目录[蓝桥杯 2021 省 AB2] 完全平方数题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示思路:理论补充:完全平方数的一个性质:完全平方数的质因子的指数一定为偶数最终思路:小插曲&am…...
![](https://img-blog.csdnimg.cn/93fd6a9012b242e4b6fb83684b4ce88d.png)
Linux编辑器-vim
一、vim简述1)vi/vim2)检查vim是否安装2)如何用vim打开文件3)vim的几种模式命令模式插入模式末行模式可视化模式二、vim的基本操作1)进入vim(命令行模式)2)[命令行模式]切换至[插入模式]3)[插入模式]切换至[命令行模式]4)[命令行模…...
![](https://img-blog.csdnimg.cn/img_convert/59ceeb76bdd11156794475c5159f1470.jpeg)
5G将在五方面彻底改变制造业
想象一下这样一个未来,智能机器人通过在工厂车间重新配置自己,从多条生产线上组装产品。安全无人机处理着从监视入侵者到确认员工停车等繁琐的任务。自动驾驶汽车不仅可以在建筑物之间运输零部件,还可以在全国各地运输。工厂检查可以在千里之…...
![](https://www.ngui.cc/images/no-images.jpg)
http和https的区别?
http和https的区别?HTTPHTTPSHTTP与HTTPS区别HTTPS相比于HTTP协议的优点和缺点HTTP http是超文本传输协议 HTTP协议是基于传输层的TCP协议进行通信,通用无状态的协议。80端口 HTTPS https—安全的超文本传输协议 是以安全为目标的HTTP通道,…...
![](https://img-blog.csdnimg.cn/b992cc7067294b77b4420411b3d6e7d1.png)
【Spring Cloud Alibaba】4.创建服务消费者
文章目录简介开始搭建创建项目修改POM文件添加启动类添加配置项添加Controller添加配置文件启动项目测试访问Nacos访问接口查看端点检查简介 接下来我们创建一个服务消费者,本操作先要完成之前的步骤,详情请参照【Spring Cloud Alibaba】Spring Cloud A…...
![](https://img-blog.csdnimg.cn/cf214be6efa24ba8a7d92550aa1ec88b.png)
C语言——动态内存管理 malloc、calloc、realloc、free的使用
目录 一、为什么存在动态内存分配 二、动态内存函数的介绍 2.1malloc和free 2.2calloc 2.3realloc 三、常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟的内存使用free释放 3.4使用free释放一块动态开辟内存的一部分 3.5…...
![](https://img-blog.csdnimg.cn/202bf9370c0d4fad86b5131406be8072.png)
技术分享——Java8新特性
技术分享——Java8新特性1.背景2. 新特性主要内容3. Lambda表达式4. 四大内置核心函数式接口4.1 Consumer<T>消费型接口4.2 Supplier<T>供给型接口4.3 Function<T,R>函数型接口4.4 Predicate<T> 断定型接口5. Stream流操作5.1 什么是流以及流的类型5.2…...
![](https://www.ngui.cc/images/no-images.jpg)
vue基础知识大全
1,指令作用 以v-开头,由vue提供的attribute,为渲染DOM应用提供特殊的响应式行为,也即是在表达式的值发生变化的时候响应式的更新DOM。其内容为可以被求值的js代码,可以写在return后面被返回的表达式。 指令的简写指令简…...
![](https://img-blog.csdnimg.cn/b0f0bff7aca94ffbb7203bc01a43c374.png)
第2篇|文献研读|nature climate change|减缓气候变化和促进热带生物多样性的碳储量走廊
研究背景 从 2000 年到 2012 年,潮湿和干燥热带地区的森林总损失超过 90,000 平方公里 yr-1,这主要是由农业扩张驱动的。热带森林砍伐向大气中排放 0:95 Pg C yr-1 并导致广泛的生物多样性丧失。保护区的生物多样性取决于与保护区所在的更广泛景观的生态…...
![](https://img-blog.csdnimg.cn/img_convert/532108f1df0075b28e8890d6b9d70a71.png)
从暴力递归到动态规划(2)小乖,你也在为转移方程而烦恼吗?
前引:继上篇我们讲到暴力递归的过程,这一篇blog我们将继续对从暴力递归到动态规划的实现过程,与上篇类似,我们依然采用题目的方式对其转化过程进行论述。上篇博客:https://blog.csdn.net/m0_65431718/article/details/…...
![](https://www.ngui.cc/images/no-images.jpg)
Leetcode.1638 统计只差一个字符的子串数目
题目链接 Leetcode.1638 统计只差一个字符的子串数目 Rating : 1745 题目描述 给你两个字符串 s和 t,请你找出 s中的非空子串的数目,这些子串满足替换 一个不同字符 以后,是 t串的子串。换言之,请你找到 s和 t串中 恰…...
![](https://img-blog.csdnimg.cn/5a285a08269749caaecced56648116fb.png)
KoTime:v2.3.9新增线程管理(线程统计、状态查询等)
功能概览 KoTime的开源版本已经迭代到了V2.3.9,目前功能如下: 实时监听方法,统计运行时长web展示方法调用链路,瓶颈可视化追踪追踪系统异常,精确定位到方法接口超时邮件通知,无需实时查看线上热更新&…...
![](https://img-blog.csdnimg.cn/ce1dfec2e8084eb7b67689326637c038.png)
直面风口,未来不仅是中文版ChatGPT,还有AGI大时代在等着我们
说到标题的AI2.0这个概念的研究早在2015年就研究起步了,其实大家早已知道,人工智能技术必然是未来科技发展战略中的重要一环,今天我们就从AI2.0入手,以GPT-4及文心一言的发布为切入角度,来谈一谈即将降临的AGI时代。 关…...
![](https://img-blog.csdnimg.cn/9c9001627740413eaac8fba363fc4cc6.png)
若依微服务(ruoyi-cloud)保姆版容器编排运行
一、简介 项目gitee地址:https://gitee.com/y_project/RuoYi-Cloud 由于该项目运行有很多坑,大家可以在git克隆拷贝到本地后,执行下面的命令使master版本回退到本篇博客的版本: git reset --hard 05ca78e82fb4e074760156359d09a…...
![](https://img-blog.csdnimg.cn/e0950d57d0f149809560053994cea79e.gif#pic_center)
vue2图片预览插件
学习:vue插件开发实例-图片预览插件 vue2-pre-img-plugin的gitee代码 准备工作 准备图片与基础的样式 将iconfont下载的字体图标资源放在src/assets/iconfont目录下将准备预览的图片放到src/static/images目录下 PrevImg.vue 在plugins/PrevImg目录下ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
手写Promise源码的实现思路
Promise的使用: let promise new Promise((resolve, reject) > {resolve("OK");// reject("Error"); });console.log(promise);promise.then(value > {console.log("success"); }, error > {console.log("fail"…...
![](https://img-blog.csdnimg.cn/43a958f730f640c38e3b7c0827e2ddca.jpeg)
【数据结构】-关于树的概念和性质你了解多少??
作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 树前言一、树概念及结构1.1树的概念1.2 树的相关概念1.3 树的表示1.4树在实际中的运用…...
![](https://img-blog.csdnimg.cn/09d3697853a742b88b67892104483722.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5a2Z5LiN5Z2aMTIwOA==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
【前端之旅】NPM必知必会
一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(UniApp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…...
![](https://www.ngui.cc/images/no-images.jpg)
Android SQLite使用事务来确保所有语句都以原子方式执行及保证数据完整性一次执行多条语句示例
execSQL 不支持用分号分隔一次执行多个 SQL 语句,虽然理论上可以实现。但是,并不建议这样做,因为这可能会导致潜在的 SQL 注入漏洞。相反,建议使用 execSQL 或 rawQuery 分别执行每个语句。 在下面的代码块中,我们正在…...
![](https://img-blog.csdnimg.cn/92c3afdcc9af4004a3a86203dd912b84.jpeg)
nodejs+vue校园超市小卖部零食在线购物商城系统
21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到…...
![](https://img-blog.csdnimg.cn/img_convert/2d8d44e514ab0e2ac15eaefe7161a3cd.jpeg)
Karl Guttag:论相机对焦技术在AR/VR中的沿用
近期,AR/VR光学专家Karl Guttag介绍了两家在CES 2023展出光学传感技术的公司:poLight和CML(剑桥机电一体化)。同时介绍两家公司的原因,是因为他们提供了实现AR/VR“光学微动”(Optics Micromovement&…...
![](https://img-blog.csdnimg.cn/20200202150304319.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly94aW56aGUuYmxvZy5jc2RuLm5ldA==,size_16,color_FFFFFF,t_70)
深圳市住房和建设局网站变更/谷歌竞价广告
Django Web应用程序(3) 本文主要内容为对项目“学习笔记”设置样式并对其进行部署。 为设置样式,将使用Bootstrap库;另外,我们还将把项目部署到Heroku,这个网站能够让我们能够将项目推送到其服务器&#x…...
![](https://img-blog.csdnimg.cn/img_convert/38ac1e9650c4807d6dc223f135cbf56c.png)
做招聘网站价格/什么是百度快照
如果你平时工作比较忙碌,并且这种忙碌的工作会让你感觉到焦头烂额,那么在这种情况下,你就需要一些工具来辅助自己了。通常使用待办事项app是不少人的选择,那么作为一款好用的待办事项app,应该有什么功能呢?…...
![](/images/no-images.jpg)
简述建立一个网站模板步骤/技能培训班
随着小程序不断走红,越来越多的线下实体店老板意识到转型小程序已是大势所趋,它能为商业带来更多流量、更多利润。那么一款强大的商城类小程序具备哪些功能呢,下面为各位商家详细介绍一下。 一.具体的功能 线上商城 开发小程序商城的目的就是…...
30岁学网站建设/百度网站怎么优化排名靠前
西雅图IT圈:seattleit【今日作者】宇直宇宙第一直男据彭博9月17日消息,Facebook再次因涉嫌监视Instagram用户被起诉,被指控未经授权使用手机摄像头。这起诉讼源于7月份的媒体报道,当时有报道称,Instagram在未被积极使用…...
![](/images/no-images.jpg)
做网站类的书本信息/seo查询官方网站
1.首先准备两台主机,一台做服务器,一台做客户机,保证两台能够相互通信服务器IP地址:192.168.4.5客户机IP地址:192.168.4.2052.给服务器配置NFS服务[rootser5 /]# rpm -q nfs-utils rpcbindnfs-utils-1.2.3-39.el6.x86_…...
![](/images/no-images.jpg)
网站做描本好处/网络推广代理平台
1001 害死人不偿命的(3n1)猜想 (15 分) 卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n1) 砍掉一半。这样一直反复砍下去,最后…...