React进阶之路(四)-- React-router-v6、Mobx
文章目录
- ReactRouter
- 前置
- 基本使用
- 核心内置组件说明
- 编程式导航
- 路由传参
- 嵌套路由
- 默认二级路由
- 404路由配置
- 集中式路由配置
- Mobx
- 什么是Mobx
- 环境配置
- 基础使用
- observer函数*
- 计算属性(衍生状态)
- 异步数据处理
- 模块化
- 多组件数据共享
- Mobx和React职责划分
ReactRouter
前置
在一开始前端开发都是单页应用,也就是只有一个html文件。后来主流的开发模式变成了通过路由进行页面切换。这样做的优势就是:避免整体页面刷新 用户体验变好。缺点就是:前端负责事情变多了 开发的难度变大。
路由的本质是什么?
路由的概念来源于后端 : 一个路径表示匹配一个服务器资源,例如:
- /a.html -> a对应的文件资源
- /b.html -> b对应的文件资源
共同的思想: 一对一的关系
前端的路由: 一个路径path对应唯一的一个组件comonent 当我们访问一个path 自动把path对应的组件进行渲染
const routes = [{path:'/home',component: Home},{path:'/about',component: About},{path:'/article',component: Article}
]
基本使用
首先安装依赖:
yarn add react-router-dom@6
我们以一个小案例为例:
需求: 准备俩个按钮,点击不同按钮切换不同组件内容的显示

实现步骤:
- 导入必要的路由router内置组件
- 准备俩个React组件
- 按照路由的规则进行路由配置
// 引入必要的内置组件
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom'// 准备俩个路由组件const Home = () => <div>this is home</div>
const About = () => <div>this is about</div>function App() {return (<div className="App">{/* 按照规则配置路由,是一个非hash模式的路由 */}<BrowserRouter>{/* 指定跳转的组件,to用来配置路由地址 */}<Link to="/">首页</Link><Link to="/about">关于</Link><Routes><Route path="/" element={<Home />}></Route><Route path="/about" element={<About />}></Route></Routes></BrowserRouter></div>)
}export default App
核心内置组件说明
BrowerRouter组件
作用: 包裹整个应用,一个React应用只需要使用一次

Hash路由和history路由是两种前端路由的实现方式,它们的区别主要有以下几点:
- Hash路由是一种把前端路由的路径用井号 # 拼接在真实 URL 后面的模式。当井号 # 后面的路径发生变化时,浏览器并不会向服务器发送请求,而是根据 hash 值的变化来更新页面内容。
- History路由是一种利用 HTML5 的 history API 来实现的路由模式。它可以通过 pushState 和 replaceState 方法来修改浏览器的历史记录,从而改变 URL 的显示,同时不会触发页面的刷新。
- Hash路由相比于 history 路由,有以下几个缺点:
- Hash路由的 URL 较丑,有一个多余的 # 符号。
- Hash路由原本是用来做页面定位的,如果用来做路由的话,原来的锚点功能就不能用了。
- Hash路由的传参是基于 URL 的,如果要传递复杂的数据,会有体积的限制,而 history 路由不仅可以在 URL 里放参数,还可以将数据存放在一个特定的对象中。
- Hash路由设置的新值必须与原来不一样才会触发记录添加到栈中,而 history 路由可以设置与当前 URL 一模一样的新 URL,这样也会把记录添加到栈中。
Link组件
作用: 用于指定导航链接,完成声明式的路由跳转 类似于 <router-link/>

这里to属性用于指定路由地址,表示要跳转到哪里去,Link组件最终会被渲染为原生的a链接
Routes组件
作用: 提供一个路由出口,组件内部会存在多个内置的Route组件,满足条件的路由会被渲染到组件内部
什么是路由出口?
路由出口是一个用于在页面中显示路由组件的标签,它可以让你在不同的位置展示不同的内容,根据路由的变化而变化。路由出口有以下几个特点:
- 你可以在一个页面中使用多个路由出口,只要给它们不同的名字,就可以实现复杂的布局效果。
- 你可以在路由出口中嵌套其他的路由出口,以实现多级的路由导航。
- 你可以在路由出口中使用路由守卫,以实现对路由的控制和拦截。

Route组件
作用: 用于定义路由路径和渲染组件的对应关系 [element:因为react体系内把组件叫做react element]

其中path属性用来指定匹配的路径地址,element属性指定要渲染的组件,图中配置的意思为: 当url上访问的地址为 /about 时,当前路由发生匹配,对应的About组件渲染
编程式导航
声明式 【 Link to】 vs 编程式 【调用路由方法进行路由跳转】
概念: 通过js编程的方式进行路由页面跳转,比如说从首页跳转到关于页
实现步骤:
- 导入一个 useNavigate 钩子函数
- 执行
useNavigate 函数得到跳转函数 - 在事件中执行跳转函数完成路由跳转
// 导入useNavigate函数
import { useNavigate } from 'react-router-dom'
const Home = () => {// 执行函数const navigate = useNavigate()return (<div>Home<button onClick={ ()=> navigate('/about') }> 跳转关于页 </button></div>)
}export default Home
注: 如果在跳转时不想添加历史记录,可以添加额外参数replace 为true
navigate('/about', { replace: true } )
路由传参
场景:跳转路由的同时,有时候要需要传递参数
searchParams传参
路由传参

路由取参

params传参
路由传参


在指定路由的时候,要先占个位!
路由取参

嵌套路由
场景:在我们做的很多的管理后台系统中,通常我们都会设计一个Layout组件,在它内部实现嵌套路由

实现步骤:

- App.js中定义嵌套路由声明
<Routes><Route path="/" element={<Layout/>}><Route path="board" element={ <Board/> } /><Route path="article" element={ <Article/> } /></Route>{ /* 省略部分 */ }
</Routes>

- Layout组件内部通过
<Outlet/>指定二级路由出口
import { Outlet } from 'react-router-dom'const Layout = () => {return (<div>layout{ /* 二级路由的path等于 一级path + 二级path */ }<Link to="/board">board</Link><Link to="/article">article</Link>{ /* 二级路由出口 */ }<Outlet/></div>)
}
export default Layout
默认二级路由
场景: 应用首次渲染完毕就需要显示的二级路由
实现步骤:
- 给默认二级路由标记index属性
- 把原本的路径path属性去掉
代码实现:
<Routes><Route path="/" element={<Layout/>}><Route index element={ <Board/> } /><Route path="article" element={ <Article/> } /></Route>
</Routes>
import { Outlet } from 'react-router-dom'const Layout = () => {return (<div>layout{ /* 默认二级不再具有自己的路径 */ }<Link to="/">board</Link><Link to="/article">article</Link>{ /* 二级路由出口 */ }<Outlet/></div>)
}
404路由配置
场景:当url的路径在整个路由配置中都找不到对应的path,使用404兜底组件进行渲染
首先我们准备一个NotFound组件
const NotFound = () => {return <div>this is NotFound</div>
}export default NotFound
然后将这个组件添加到声明当中的,作为兜底方法
<BrowserRouter><Routes><Route path="/" element={<Layout />}><Route index element={<Board />} /><Route path="article" element={<Article />} /></Route><Route path="*" element={<NotFound />}></Route></Routes>
</BrowserRouter>
集中式路由配置
场景: 当我们需要路由权限控制点时候, 对路由数组做一些权限的筛选过滤,所谓的集中式路由配置就是用一个数组统一把所有的路由对应关系写好,替换本来的Routes组件
import { BrowserRouter, Routes, Route, useRoutes } from 'react-router-dom'import Layout from './pages/Layout'
import Board from './pages/Board'
import Article from './pages/Article'
import NotFound from './pages/NotFound'// 1. 准备一个路由数组 数组中定义所有的路由对应关系
const routesList = [{path: '/',element: <Layout />,children: [{element: <Board />,index: true, // index设置为true 变成默认的二级路由},{path: 'article',element: <Article />,},],},// 增加n个路由对应关系{path: '*',element: <NotFound />,},
]// 2. 使用useRoutes方法传入routesList生成Routes组件
function WrapperRoutes() {let element = useRoutes(routesList)return element
}function App() {return (<div className="App"><BrowserRouter>{/* 3. 替换之前的Routes组件 */}<WrapperRoutes /></BrowserRouter></div>)
}export default App
Mobx
什么是Mobx
一个可以和React良好配合的集中状态管理工具,和Redux解决的问题相似,都可以独立组件进行集中状态管理
mobx和react的关系,相当于vuex和vue
同类工具还有:
- redux
- dva
- recoil

优势:
- 简单:编写无模板的极简代码精准描述你的意图
- 轻松实现最优渲染:依赖自动追踪,实现最小渲染优化
- 架构自由:可移植, 可测试 无特殊心智负担
环境配置
Mobx是一个独立的响应式的库,可以独立于任何UI框架存在,但是通常大家习惯把它和React进行绑定使用,用Mobx来做响应式数据建模,React作为UI视图框架渲染内容,我们环境的配置需要三个部分
- 一个create-react-app创建好的React项目环境
- mobx框架本身
- 一个用来链接mobx和React的中间件
# 安装mobx和中间件工具 mobx-react-lite 只能函数组件中使用
$ yarn add mobx mobx-react-lite
基础使用
需求: 使用mobx实现一个计数器的案例

首先我们初始化mobx:
一般我们mobx的代码会写在store文件夹中:

初始化步骤
- 定义数据状态state
- 在构造器中实现数据响应式处理 makeAutoObservble
- 定义修改数据的函数action
- 实例化store并导出
import { makeAutoObservable } from 'mobx'class CounterStore {count = 0 // 定义数据constructor() {makeAutoObservable(this) // 响应式处理}// 定义修改数据的方法addCount = () => {this.count++}
}const counter = new CounterStore()
export default counter
然后React使用store:
实现步骤
- 在组件中导入counterStore实例对象
- 在组件中使用storeStore实例对象中的数据
- 通过事件调用修改数据的方法修改store中的数据
- 让组件响应数据变化
// 导入counterStore
import counterStore from './store'
// 导入中间件连接mobx、react 完成响应式变化
import { observer } from 'mobx-react-lite'
function App() {return (<div className="App"><button onClick={() => counterStore.addCount()}>{counterStore.count}</button></div>)
}
// 包裹组件让视图响应数据变化
export default observer(App)
在原来我们的数据是react来管理的,所以数据的变化会引起模板的重新渲染,而现在我们将状态交给mobx来管理,并且改变状态的方法也是mobx中提供的,所以我们需要observer方法来包裹App跟组件,让视图响应数据变化。
observer函数*
observer函数是一个高阶组件(Higher-Order Component,HOC),它可以接收一个React组件作为参数,并返回一个新的React组件,这个新的组件会自动订阅Mobx中的可观察数据,并在数据变化时重新渲染。
observer函数应该包裹那些需要响应Mobx中的数据变化的组件,通常是那些展示数据或者处理用户交互的组件。
我们可能会有一种猜想,我们直接使用observer函数包裹最外层的组件App是不是就可以了?这样当App组件重新渲染的时候,也会把子组件连带着一起重新渲染了?
这种想法大错特错!
App组件重新渲染了,子组件也不一定会重新渲染,这取决于子组件是否接收了来自App组件的props,以及这些props是否发生了变化。子组件只有在它的props或者state发生变化时,才会重新渲染。如果子组件只是依赖于Mobx中的数据,而不是App组件传递的props,那么它就不会因为App组件的重新渲染而重新渲染,除非它也使用了observer函数来订阅Mobx中的数据。子组件包含在App组件中,只是表示它是App组件的子节点,它并不会自动继承App组件的props或者响应App组件的更新。你可以把这个过程想象成一个树形结构,每个组件都是一个节点,每个节点都有自己的数据和渲染逻辑,只有当节点的数据发生变化时,它才会重新渲染自己和它的子节点。
如果你想让子组件跟随App组件的更新而更新,你可以有以下几种方法:
- 在App组件中使用observer函数,并且把Mobx中的数据通过props传递给子组件,这样子组件就会根据props的变化而重新渲染。
- 在子组件中也使用observer函数,并且直接从Mobx中获取数据,这样子组件就会根据Mobx中的数据变化而重新渲染。
- 在App组件中使用forceUpdate方法,强制App组件和它的子组件重新渲染,但这种方法不推荐使用,因为它会破坏React的优化机制。
计算属性(衍生状态)
概念: 有一些状态根据现有的状态计算(衍生)得到,我们把这种状态叫做计算属性, 看下面的例子

实现步骤
- 声明一个存在的数据
- 通过get关键词 定义计算属性
- 在 makeAutoObservable 方法中标记计算属性(其实标记不标记都可以,只是为了可读性)
import { computed, makeAutoObservable } from 'mobx'class CounterStore {list = [1, 2, 3, 4, 5, 6]constructor() {makeAutoObservable(this, {filterList: computed})}// 修改原数组changeList = () => {this.list.push(7, 8, 9)}// 定义计算属性get filterList () {return this.list.filter(item => item > 4)}
}const counter = new CounterStore()export default counter
get使用来表明getter方法的关键字
// 导入counterStore
import counterStore from './store'
// 导入observer方法
import { observer } from 'mobx-react-lite'
function App() {return (<div className="App">{/* 原数组 */}{JSON.stringify(counterStore.list)}{/* 计算属性 */}{JSON.stringify(counterStore.filterList)}<button onClick={() => counterStore.changeList()}>change list</button></div>)
}
// 包裹组件让视图响应数据变化
export default observer(App)
异步数据处理
实现步骤:
- 在mobx中编写异步请求方法 获取数据 存入state中
- 组件中通过 useEffect + 空依赖 触发action函数的执行
// 异步的获取import { makeAutoObservable } from 'mobx'
import axios from 'axios'class ChannelStore {channelList = []constructor() {makeAutoObservable(this)}// 只要调用这个方法 就可以从后端拿到数据并且存入channelListsetChannelList = async () => {const res = await axios.get('http://geek.itheima.net/v1_0/channels')this.channelList = res.data.data.channels}
}
const channlStore = new ChannelStore()
export default channlStore
import { useEffect } from 'react'
import { useStore } from './store'
import { observer } from 'mobx-react-lite'
function App() {const { channlStore } = useStore()// 1. 使用数据渲染组件// 2. 触发action函数发送异步请求useEffect(() => {channlStore.setChannelList()}, [])return (<ul>{channlStore.channelList.map((item) => (<li key={item.id}>{item.name}</li>))}</ul>)
}
// 让组件可以响应数据的变化[也就是数据一变组件重新渲染]
export default observer(App)
模块化
场景: 一个项目有很多的业务模块,我们不能把所有的代码都写到一起,这样不好维护,提了提供可维护性,需要引入模块化机制

实现步骤
- 拆分模块js文件,每个模块中定义自己独立的state/action
- 在store/index.js中导入拆分之后的模块,进行模块组合
- 利用React的context的机制导出统一的useStore方法,给业务组件使用。(当然也可以直接导出,使用context导出的好处就是调试+依赖注入)
store/taskStore.js:
import { makeAutoObservable } from 'mobx'class TaskStore {taskList = []constructor() {makeAutoObservable(this)}addTask () {this.taskList.push('vue', 'react')}
}const task = new TaskStore()export default task
store/counterStore.js:
import { makeAutoObservable } from 'mobx'class CounterStore {count = 0list = [1, 2, 3, 4, 5, 6]constructor() {makeAutoObservable(this)}addCount = () => {this.count++}changeList = () => {this.list.push(7, 8, 9)}get filterList () {return this.list.filter(item => item > 4)}
}const counter = new CounterStore()export default counter
组合模块导出统一方法:
index.js
import React from 'react'import counter from './counterStore'
import task from './taskStore'class RootStore {constructor() {this.counterStore = counterthis.taskStore = task}
}const rootStore = new RootStore()// context机制的数据查找链 Provider如果找不到 就找createContext方法执行时传入的参数
const context = React.createContext(rootStore)const useStore = () => React.useContext(context)
// useStore() => rootStore { counterStore, taskStore }export { useStore }
这个地方直接导出rootstore也是可以的。
接下来我们就来使用:
import { observer } from 'mobx-react-lite'
// 导入方法
import { useStore } from './store'
function App() {// 得到storeconst store = useStore()//这个地方我们可以直接解构赋值,想用哪一个就解构哪一个,例如://const {counterStore} = useStore()return (<div className="App"><button onClick={() => store.counterStore.addCount()}>{store.counterStore.count}</button></div>)
}
// 包裹组件让视图响应数据变化
export default observer(App)
多组件数据共享
目标:当数据发生变化,所有用到数据的组件都会得到同步的组件的更新
实现步骤:在Foo组件和Bar组件中分别使用store中的数据,然后在app组件中进行数据修改,查看Foo组件和Bar组件是否得到更新

Bar.js
// 用taskStore中的taskList数据
import { useStore } from './store'
import { observer } from 'mobx-react-lite'
const Bar = () => {const { taskStore } = useStore()return (<ul>{taskStore.taskList.map((item) => (<li>{item}</li>))}</ul>)
}export default observer(Son)
Foo.js
// 用taskStore中的taskList数据
import { useStore } from './store'
import { observer } from 'mobx-react-lite'
const Bar = () => {const { taskStore } = useStore()return (<ul>{taskStore.taskList.map((item) => (<li>{item}</li>))}</ul>)
}export default observer(Son)
App.js
import Bar from './Bar'
import Foo from './Foo'
import { useStore } from './store'
function App() {const { taskStore } = useStore()return (<div className="App"><Bar /><button onClick={() => taskStore.setTaskList('angular')}>修改taskStore</button></div>)
}
export default App
Mobx和React职责划分
Mobx和React的职责划分就是,Mobx负责管理应用的状态,React负责渲染应用的界面。你应该把那些需要跨组件共享或者响应变化的数据交给Mobx维护,比如用户的信息、购物车的内容、主题的设置等。你应该把那些只和组件自身相关或者不需要响应变化的数据交给React维护,比如表单的输入、组件的展开状态、动画的进度等。

- 这里的业务状态数据就类似于从后端获得的数据,其余的我们都可以当作UI的临时状态。
相关文章:
React进阶之路(四)-- React-router-v6、Mobx
文章目录 ReactRouter前置基本使用核心内置组件说明编程式导航路由传参嵌套路由默认二级路由404路由配置集中式路由配置 Mobx什么是Mobx环境配置基础使用observer函数*计算属性(衍生状态)异步数据处理模块化多组件数据共享Mobx和React职责划分 ReactRout…...
55基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声
基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声五组噪声模型,程序已调通,可直接运行。 55高斯噪声、瑞利噪声 (xiaohongshu.com)...
Codeforces Round 908 (Div. 2)视频详解
Educational Codeforces Round 157 (A--D)视频详解 视频链接A题代码B题代码C题代码D题代码 视频链接 Codeforces Round 908 (Div. 2)视频详解 A题代码 #include<bits/stdc.h> #define endl \n #define deb(x) cout << #x << "…...
电路综合-基于简化实频的SRFT集总参数切比雪夫低通滤波器设计
电路综合-基于简化实频的SRFT集总参数切比雪夫低通滤波器设计 6、电路综合-基于简化实频的SRFT微带线切比雪夫低通滤波器设计中介绍了使用微带线进行切比雪夫滤波器的设计方法,在此对集总参数的切比雪夫响应进行分析。 SRFT集总参数切比雪夫低通滤波器综合不再需要…...
Linux系统编程——实现cp指令(应用)
cp指令格式 cp [原文件] [目标文件] cp 1.c 2.c 功能是将原文件1.c复制后并改名成2.c(内容相同,实现拷贝) 这里需要引入main函数的参数解读: 我们在定义函数时许多都带有参数,输入参数后便可进行定义函数内的功能执行,而main…...
20231112_DNS详解
DNS是实现域名与IP地址的映射。 1.映射图2.DNS查找顺序图3.DNS分类和地址4.如何清除缓存 1.映射图 图片来源于http://egonlin.com/。林海峰老师课件 2.DNS查找顺序图 3.DNS分类和地址 4.如何清除缓存...
使用ssh上传数据到阿里云ESC云服务上
在这之前需要安装 ssh2-sftp-client 直接在终端输入:npm i ssh2-sftp-client 直接上代码: const path require(path); const Client require(ssh2-sftp-client);// 配置连接参数 const config {host: your-server-ip, // 云服务器的IP地址port: 22, …...
【408】计算机学科专业基础 - 数据结构
数据结构知识 绪论 数据结构在学什么 如何用程序代码把现实世界的问题信息化 如何用计算机高效地处理这些信息从而创造价值 数据结构的基本概念 什么是数据: 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序…...
SpringSpringBoot自动装配
文章目录 spring自动装配的好处Spring框架提供了三种自动装配的方式:Springboot自动装配Springboot自动装配的原理 spring自动装配的好处 Spring的自动装配(Autoscan or Autowiring)在开发中带来了多方面的好处,使得应用程序更加…...
k8s 部署mqtt —— 筑梦之路
mqtt是干嘛的,网上有很多资料,这里就不再赘述。 --- apiVersion: apps/v1 kind: Deployment metadata:labels:app: mqttname: mqttnamespace: default spec:replicas: 1selector:matchLabels:app: mqttstrategy:rollingUpdate:maxSurge: 25%maxUnavaila…...
模型部署:量化中的Post-Training-Quantization(PTQ)和Quantization-Aware-Training(QAT)
模型部署:量化中的Post-Training-Quantization(PTQ)和Quantization-Aware-Training(QAT) 前言量化Post-Training-Quantization(PTQ)Quantization-Aware-Training(QAT) 参…...
C++模板元模板(异类词典与policy模板)- - - 题目答案
目录 一、书中第一题 二、书中第三题 三、书中第五题 四、书中第六题 五、书中第七题 六、书中十一题 七、书中十二题 八、 书中十三题 总结 一、书中第一题 #include <iostream>template <typename T, size_t N> struct NSVarTypeDict {static void Cre…...
二十三种设计模式全面解析-组合模式与迭代器模式的结合应用:构建灵活可扩展的对象结构
在前文中,我们介绍了组合模式的基本原理和应用,以及它在构建对象结构中的价值和潜力。然而,组合模式的魅力远不止于此。在本文中,我们将继续探索组合模式的进阶应用,并展示它与其他设计模式的结合使用,以构…...
postgresql|数据库|提升查询性能的物化视图解析
前言: 我们一般认为数字的世界是一个虚拟的世界,OK,但我们其实有些需求是和现实世界一模一样的,比如,数据库尤其是关系型数据库,希望在使用的数据库能够更快(查询速度),…...
Unity中Shader雾效的原理
文章目录 前言一、我们先看一下现实中的雾二、雾效的混合公式最终的颜色 lerp(雾效颜色,物体颜色,雾效混合因子) 三、雾效的衰减1、FOG_LINEAR(线性雾衰减)2、FOG_EXP(指数雾衰减1)3、FOG_EXP(指数雾衰减2) 前言 Unity中Shader雾…...
chatgpt辅助论文优化表达
chatgpt辅助论文优化表达 写在最前面最终版什么是好的论文整体上:逻辑/连贯性细节上一些具体的修改例子 一些建议,包括具体的提问范例1. **明确你的需求**2. **提供上下文信息**3. **明确问题类型**4. **测试不同建议**5. **请求详细解释**综合提问范例&…...
Vue3 源码解读系列(二)——初始化应用实例
初始化应用实例 创建 Vue 实例对象 createApp 中做了两件事: 创建 app 对象保存并重写 mount /*** 创建 Vue 实例对象*/ const createApp ((...args) > {// 1、创建 app 对象,延时创建渲染器,优点是当用户只依赖响应式包的时候࿰…...
网络原理-UDP/TCP详解
一. UDP协议 UDP协议端格式 由上图可以看出,一个UDP报文最大长度就是65535. • 16位长度,表示整个数据报(UDP首部UDP数据)的最大长度(注意,这里的16位UDP长度只是一个标识这个数据报长度的字段࿰…...
C#多线程入门概念及技巧
C#多线程入门概念及技巧 一、什么是线程1.1线程的概念1.2为什么要多线程1.3线程池1.4线程安全1.4.1同步机制1.4.2原子操作 1.5线程安全示例1.5.1示例一1.5.2示例二 1.6C#一些自带的方法实现并行1.6.1 Parallel——For、ForEach、Invoke1.6.1 PLINQ——AsParallel、AsSequential…...
c primer plus_chapter_four——字符串和格式化输入/输出
1、strlen();const;字符串;用c预处理指令#define和ANSIC的const修饰符创建符号常量; 2、c语言没有专门储存字符串的变量类型,字符串被储存在char类型的数组中;\0标记字符串的结束&a…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
