当前位置: 首页 > news >正文

vue和reacts数据响应式的差异

Vue 的数据响应式:

原理

  • Vue 使用 Object.defineProperty 或 Proxy(在 Vue 3 中)来实现数据的响应式。当创建 Vue 实例时,会对 data 对象中的属性进行遍历,将其转换为响应式属性。对于 Object.defineProperty,它会为每个属性定义 getter 和 setter 函数,getter 会收集依赖(如模板中的表达式、计算属性或 watch 监听器),而 setter 会触发更新,通知依赖进行重新渲染或执行相应的操作。对于 Proxy,它会拦截对象的操作(如属性访问、赋值、删除等),当属性发生变化时,会触发相应的更新操作。

特点

  • 细粒度的依赖收集:能够精确地收集到哪些地方使用了某个属性,当该属性发生变化时,只会更新与之相关的部分。例如,在模板中使用了 { { message }},Vue 会精确地知道 message 被使用了,当 message 改变时,只更新这一处,而不是整个组件。
  • 深度响应式:默认情况下,Vue 的数据响应式是深度的,即对于嵌套对象或数组,内部的属性变化也会触发响应式更新。这意味着即使是 data 中的嵌套对象或数组的元素发生变化,也会触发相应的更新操作。
  • 自动更新:在 Vue 中,当数据发生变化时,会自动触发视图的更新,开发者不需要手动调用更新视图的操作。这是因为 Vue 的响应式系统会自动处理依赖关系,一旦数据发生变化,就会通知相关的订阅者。
<template><div><p>{{ message }}</p><button @click="changeMessage">Change Message</button></div>
</template><script>
export default {data() {return {message: 'Hello, Vue!'};},methods: {changeMessage() {this.message = 'Hello, Updated Vue!';}}
};
</script>

在上述 Vue 示例中,当点击 Change Message 按钮,message 的 setter 被触发,会自动更新模板中使用 { { message }} 的部分。

React 的数据响应式:

  • React 的数据响应式基于状态(state)和属性(props)的不可变原则。当状态或属性发生变化时,需要通过调用 setState (对于类组件)或 useState (对于函数组件)提供的更新函数来更新状态,React 会比较前后状态的差异(虚拟 DOM 比较),然后根据差异更新真实的 DOM。React 不会直接修改状态对象,而是创建一个新的状态对象来触发更新。
  • 虚拟 DOM 比较:React 通过比较虚拟 DOM 的前后状态,找出需要更新的部分,最小化实际 DOM 的操作。这种方式提高了性能,避免了频繁的直接 DOM 操作。
  • 状态不可变:在 React 中,状态应该是不可变的,这意味着不能直接修改状态对象的属性,而是要创建一个新的状态对象。例如,不能使用 this.state.count = 10,而是使用 this.setState({ count: 10 }) 或 setCount(10) (在函数组件中)。
  • 手动触发更新:React 需要手动调用 setState 或 useState 的更新函数来触发更新,不会自动监测状态的变化。
import React, { useState } from 'react';function App() {const [message, setMessage] = useState('Hello, React!');const changeMessage = () => {setMessage('Hello, Updated React!');};return (<div><p>{message}</p><button onClick={changeMessage}>Change Message</button></div>);
}export default App;

在上述 React 示例中,点击 Change Message 按钮,调用 setMessage 函数来更新 message 的值,React 会比较前后的虚拟 DOM 并更新实际 DOM。

差异总结:

  • 更新触发方式
    • Vue 通过 Object.defineProperty 或 Proxy 的 setter 自动触发更新,而 React 需要手动调用 setState 或 useState 的更新函数。
  • 数据处理原则
    • Vue 可以直接修改数据对象,且支持深度响应式,而 React 遵循状态不可变原则,需要创建新的状态对象。
  • 依赖收集
    • Vue 进行细粒度的依赖收集,而 React 主要通过虚拟 DOM 的比较来找出需要更新的部分,不进行依赖收集。

优缺点:

  • Vue 的优点
    • 对于习惯了面向对象编程和自动响应式更新的开发者来说,使用起来可能更直观,因为它自动处理数据更新和依赖关系。
    • 深度响应式使得处理复杂的数据结构(如嵌套对象和数组)更加方便。
    • 可以直接修改数据,代码可能看起来更简洁。
  • Vue 的缺点
    • 对于复杂的对象和数组,使用 Object.defineProperty 可能会有性能问题,而 Proxy 有一定的兼容性问题(但在现代浏览器中已经得到了很好的支持)。
    • 依赖于 Vue 的响应式系统,对于一些高级用法或集成外部库可能需要额外的学习成本。
  • React 的优点
    • 虚拟 DOM 的比较方式可以在复杂应用中提供较好的性能,尤其是对于频繁更新的场景。
    • 状态不可变原则使得代码更容易理解和调试,避免了意外的副作用。
    • 更灵活,适合构建大型、复杂的应用,可与各种库和架构集成。
  • React 的缺点
    • 需要手动调用 setState 或 useState 的更新函数,对于初学者可能会忘记更新状态。
    • 不支持深度响应式,对于嵌套对象或数组的处理可能需要更多的代码,例如使用展开运算符或库(如 immer)来更新状态。

综上所述,Vue 和 React 在数据响应式方面有不同的实现方式和特点,选择使用哪个框架取决于具体的开发需求、团队的技术栈和个人偏好。

Vue 和 React 都是流行的前端JavaScript库或框架,它们都提供了构建用户界面的方法。虽然两者都可以实现数据的响应式更新,但它们在实现这一功能上有着不同的方法和哲学。

Vue 的响应式系统

Vue 的核心特性之一是它的响应式数据绑定。Vue 使用的是基于对象的观察者模式来追踪数据的变化。当你创建一个 Vue 实例时,Vue 会遍历实例的数据对象中的所有属性,并使用 Object.defineProperty()(在 Vue 3 中使用的是 Proxy)将这些属性转换为 getter 和 setter。这使得当属性值被访问或修改时,Vue 能够捕捉到这些操作并作出相应的反应,比如更新视图。

Vue 的模板语法允许开发者直接在HTML中编写声明式的渲染逻辑,它会自动处理所有的 DOM 更新,因此对于开发者来说,数据变化和DOM更新之间的关系非常直观。

React 的响应式系统

React 并不自带数据的响应式机制。相反,它依赖于组件的状态(state)和属性(props)来管理数据。React 组件本质上是函数或类,它们接收 props 作为输入并返回描述UI的元素树。当状态或属性发生变化时,React 会重新执行组件函数(对于函数组件)或调用其 render 方法(对于类组件),以计算出新的 UI 表示。React 然后比较新旧两棵元素树,以确定需要对实际 DOM 进行哪些最小化的更新。

React 16.8 引入了 Hooks,这是一个重要的API增强,它允许函数组件拥有状态和其他特性,如副作用管理等。Hooks 例如 useState、useReducer 提供了一种更简洁的方式来管理组件内的状态变化。

总结

  • Vue 更加注重声明式的双向数据绑定,开发者可以更直接地看到数据与视图之间的联系。
  • React 则鼓励单向数据流,通过状态和属性的变化来触发整个应用的更新,这通常意味着更多的手动控制,但也提供了更大的灵活性。

这两种方式各有优劣,选择哪一个取决于开发者的偏好以及项目的具体需求。

与 Vue 基于 Proxy 实现响应式系统不同,React 并没有像 Vue 那样内置的响应式系统,而是基于状态管理和组件更新机制来实现数据变化驱动 UI 更新,下面从不同层面为你介绍:

1. 基础的 this.state 和 setState(类组件)

在 React 的类组件中,this.state 用于存储组件的状态数据,当调用 this.setState 方法更新状态时,React 会重新渲染组件,从而更新 UI。

import React, { Component } from 'react';
import ReactDOM from 'react-dom/client';class Counter extends Component {constructor(props) {super(props);this.state = {count: 0};}increment = () => {this.setState({ count: this.state.count + 1 });}render() {return (<div><p>Count: {this.state.count}</p><button onClick={this.increment}>Increment</button></div>);}
}const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Counter />);

在上述代码中,当点击按钮调用 increment 方法时,this.setState 会更新 count 状态,React 会重新调用 render 方法来更新 UI。

2. useState 钩子(函数组件)

在 React 的函数组件中,可以使用 useState 钩子来管理状态。当调用 setState 函数更新状态时,React 会重新渲染函数组件。

import React, { useState } from 'react';
import ReactDOM from 'react-dom/client';const Counter = () => {const [count, setCount] = useState(0);const increment = () => {setCount(count + 1);};return (<div><p>Count: {count}</p><button onClick={increment}>Increment</button></div>);
};const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Counter />);

这里,useState 返回一个状态变量 count 和一个更新状态的函数 setCount。当点击按钮调用 increment 方法时,setCount 会更新 count 状态,React 会重新渲染 Counter 组件。

3. 状态管理库

对于复杂的应用,React 通常会使用状态管理库,如 Redux、MobX 等。

Redux 是一个可预测的状态容器,用于管理 React 应用的状态。它采用单向数据流的思想,通过 action 触发 reducer 来更新 store 中的状态,当 store 中的状态发生变化时,会通知订阅的组件进行更新。

import React from 'react';
import ReactDOM from 'react-dom/client';
import { createStore } from 'redux';
import { Provider, useSelector, useDispatch } from 'react-redux';// 定义 reducer
const counterReducer = (state = { count: 0 }, action) => {switch (action.type) {case 'INCREMENT':return { count: state.count + 1 };default:return state;}
};// 创建 store
const store = createStore(counterReducer);const Counter = () => {const count = useSelector(state => state.count);const dispatch = useDispatch();const increment = () => {dispatch({ type: 'INCREMENT' });};return (<div><p>Count: {count}</p><button onClick={increment}>Increment</button></div>);
};const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Provider store={store}><Counter /></Provider>
);

在上述代码中,useSelector 用于从 store 中获取状态,useDispatch 用于触发 action。当 action 触发 reducer 更新 store 中的状态时,Counter 组件会重新渲染。

MobX

MobX 是另一个流行的状态管理库,它基于响应式编程的思想,通过 observable 定义可观察的状态,当状态发生变化时,会自动更新依赖该状态的组件。

import React from 'react';
import ReactDOM from 'react-dom/client';
import { makeObservable, observable, action } from 'mobx';
import { observer } from 'mobx-react-lite';class CounterStore {count = 0;constructor() {makeObservable(this, {count: observable,increment: action});}increment = () => {this.count++;};
}const counterStore = new CounterStore();const Counter = observer(() => {return (<div><p>Count: {counterStore.count}</p><button onClick={counterStore.increment}>Increment</button></div>);
});const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Counter />);

在这个例子中,makeObservable 将 count 标记为可观察的状态,increment 标记为 action。当调用 increment 方法更新 count 状态时,Counter 组件会自动重新渲染。

综上所述,React 通过状态管理和组件更新机制来实现数据变化驱动 UI 更新,不同的方式适用于不同复杂度的应用场景。

Vue 基于 Proxy 的自动更新机制

在 Vue 3 中,响应式系统主要基于 Proxy 来实现。当你使用 reactive 或 ref 创建响应式数据时,Vue 会使用 Proxy 对数据对象进行包装。

<template><div><p>{{ count }}</p><button @click="increment">增加</button></div>
</template><script setup>
import { ref } from 'vue';const count = ref(0);const increment = () => {count.value++; // 修改响应式数据
};
</script>
原理说明
  • 当你修改 count.value 时,Proxy 会捕获到这个变化。Vue 内部的依赖收集和追踪机制会记录哪些组件使用了这个 count 数据。
  • 一旦数据发生变化,Vue 会自动通知依赖该数据的组件进行重新渲染,更新对应的 DOM 节点,这个过程是自动完成的,开发者无需手动干预。

React 的手动更新机制

在 React 里,无论是类组件的 this.state 和 this.setState,还是函数组件的 useState,都需要手动调用更新函数来触发组件的重新渲染。

类组件示例
import React, { Component } from 'react';class Counter extends Component {constructor(props) {super(props);this.state = {count: 0};}increment = () => {this.setState({ count: this.state.count + 1 }); // 手动调用 setState 更新状态}render() {return (<div><p>{this.state.count}</p><button onClick={this.increment}>增加</button></div>);}
}export default Counter;
函数组件示例
import React, { useState } from 'react';const Counter = () => {const [count, setCount] = useState(0);const increment = () => {setCount(count + 1); // 手动调用 setCount 更新状态};return (<div><p>{count}</p><button onClick={increment}>增加</button></div>);
};export default Counter;
原理说明
  • 在 React 中,状态是不可变的。当你想要更新状态时,需要使用特定的更新函数(如 setState 或 setCount)。调用这些函数会告诉 React 状态发生了变化,React 会重新渲染使用了该状态的组件。
  • 如果不手动调用这些更新函数,即使状态数据的引用发生了改变,React 也不会知道数据已经变化,也就不会触发组件的重新渲染。

总结

Vue 使用 Proxy 实现的响应式系统能自动追踪数据变化并更新 UI,开发者只需修改数据即可;而 React 需要开发者手动调用更新函数来通知 React 状态发生了变化,从而触发组件的重新渲染。

相关文章:

vue和reacts数据响应式的差异

Vue 的数据响应式&#xff1a; 原理&#xff1a; Vue 使用 Object.defineProperty 或 Proxy&#xff08;在 Vue 3 中&#xff09;来实现数据的响应式。当创建 Vue 实例时&#xff0c;会对 data 对象中的属性进行遍历&#xff0c;将其转换为响应式属性。对于 Object.definePro…...

doris: MAP数据类型

MAP<K, V> 表示由K, V类型元素组成的 map&#xff0c;不能作为 key 列使用。 目前支持在 Duplicate&#xff0c;Unique 模型的表中使用。 K, V 支持的类型有&#xff1a; BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DECIMALV3, DAT…...

在计算机上本地运行 Deepseek R1

Download Ollama on Linux Download Ollama on Windows Download Ollama on macOS Deepseek R1 是一个强大的人工智能模型&#xff0c;在科技界掀起了波澜。它是一个开源语言模型&#xff0c;可以与 GPT-4 等大玩家展开竞争。但更重要的是&#xff0c;与其他一些模型不同&…...

LeetCode 16. 排列序列

思路 排序数组&#xff1a;对数组进行从小到大排序。 遍历固定一个元素&#xff1a;遍历数组中的每个元素作为三个数中的第一个数&#xff0c;固定该元素后&#xff0c;使用双指针在剩余的子数组中寻找另外两个数。 双指针逼近target&#xff1a;对于每个固定的元素&#xff…...

【C++高并发服务器WebServer】-9:多线程开发

本文目录 一、线程概述1.1 线程和进程的区别1.2 线程之间共享和非共享资源1.3 NPTL 二、线程操作2.1 pthread_create2.2 pthread_exit2.3 pthread_join2.4 pthread_detach2.5 patch_cancel2.6 pthread_attr 三、实战demo四、线程同步五、死锁六、读写锁七、生产消费者模型 一、…...

全解:Redis RDB持久化和AOF持久化

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

视频外绘技术总结:Be-Your-Outpainter、Follow-Your-Canvas、M3DDM

Diffusion Models专栏文章汇总:入门与实战 前言:视频Inpaint的技术很火,但是OutPaint却热度不高,这篇博客总结比较经典的几篇视频Outpaint技术。其实Outpaint在runway等工具上很火,可是学术界对此关注比较少,博主从这三年的顶会中找到了最具代表性的三篇论文解读。 目录 …...

LLM - 大模型 ScallingLaws 的设计 100B 预训练方案(PLM) 教程(5)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145356022 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scaling Laws (缩放法则) 是大模型领域中,用于描述 模型性能(Loss) 与…...

Python帝王學集成-母稿

引用:【【全748集】这绝对是2024最全最细的Python全套教学视频,七天看完编程技术猛涨!别再走弯路了,从零基础小白到Python全栈这一套就够了!-哔哩哔哩】 https://b23.tv/lHPI3XV 语法基础 Python解释器与pycharm编辑器安装 - 定义:Python解释器负责将Python代码转换为计…...

MySQL数据导入与导出

在现代软件开发中,数据管理是一个重要的核心环节,而数据库则是进行数据管理的主要工具。MySQL 作为一款开源的关系型数据库管理系统,被广泛应用于企业和个人开发项目中。对于学习编程的初学者或是自学者来说,掌握 MySQL 的基本操作尤为重要,尤其是数据的导入与导出功能。这…...

微服务面试题:概览

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

每日一题 430. 扁平化多级双向链表

430. 扁平化多级双向链表 简单 /*class Solution { public:Node* flatten(Node* head) {Node* tail nullptr;return dfs(head);}Node* dfs(Node* head){Node* cur head;while(cur ! nullptr){if(cur->child ! nullptr){Node* curChild getTail(cur->child);Node* te…...

冯诺依曼系统及操作系统

目录 一.冯诺依曼体系结构 二.操作系统 三.系统调用和库函数概念 一.冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是由一…...

双指针(典型算法思想)——OJ例题算法解析思路

目录 一、283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 1. 问题分析 2. 算法思路 3. 代码逐行解析 4. 示例运行 5. 时间复杂度与空间复杂度 6. 总结 二、1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 1. 问题分析 2. 算法思路 3. 代码逐行解析 4. …...

大数据Hadoop入门1

目录 相关资料 第一部分 1.课程内容大纲和学习目标 2.数据分析和企业数据分析方向 3.数据分析基本流程步骤 4.大数据时代 5.分布式和集群 6.Linux操作系统概述 7.VMware虚拟机概念与安装 8.centos操作系统的虚拟机导入 9.VMware虚拟机常规使用、快照 第二部分 1.课…...

Ubuntu-手动安装 SBT

文章目录 前言Ubuntu-手动安装 SBT1. SBT是什么?1.1. SBT 的特点1.2. SBT 的基本功能1.3. SBT 的常用命令 2. 安装2.1. 下载2.2. 解压 sbt 二进制包2.3. 确认 sbt 可执行文件的位置2.4. 设置执行权限2.5. 创建符号链接2.6. 更新 PATH 环境变量2.7. 验证 sbt 安装 前言 如果您觉…...

人工智能:农业领域的变革力量

在当今科技飞速发展的时代&#xff0c;人工智能正以前所未有的态势渗透进各个领域&#xff0c;农业也不例外。想象一下&#xff0c;未来的农田里&#xff0c;农民不再是弯腰劳作的形象&#xff0c;而是坐在高科技的“智能农场”里&#xff0c;悠闲地喝着咖啡&#xff0c;指挥着…...

Qt——界面优化

一.QSS 1.背景 在网页前端开发领域中&#xff0c; CSS 是⼀个至关重要的部分。 描述了⼀个网页的 "样式"。 从而起到对网页美化的作用。 所谓样式&#xff0c;包括不限于大小&#xff0c;位置&#xff0c;颜色&#xff0c;背景&#xff0c;间距&#xff0c;字体等等…...

Qt Designer and Python: Build Your GUI

1.install pyside6 2.pyside6-designer.exe 发送到桌面快捷方式 在Python安装的所在 Scripts 文件夹下找到此文件。如C:\Program Files\Python312\Scripts 3. 打开pyside6-designer 设计UI 4.保存为simple.ui 文件&#xff0c;再转成py文件 用代码执行 pyside6-uic.exe simpl…...

HarmonyOS DevEco Studio模拟器点击运行没有反应的解决方法

HarmonyOS DevEco Studio模拟器点击运行没有反应的解决方法 翻遍了CSDN&#xff0c;试了所有办法都没办法&#xff0c;最后偶然间竟然解决了 解决方法其实很简单&#xff1a;本地模拟器下载路径下面不能有中文。。。。。 切换正确路径以后&#xff0c;成功运行&#xff0c;哦…...

java中的算数运算符

1.java中的加法是“”。 简单数字的相加对于byte.short.char.int类型数字相加时进行整形提升至int,对于数据类型大于int的long.float.double数据类型有参与计算时&#xff0c;需要进行整形提升至最高的数据类型。 有字符串类型的相加&#xff0c;将数字视为字符串进行字符串的…...

【数据结构】二叉树

二叉树 1. 树型结构&#xff08;了解&#xff09;1.1 概念1.2 概念&#xff08;重要&#xff09;1.3 树的表示形式&#xff08;了解&#xff09;1.4 树的应用 2. 二叉树&#xff08;重点&#xff09;2.1 概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的…...

websocket实现

由于安卓资源管理器展示的路径不尽相同,各种软件保存文件的位置也不一定一样.对于普通用户上传文件时,查找文件可能是一个麻烦的事情.后来想到了一个办法,使用pc端进行辅助上传. 文章目录 实现思路1.0 实现定义web与客户端通信数据类型和数据格式web端websocket实现web端对客户…...

AI软件外包需要注意什么 外包开发AI软件的关键因素是什么 如何选择AI外包开发语言

1. 定义目标与需求 首先&#xff0c;要明确你希望AI智能体做什么。是自动化任务、数据分析、自然语言处理&#xff0c;还是其他功能&#xff1f;明确目标可以帮助你选择合适的技术和方法。 2. 选择开发平台与工具 开发AI智能体的软件时&#xff0c;你需要选择适合的编程语言、…...

电梯系统的UML文档12

5.2.1 DoorControl 的状态图 图 19: DoorControl 的状态图 5.2.2 DriveControl 的状态图 图 20: DriveControl 的状态图 5.2.3 LanternControl 的状态图 图 21: LanternControl 的状态图 5.2.4 HallButtonControl 的状态图 图 22: HallButtonControl 的状态图 5.2.5 CarB…...

【华为路由的arp配置】

华为路由的arp配置 ARP&#xff1a;IP地址与MAC地址的映射。 R1: g0/0/0:10.1.1.254/24 g0/0/1:10.1.2.254/24 PC1: 10.1.1.1/16 PC2: 10.1.1.2/16 PC3: 10.1.2.3/16 动态ARP 查看PC1的arp表&#xff0c;可以看到&#xff0c;列表为空。 查看R1的arp表 在PC3上ping命令测…...

Web 代理、爬行器和爬虫

目录 Web 在线网页代理服务器的使用方法Web 在线网页代理服务器使用流程详解注意事项 Web 请求和响应中的代理方式Web 开发中的请求方法借助代理进行文件下载的示例 Web 服务器请求代理方式代理、网关和隧道的概念参考文献说明 爬虫的工作原理及案例网络爬虫概述爬虫工作原理 W…...

node 爬虫开发内存处理 zp_stoken 作为案例分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 前言 主要说3种我们补环境过后如果用…...

【Samba】Ubuntu20.04 Windows 共享文件夹

【Samba】Ubuntu20.04 Windows 共享文件夹 前言整体思路检查 Ubuntu 端 和 Windows 网络通信是否正常创建共享文件夹安装并配置 Samba 服务器安装 Samba 服务器创建 Samba 用户编辑 Samba 配置文件重启 Samba 服务器 在 Windows 端 访问 Ubuntu 的共享文件夹 前言 本文基于 Ub…...

windows下本地部署安装hadoop+scala+spark-【不需要虚拟机】

注意版本依赖【本实验版本如下】 Hadoop 3.1.1 spark 2.3.2 scala 2.11 1.依赖环境 1.1 java 安装java并配置环境变量【如果未安装搜索其他教程】 环境验证如下&#xff1a; C:\Users\wangning>java -version java version "1.8.0_261" Java(TM) SE Runti…...

GitHub 仓库的 Archived 功能详解:中英双语

GitHub 仓库的 Archived 功能详解 一、什么是 GitHub 仓库的 “Archived” 功能&#xff1f; 在 GitHub 上&#xff0c;“Archived” 是一个专门用于标记仓库状态的功能。当仓库被归档后&#xff0c;它变为只读模式&#xff0c;所有的功能如提交代码、创建 issue 和 pull req…...

银行卡三要素验证接口:方便快捷地实现银行卡核验功能

银行卡三要素验证API&#xff1a;防止欺诈交易的有力武器 随着互联网的发展&#xff0c;电子支付方式也越来越普及。在支付过程中&#xff0c;银行卡是最常用的支付工具之一。然而&#xff0c;在一些支付场景中&#xff0c;需要对用户的银行卡信息进行验证&#xff0c;以确保支…...

Banana JS,一个严格子集 JavaScript 的解释器

项目地址&#xff1a;https://github.com/shajunxing/banana-js 特色 我的目标是剔除我在实践中总结的JavaScript语言的没用的和模棱两可的部分&#xff0c;只保留我喜欢和需要的&#xff0c;创建一个最小的语法解释器。只支持 JSON 兼容的数据类型和函数&#xff0c;函数是第…...

引领未来科技潮流:Web3 前沿发展趋势

随着技术不断发展&#xff0c;我们正站在一个全新的互联网时代的门槛上&#xff0c;Web3的出现正在重新定义互联网的构架和运作方式。Web3&#xff0c;作为互联网的下一代发展趋势&#xff0c;其核心思想是去中心化、开放与用户主权。与现有的Web2.0相比&#xff0c;Web3更加注…...

OpenCV:在图像中添加高斯噪声、胡椒噪声

目录 在图像中添加高斯噪声 高斯噪声的特性 添加高斯噪声的实现 给图像添加胡椒噪声 实现胡椒噪声的步骤 相关阅读 OpenCV&#xff1a;图像处理中的低通滤波-CSDN博客 OpenCV&#xff1a;高通滤波之索贝尔、沙尔和拉普拉斯-CSDN博客 OpenCV&#xff1a;图像滤波、卷积与…...

在深度Linux (Deepin) 20中安装Nvidia驱动

文章创作不易&#xff0c;麻烦大家点赞关注收藏一键三连。 在Deepin上面跑Tensorflow, pytorch等人工智能框架不是一件容易的事情。特别是如果你要使用GPU&#xff0c;就得有nvidia的驱动。默认情况下Deepin系统自带的是nouveau开源驱动。这是没办法用tensorflow的。下面内容是…...

PC端实现PDF预览(支持后端返回文件流 || 返回文件URL)

一、使用插件 插件名称&#xff1a;vue-office/pdf 版本&#xff1a;2.0.2 安装插件&#xff1a;npm i vue-office/pdf^2.0.2 1、“vue-office/pdf”: “^2.0.2”, 2、 npm i vue-office/pdf^2.0.2 二、代码实现 // 引入组件 &#xff08;在需要使用的页面中直接引入&#x…...

【ESP32】ESP-IDF开发 | WiFi开发 | UDP用户数据报协议 + UDP客户端和服务器例程

1. 简介 UDP协议&#xff08;User Datagram Protocol&#xff09;&#xff0c;全称用户数据报协议&#xff0c;它是一种面向非连接的协议&#xff0c;面向非连接指的是在正式通信前不必与对方先建立连接&#xff0c; 不管对方状态就直接发送。至于对方是否可以接收到这些数据内…...

OpenAI的真正对手?DeepSeek-R1如何用强化学习重构LLM能力边界——DeepSeek-R1论文精读

2025年1月20日&#xff0c;DeepSeek-R1 发布&#xff0c;并同步开源模型权重。截至目前&#xff0c;DeepSeek 发布的 iOS 应用甚至超越了 ChatGPT 的官方应用&#xff0c;直接登顶 AppStore。 DeepSeek-R1 一经发布&#xff0c;各种资讯已经铺天盖地&#xff0c;那就让我们一起…...

es数据同步

Logstash 是 Elastic 技术栈中的一个技术&#xff0c;它是一个数据采集引擎&#xff0c;可以从数据库采集数据到 ES 中。可以通过设置 自增 ID 主键 或 更新时间 来控制数据的自动同步&#xff1a; 自增 ID 主键&#xff1a;Logstatsh 会有定时任务&#xff0c;如果发现有主键…...

【JavaScript笔记】01- 原型及原型链(面试高频内容)

前言 JavaScript作为前端入门三件套之一&#xff0c;也是前端求职的必会知识&#xff0c;重要性不言而喻。 这个系列分享个人学习JavaScript的记录&#xff0c;和大家一起学习讨论。 下面介绍关于原型&原型链的相关重要知识点。 1、构造函数创建对象 function Student(…...

【Python】第五弹---深入理解函数:从基础到进阶的全面解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【MySQL】【Python】 目录 1、函数 1.1、函数是什么 1.2、语法格式 1.3、函数参数 1.4、函数返回值 1.5、变量作用域 1.6、函数…...

动态规划DP 数字三角形模型(模型分析+例题分析+C++代码实现)(数字三角形、摘花生、最低通行费用、方格取数、传纸条)

总体概览 数字三角形 原题链接 AcWing 898.数字三角形 题目描述 给定一个如下图所示的数字三角形&#xff0c;从顶部出发&#xff0c;在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使路…...

2025 最新flutter面试总结

目录 1.Dart是值传递还是引用传递&#xff1f; 2.Flutter 是单引擎还是双引擎 3. StatelessWidget 和 StatefulWidget 在 Flutter 中有什么区别&#xff1f; 4.简述Dart语音特性 5. Navigator 是什么&#xff1f;在 Flutter 中 Routes 是什么&#xff1f; 6、Dart 是不是…...

Java后端之AOP

AOP&#xff1a;面向切面编程&#xff0c;本质是面向特定方法编程 引入依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>示例&#xff1a;记录…...

JS中对数组的操作哪些会改变原数组哪些不会?今天你一定要记下!

JavaScript 数组方法&#xff1a;变更原数组与不变更原数组的区别 在 JavaScript 中&#xff0c;数组是非常常见且重要的数据结构。作为开发者&#xff0c;我们常常需要使用数组方法来处理数组数据。但是&#xff0c;数组的不同方法会以不同的方式影响原数组&#xff0c;它们可…...

ubuntu x64下交叉编译ffmpeg到目标架构为aarch架构的系统

参考链接 https://blog.csdn.net/qq_46396470/article/details/137794498...

Java进阶(二):Java设计模式

目录 设计模式 一.建模语言 二.类之间的关系 1.依赖关系 2.关联关系 3.聚合关系 4.组合关系 5.继承关系 6.实现关系 三.面向对象设计原则 单一职责原则 开闭原则 里氏替换原则 依赖倒置 接口隔离原则 迪米特原则 组合/聚合(关联关系)复用原则 四.23种设计模式…...

python学opencv|读取图像(四十二)使用cv2.add()函数实现多图像叠加

【1】引言 前序学习过程中&#xff0c;掌握了灰度图像和彩色图像的掩模操作&#xff1a; python学opencv|读取图像&#xff08;九&#xff09;用numpy创建黑白相间灰度图_numpy生成全黑图片-CSDN博客 python学opencv|读取图像&#xff08;四十&#xff09;掩模&#xff1a;三…...

DIY QMK量子键盘

最近放假了&#xff0c;趁这个空余在做一个分支项目&#xff0c;一款机械键盘&#xff0c;量子键盘取自固件名称QMK&#xff08;Quantum Mechanical Keyboard&#xff09;。 键盘作为计算机或其他电子设备的重要输入设备之一&#xff0c;通过将按键的物理动作转换为数字信号&am…...