vue响应式原理
对于响应式原理,我们先了解vue是一个MVVM结构的框架;也就是数据层、视图层、数据-视图层;响应式的原理就是实现当数据更新时,视图层也要相应的更新,基于响应式原理我们可以使数据驱动视图的实现变得简单而高效
一、响应式原理
对于Vue2中的响应式处理来说,他基于js的object.defineProperty()方法的。它的原理主要是如下几步实现的:
1、数据劫持:在vue中,当你把一个普通js对象传给vue实例作为data选项时,vue将遍历次对象所有的属性,并使用Object.defineProperty()把这些属性全部转为getter/setter。这样,vue能够追踪到属性的变化,并在属性被访问和修改时执行相应的操作
2、依赖追踪:vue内部维护了一个依赖收集的系统,每个响应式对象都有一个对应的依赖集合,当数据被访问时,会把当前的Watcher(观察者)记录下来。这样,当数据发生变化时,依赖于这个数据的所有Watcher都会被通知,进而更新相应的视图。
3、派发更新:当响应式数据发生变化时,vue会遍历依赖集合,通知相关的Watcher更新视图
二、为什么需要有响应式呢
响应式是为了构建动态的,交互式的用户页面而设计的。如果没有响应式那么我们就需要手动去监听数据的变化然后更新视图,这样会导致性能上消耗增加,并且用户的体验也不会良好,而响应式使得页面能够在数据变化时实时更新,提供了更好的用户体验。用户可以看到页面的实时变化,而无需手动刷新页面。
三、要如何实现响应式
对于响应式来说,它基于发布订阅模式和数据劫持来实现的,即:
1、发布-订阅者模式:vue使用发布-订阅者模式来实现数据变动时的通知和更新
2、数据劫持:vue通过Object.defineProperty对数据进行劫持
实现方法:
// 定义Dep类,用于收集依赖和通知更新
class Dep {constructor() {this.subscribers = [];}// 添加订阅者addSubscriber(sub) {if (sub && typeof sub.update === 'function') {this.subscribers.push(sub);}}// 发布更新notify() {this.subscribers.forEach(sub => sub.update());}
}
// 定义Watcher类,用于订阅数据变化
class Watcher {constructor(vm, key, cb) {this.vm = vm;this.key = key;this.cb = cb;Dep.target = this;this.vm[this.key]; // 触发 getter,收集依赖Dep.target = null;}// 更新视图update() {this.cb.call(this.vm, this.vm[this.key]);}
}
// 定义Observer类,用于将对象转为响应式对象
class Observer {constructor(data) {this.data = data;this.walk(data);}// 遍历对象属性,转为响应式walk(data) {Object.keys(data).forEach(key => {this.defineReactive(data, key, data[key]);});}// 定义响应式属性defineReactive(obj, key, value) {const dep = new Dep();Object.defineProperty(obj, key, {enumerable: true,configurable: true,get() {if (Dep.target) {dep.addSubscriber(Dep.target);}return value;},set(newValue) {if (value !== newValue) {value = newValue;dep.notify(); // 数据变化,通知更新}}});}
}
// Vue 类,用于创建 Vue 实例
class Vue {constructor(options) {this.options = options; this._data = options.data;// 数据响应化new Observer(this._data);// 代理 data 到 Vue 实例上this.proxyData(this._data);// 创建 Watcher 实例,观察数据变化options.created && options.created.call(this);}// 代理 data 到 Vue 实例上proxyData(data) {Object.keys(data).forEach(key => {Object.defineProperty(this, key, {enumerable: true,configurable: true,get() {return this._data[key];},set(newValue) {this._data[key] = newValue;}});});}
}
可以从以上代码中看出:
Dep
类用于收集依赖和通知更新,每个响应式数据都有一个对应的Dep
实例- watcher类用于订阅数据变化,当数据变化时,会触发对应watcher的更新
Observer
类用于将对象转为响应式对象,遍历对象属性,通过object.defineProperty转为响应式属性- vue类用于创建vue实例,将data选项转为响应式对象,并创建对应的Watcher实例,观察数据变化
因此通过以上代码我们就实现了一个响应式原理了
四、vue3是如何实现响应式原理的呢
在vue3中,响应式原理采用了基于ES6 Proxy对象的方式来实现,相较于vue2中基于Object.defineProperty的方式,使用Proxy对象能够更灵活地拦截对对象的各种操作,从而实现更加高效和强大的响应式系统
五、Object.defineProperty
通过以上内容我们可以看出,Object.defineProperty()允许我们定义对象的属性,并且能够通过拦截访问和修改这些属性的行为,实现对属性的监控和响应。这使得当对象的属性发生变化时,能够触发相应的更新操作,但是我们要注意的是,它实现数据劫持不是进行数据代理,而是数据拦截的。就是说在数据被访问和修改时进行拦截,并把相应的时机触发更新操作,从而实现数据与视图的同步更新。
具体来说,在vue的响应式系统中,当你把一个普通javaScript对象传给vue实例作为data选项时,vue会遍历这个对象的所有属性,并使用Object.defineProperty()方法把这些属性全部转为getter/setter。这样一来,vue能够追踪到属性的变化,并在属性被访问和修改时执行相应的操作。
缺点
-
兼容性问题:
Object.defineProperty()
在 IE8 及更早版本的浏览器中不被支持,这限制了 Vue 在一些旧版本浏览器中的应用范围,需要额外的兼容处理 -
只能监听对象属性:
Object.defineProperty()
只能劫持对象的属性访问和修改操作,无法监听对象的新增属性和删除属性的操作。这导致在 Vue 中对于新增属性和删除属性的响应式处理需要额外的操作,例如需要使用Vue.set()
或者$set()
方法来添加新属性 -
无法监听数组变化:
Object.defineProperty()
无法直接监听数组的变化,因为数组的变化通常包括了数组的元素的添加、删除和重新排序等操作,这些操作不会触发数组的属性变化,从而无法被Object.defineProperty()
拦截。在 Vue 中对于数组的响应式处理是通过重写数组的一系列方法来实现的,如push()
、pop()
、shift()
、unshift()
等,这种处理方式也增加了一定的复杂性 -
性能开销:对于大规模数据的响应式处理,
Object.defineProperty()
可能会带来一定的性能开销。因为每个被劫持的属性都需要一个对应的 getter 和 setter 函数来进行拦截和更新操作,当属性较多时,可能会影响到整体性能
六、Proxy
对于Proxy
它是 ES6 中新增的一种代理机制,用于定义基本操作的自定义行为(例如属性查找、赋值、枚举、函数调用等)。它提供了一种强大而灵活的方式来监视并对对象的操作进行拦截和定制。因此在 Vue 3 中,我们可以使用Proxy
被用于实现数据的响应式处理
Proxy 的特点:
- 可定制行为:通过定义拦截器函数,可以对对象的各种操作进行定制,使得 Proxy 对象能够实现非常灵活的代理行为。
- 透明性:Proxy 对象与原对象具有相同的外观和行为,因此在代码中可以完全替代原对象,而不会影响到代码的其他部分。
- 非侵入性:Proxy 对象与原对象之间的代理关系是动态的,可以随时添加或移除代理行为,而不会影响到原对象。
- 更好的性能:与
Object.defineProperty()
相比,Proxy 的性能通常更好,特别是在处理大规模数据和数组变化时。
总的来说,Proxy
是一个强大而灵活的工具,能够对对象的操作进行拦截和定制,为我们提供了更好的数据处理和操作控制的能力。
七、总结
综上所述,我们可以得出以下结论:
- 理解 MVVM 结构:Vue 是一个典型的 MVVM 框架,它将数据层、视图层和数据-视图层进行了良好的分离,使得前端开发更加清晰和高效
- 掌握响应式原理:响应式原理是 Vue 实现数据驱动视图的关键,通过数据劫持和依赖追踪,实现了数据与视图之间的自动更新,为构建动态、交互式的用户界面提供了强大的支持
- 熟悉实现方式:在 Vue 2 中,响应式原理是基于
Object.defineProperty()
实现的,它具有一定的局限性和缺点,比如无法监听数组变化和兼容性问题。而在 Vue 3 中,采用了基于Proxy
的方式,提供了更灵活、高效的响应式系统。 - 权衡利弊:
Object.defineProperty()
和Proxy
各有优缺点,需要根据项目的具体需求和浏览器兼容性要求进行选择。Proxy
在性能和灵活性上有一定优势,但在一些旧版本浏览器中可能存在兼容性问题;而Object.defineProperty()
则在兼容性较好的情况下实现了一定的数据劫持能力
两种实现方式的区别:
- 灵活性:
Proxy
提供了更加灵活和强大的拦截能力,可以拦截对象的更多操作,包括属性的读取、赋值、删除、枚举等,以及数组的操作如push
、pop
、shift
、unshift
等。而Object.defineProperty()
只能劫持对象的属性访问和修改操作,无法直接监听数组的变化等 - 兼容性:
Proxy
在 ES6 中被引入,因此对于支持 ES6 的现代浏览器和环境来说,兼容性较好。但是在一些旧版本的浏览器中,如 IE11 及更早版本,Proxy
并不被支持。而Object.defineProperty()
在较早的 ES5 中就已经存在,兼容性较好,但也存在一些兼容性问题,如无法监听数组变化和对新增属性的处理等 - 性能:
Proxy
相对于Object.defineProperty()
在性能上可能会有所提升,特别是在处理大规模数据和数组变化时。Proxy
的拦截器函数在实现上更为底层,因此可能更加高效。而Object.defineProperty()
的性能开销相对较大,特别是在属性较多时可能会影响到整体性能 - 监听对象的方式:
Proxy
是通过创建一个目标对象的代理对象来实现监听的,可以直接监听整个对象,包括对象的属性新增、删除和修改等操作。而Object.defineProperty()
是针对对象的每个属性进行劫持,无法直接监听对象的整体变化
总的来说,深入理解vue的响应式原理和不同的实现方式,有助于我们更加深入地理解前端框架的底层原理,并能够更加灵活地应对各种开发场景和需求
相关文章:
vue响应式原理
对于响应式原理,我们先了解vue是一个MVVM结构的框架;也就是数据层、视图层、数据-视图层;响应式的原理就是实现当数据更新时,视图层也要相应的更新,基于响应式原理我们可以使数据驱动视图的实现变得简单而高效 一、响…...
SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决
概述 在 SwiftUI 的界面布局中,列表(List)和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道:如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到:当在 List 的…...
使用Allure作为测试报告生成器(Java+Selenium)
背景 JAVA项目中原先用Jenkinsseleniumselenium grid来日常测试UI并记录。 问题 当某一个testSuite失败时,当需要确认UI regression issue还是selenium test case自身的问题,需要去jenkins中查log,一般得到的是“Can not find element xxx…...
【论文阅读】处理器芯片敏捷设计方法:问题与挑战
作者:包云岗老师 包云岗老师是计算机体系结构方向的大牛,推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会: 已有的软硬件生态系统和开发成本制约了对新结构的探索。但目前仍在几种路线上做尝试~ 1…...
系统内核自动处理 TCP 连接(自动发送 RST 数据包来重置连接)
使用原始套接字发送了一个 SYN 数据包后,对方发送了 SYN,ACK 数据包,但系统仍然会自动发送 RST 数据包。这通常是因为操作系统内核在处理 TCP 连接时的行为。 原因分析 内核处理 TCP 连接: 即使你使用了原始套接字来发送和接收数据包&#x…...
VLDB 2024 | 时空数据(Spatial-temporal)论文总结
VLDB 2024于2024年8月26号-8月30号在中国广州举行。 本文总结了VLDB 2024有关时空数据(time series data)的相关论文,主要包含如有疏漏,欢迎大家补充。 🌟【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘…...
以ATTCK为例构建网络安全知识图
ATT&CK(Adversarial Tactics, Techniques, and Common Knowledge )是一个攻击行为知识库和模型,主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。本文简单介绍ATT&CK相关的背景概念,并探讨通过ATT&a…...
Qt初识_对象树
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 Qt初识_对象树 收录于专栏【Qt开发】 本专栏旨在分享学习Qt的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 什么是对象树 为什么要引…...
规范秩相关信息搜集Day2
系列博客目录 文章目录 系列博客目录1.A Survey on Tensor Techniques and Applications in Machine Learning2.有没有研究低秩矩阵有利于分类的计算机方面的论文呢3.Image classification based on low-rank matrix recovery and Naive Bayes collaborative representatio 基于…...
【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2024年最新的方法,实测有效)
文章目录 前言一、前置条件1、已安装Visual Studio Code,并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号],2、在Visual Studio Code扩展中搜索Unity,并安装3、同时注意这个插件下面的描述,需要根…...
交换瓶子(图论 贪心)
1224. 交换瓶子 - AcWing题库 把每一个瓶子看成一个点,从每个瓶子向他应该在的那个位置的瓶子连一条边 通过这个方式,我们就可以连出n条边 观察可以发现这些图有特点: n个点 连成n条边 因为每个点会指向它应该在的位置的那个点ÿ…...
汽车升级到底应不应该设置“可取消“功能
最近,汽车OTA(Over-the-Air)升级频频成为车主讨论的热点。有些车主反映,一些升级增加了实用功能,而另一些却让体验变得复杂甚至带来不便。于是,大家不禁发问:汽车升级功能究竟应不应该允许“可取…...
Mac电脑钓鱼到拿下核心权限
目录 一. 前言 二. PKG后门制作阶段 2.1 环境准备 2.2 制作过程 2.3 成功上线 三 . 浏览器密码抓取 四. 权限维持 1. 手动权限维持 2. MSF自动化维持 五. 参考文章 一. 前言 攻防对抗强度和难度日益演进,传统的渗透测试思路成本逐渐提高,钓鱼已经成为当下攻击者最常…...
Docker多架构镜像构建踩坑记
背景 公司为了做信创项目的亮点,需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行,整个项目通过后端Java,前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建,于是只能手工构…...
docker 架构详解
Docker架构是基于客户端-服务器(C/S)模式的,包含多个关键组件,以确保容器化应用的高效构建、管理和运行。以下是对Docker架构的详细解析: Docker 架构概述 Docker 架构采用客户端-服务器(C/S)…...
05-标准库开发-STM32-IIC协议
七、STM32中IIC协议 概述 Inter-Integrated Circuit (IIC),也常称为I2C(I squared C),是一种同步、串行、半双工通信总线协议。它主要用于连接低速外围设备到处理器或微控制器上,如MPU6050姿态传感器、OLED显示屏、存…...
vue 封装全局过滤器
1.找到utils下创建fifilter.js 一些常用的过滤方法 export const filters {//url解码urlCode: value > {if (!value) return let v decodeURIComponent(value)let bigIndex v.lastIndexOf(/)let endIndex v.lastIndexOf(.)let url v.substring(bigIndex 1, endIndex)…...
【PlantUML系列】流程图(四)
目录 目录 一、基础用法 1.1 开始和结束 1.2 操作步骤 1.3 条件判断 1.4 并行处理 1.5 循环 1.6 分区 1.7 泳道 一、基础用法 1.1 开始和结束 开始一般使用start关键字;结束一般使用stop/end关键字。基础用法包括: start ... stopstart ...…...
MATLAB中的合并分类数组
目录 创建分类数组 串联分类数组 创建具有不同类别的分类数组 串联具有不同类别的数组 分类数组的并集 此示例演示了如何合并两个分类数组。 创建分类数组 创建分类数组 A,其中包含教室 A 中的 25 个学生的首选午餐饮料。 rng(default) A randi(3,[25,1]); …...
流编辑器sed(stream editor)
一.sed简介 sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处 理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复&…...
R语言的数据结构--矩阵
【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言医学数据分析实践-R语言的数据结构-CSDN博客 矩阵是一个二维数组,矩阵中的元素都具有相…...
使用 Python 爬取某网站简历模板(bs4/lxml+协程)
使用 Python 爬取站长素材简历模板 简介 在本教程中,我们将学习如何使用 Python 来爬取站长素材网站上的简历模板。我们将使用requests和BeautifulSoup库来发送 HTTP 请求和解析 HTML 页面。本教程将分为两个部分:第一部分是使用BeautifulSoup的方法&am…...
19 go语言(golang) - 通过反射手动实现json序列化
一、json 在 Go 语言中,JSON 序列化和反序列化通常通过标准库 encoding/json 来实现。这个包提供了简单易用的接口来将 Go 数据结构转换为 JSON 格式字符串(序列化),以及从 JSON 字符串解析出 Go 数据结构(反序列化&a…...
Scala:隐式转换
隐式转换的定义 //隐式转换:编译器自动滴,偷偷滴,把数据A->B object test04 {def main(args: Array[String]): Unit {val i:Int1//把Int类型,转化成Double类型//Int -> Double//隐式转换失败val b:Double1//隐式转换失败v…...
UVM之寄存器模型生成
1.采用python脚本生成寄存器模型 首先用excel表格做好寄存器描述 然后编写脚本生成.ralf文件 (1)首先通过openpyxl读取EXCEL表格, workbook openpyxl.load_workbook(reg.xlsx) # 返回一个workbook数据类型的值 (2ÿ…...
PL/SQL批量生成数据
在PL/SQL中生成大量模拟数据,特别是当你需要生成大量记录(如1亿条)时,有几种常见的方式可以提高生成数据的效率和性能。以下是一些常用的方法和最佳实践: 1. 使用PL/SQL块批量生成数据 PL/SQL块可以通过循环生成大量…...
Xcode模拟器运行报错:The request was denied by service delegate
Xcode模拟器运行报错:The request was denied by service delegate 造成的原因: (1)新的苹果M系列芯片的Mac电脑 (2)此电脑首次安装启动Xcode的应用程序 (3)此电脑未安装Rosetta 2 解决方法: …...
2024小迪安全基础入门第十课
目录 一、传输格式&数据-类型&编码&算法 1. 传输格式: 2. 传输数据: 3. 影响与渗透测试: #传输格式 #传输数据 二、密码存储&混淆-不可逆&非对称性 1. 密码存储: 2. 密码存储的影响: 3.…...
Redisson分布式限流器
Redisson分布式限流器 一、使用1.1、方法1.2、示例 二、原理2.1、设置限流器2.2、获取令牌 三、总结 最近有需求在做分布式限流,调研的限流框架大概有: 1、spring cloud gateway集成redis限流,但属于网关层限流 2、阿里Sentinel,功能强大、带监控平台 …...
xvisor调试记录
Xvisor是一种开源hypervisor,旨在提供完整、轻量、移植且灵活的虚拟化解决方案,属于type-1类型的虚拟机,可以直接在裸机上启动。 启动xvisor步骤: 1、搭建riscv编译环境 首先从github上下载riscv-gnu-toolchain很费劲,建议直接从国内的源下载 git clone https://gitee…...
Android问题记录 - Inconsistent JVM-target compatibility detected for tasks
文章目录 前言开发环境问题描述问题分析解决方案补充内容最后 前言 前段时间升级Android Studio后修复了一堆问题,详情请看:Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0(持续更新)。我以为问题已经全部解决了…...
【Python系列】使用 `psycopg2` 连接 PostgreSQL 数据库
???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…...
家庭路由器跑PCND的优点
在当今数字化的时代,PCDN(Peer-to-Peer Content Delivery Network)技术逐渐走入人们的视野,有人考虑在家庭路由器上跑PCDN,下面是优点: 1.资源利用最大化 家庭网络在很多时候存在闲置的带宽和计算资源。通…...
ASP.NET Core API + MySql
环境 数据库: mysql8.0 后端: vs2022 ASP.NET Core API .net 8 前端: Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 创建项目 添加资源包 AutoMapper Microsoft.EntityFrameworkCore.Tools 8.0.0 Pomelo.EntityFramew…...
torch.optim.lr_scheduler.ReduceLROnPlateau
torch.optim.lr_scheduler.ReduceLROnPlateau 是 PyTorch 中的一种学习率调度器,主要用于在模型训练过程中根据某些指标(如验证损失)动态调整学习率。它是一种基于性能指标动态调整学习率的策略,而不是预定义的固定时间调整。 主要…...
Dubbo
官方文档: Java SDK 手册 | Apache Dubbo 一 RPC及Dubbo 1 什么是RPC dubbo是⼀款⾼性能的rpc框架。什么是rpc呢? rpc是⼀种协议:是⼀种远程过程调⽤(remote procudure call)协议 rpc协议是在应⽤层之上的协议&…...
算法1(蓝桥杯18)-删除链表的倒数第 N 个节点
问题: 给你一个链表,删除链表的倒数第 n 个节点,并且返回链表的头节点。 输入:head 1 -> 2 -> 3 -> 4 -> 5 -> null, n 2 输出:1 -> 2 -> 3 -> 5 -> null输入:head 1 ->…...
SEC_ASA 第一天作业
拓扑: 实验需求: 注意:在开始作业之前必须先读“前言”,以免踩坑!!!(☞敢点我试试) 按照拓扑图配置VLAN连接。 注意:ASA防火墙的 Gi0/1口需要起子接口&#x…...
《C语言程序设计现代方法》note-8 指针和数组的关系
文章目录 助记提要12章 指针和数组12.1 指针的算术运算12.2 指针用于数组处理结合使用*和运算符 12.3 数组名作为指针数组名可以用作指针指针也可以当做数组名数组型实参 12.4 指针和多维数组处理每个元素处理行处理列多维数组名做指针 12.5 指针和变长数组 助记提要 指针支持…...
安科瑞电能质量治理产品在分布式光伏电站的应用-安科瑞黄安南
1.概述 随着全球对可再生能源需求的增加,分布式光伏电站的建设和发展迅速。然而,分布式光伏电站的运行过程中面临着一系列问题,比如导致企业关口计量点功率因数过低、谐波污染等。这些问题不仅影响光伏电站自身的运行效率,还会对…...
JavaScript 的原生数组方法和 Vue 的响应式系统之间的差异
发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。 JavaScript 的原生数组方法和 Vue 的响应式系统之间的差异主要体现在 Vue 如何追踪数组的变化,以及 Vue 如何处理数组…...
项目组件框架介绍[bRPC]
文章目录 前言bRPC安装bRPC的简单使用protobuf简单使用Echo服务远程调用Echo服务 与etcd关联 前言 bRPC是百度开源的一款工业级RPC框架,功能强大, 常用于搜索、存储、机器学习、广告、推荐等高性能系统。 bRPC安装 使用源码安装即可, 在安装前要确认依赖 sudo apt…...
基于MobileNetV3架构动物声音分类识别与应用系统实现
1.摘要 本文主要实现了一个基于MobileNetV3架构的深度学习模型用于动物声音分类识别任务。该MobileNetV3是一种轻量级的卷积神经网络,旨在实现高效分类性能,本章在猫、狗、海豚等三个动物声音(.wav数据集)上进行了训练和测试,即在…...
ragflow连ollama时出现的Bug
ragflow和ollama连接后,已经添加了两个模型但是ragflow仍然一直warn:Please add both embedding model and LLM in Settings > Model providers firstly.这里可能是我一开始拉取的镜像容器太小,容不下当前添加的模型,导…...
[大数据]Hudi编译集成
1. 编译环境准备 相关组件版本如下: Hadoop3.3.1Hive3.1.3Flink1.13.6,scala-2.12Spark3.3.1,scala-2.12 1)安装Maven (1)上传apache-maven-3.6.1-bin.tar.gz到/opt/software目录,并解压更名…...
rk3588-ubuntu22.04系统网关实现路由器功能:
rk3588-ubuntu22.04系统网关实现路由器功能: 场景需求描述: 需求背景: 场景一:通过网线eth0/(路由器wlan0)访问外网: 如果网关 和 设备所处的环境可以通过网线联网或者路由器联网,那么不需要将网关配置成…...
Python部署教程-Python项目怎样在Pycharm中运行
大家好,我是程序员徐师兄,今天为大家带来的是Python部署教程-Python项目怎样在Pycharm中运行。Python安装部署教程,包括软件的下载,软件的安装。该系统采用 Python语言开发,flask、Django 框架,MySql 作为数…...
代码随想录算法训练营第51期第14天 | 226. 翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
226. 翻转二叉树 226. 翻转二叉树https://leetcode.cn/problems/invert-binary-tree/1.昨天忘了声明,如果都用C的话,我大概率写不完,所以思路方面,我可能考虑用pyhon先写,后续会用文心一言转换成C 2.这里可以直接用层…...
C/C++常见符号与运算符
C/C常见符号与运算符对照表 符号用法与意义与Java类比:在条件运算符中 (cond ? x : y) 表示条件为假的分支;在 switch-case 中如 case 1:表示标签结束点;在自定义标签如 label: 中用于 goto 跳转Java中? :三元运算相同;switch-case中也有:…...
maven报错“找不到符号“
问题 springboot项目 maven编译打包过程,报错"找不到符号" 解决 很多网上方法都试过,都没用 换jdk,把17->21...