React 组件通信完整指南 以及 自定义事件发布订阅系统
React 组件通信完整指南
1. 父子组件通信
1.1 父组件向子组件传递数据
// 父组件
function ParentComponent() {const [data, setData] = useState('Hello from parent');return <ChildComponent message={data} />;
}// 子组件
function ChildComponent({ message }) {return <div>{message}</div>;
}
1.2 子组件向父组件传递数据
// 父组件
function ParentComponent() {const handleChildData = (data) => {console.log('Received from child:', data);};return <ChildComponent onDataSend={handleChildData} />;
}// 子组件
function ChildComponent({ onDataSend }) {const sendData = () => {onDataSend('Hello from child');};return <button onClick={sendData}>Send Data to Parent</button>;
}
1.3 父组件调用子组件方法
// 父组件
function ParentComponent() {const childRef = useRef();const handleClick = () => {childRef.current.childMethod();};return (<div><ChildComponent ref={childRef} /><button onClick={handleClick}>Call Child Method</button></div>);
}// 子组件
const ChildComponent = forwardRef((props, ref) => {useImperativeHandle(ref, () => ({childMethod: () => {console.log('Child method called');}}));return <div>Child Component</div>;
});
2. 兄弟组件通信
2.1 通过共同父组件
function ParentComponent() {const [sharedData, setSharedData] = useState('');return (<div><SiblingOne onDataChange={setSharedData} /><SiblingTwo data={sharedData} /></div>);
}function SiblingOne({ onDataChange }) {return (<button onClick={() => onDataChange('Hello from Sibling One')}>Send to Sibling</button>);
}function SiblingTwo({ data }) {return <div>Received: {data}</div>;
}
2.2 使用 Context
// 创建 Context
const DataContext = React.createContext();// 父组件提供 Context
function ParentComponent() {const [sharedData, setSharedData] = useState('');return (<DataContext.Provider value={{ data: sharedData, setData: setSharedData }}><SiblingOne /><SiblingTwo /></DataContext.Provider>);
}// 兄弟组件一
function SiblingOne() {const { setData } = useContext(DataContext);return (<button onClick={() => setData('Hello from Context')}>Update Context</button>);
}// 兄弟组件二
function SiblingTwo() {const { data } = useContext(DataContext);return <div>Context Data: {data}</div>;
}
3. 消息订阅与发布
3.1 使用 PubSubJS
PubSubJS 是一个基于主题的发布/订阅库。
- 官方文档: https://github.com/mroderick/PubSubJS
- 安装:
npm install pubsub-js
- 接受消息的组件订阅消息
- 提供数据的组件发布消息
- 可在兄弟组件,祖孙组件进行通讯
基本用法示例
import PubSub from 'pubsub-js';// 定义消息主题
const TOPICS = {USER_LOGGED_IN: 'USER_LOGGED_IN',DATA_UPDATED: 'DATA_UPDATED',NOTIFICATION: 'NOTIFICATION'
};// 登录组件(发布者)
function LoginComponent() {const handleLogin = () => {// 登录成功后发布消息PubSub.publish(TOPICS.USER_LOGGED_IN, {userId: '123',username: 'john_doe',timestamp: new Date()});};return <button onClick={handleLogin}>Login</button>;
}// 头部组件(订阅者)
function HeaderComponent() {const [username, setUsername] = useState('');useEffect(() => {// 订阅登录消息const token = PubSub.subscribe(TOPICS.USER_LOGGED_IN, (topic, data) => {setUsername(data.username);console.log(`User ${data.username} logged in at ${data.timestamp}`);});return () => {// 组件卸载时取消订阅PubSub.unsubscribe(token);};}, []);return <div>Welcome, {username}</div>;
}// 通知组件(订阅者)
function NotificationComponent() {const [notifications, setNotifications] = useState([]);useEffect(() => {// 可以同时订阅多个主题const tokens = [PubSub.subscribe(TOPICS.USER_LOGGED_IN, (topic, data) => {setNotifications(prev => [...prev, `New login: ${data.username}`]);}),PubSub.subscribe(TOPICS.DATA_UPDATED, (topic, data) => {setNotifications(prev => [...prev, `Data updated: ${data.message}`]);})];return () => {// 清理所有订阅tokens.forEach(token => PubSub.unsubscribe(token));};}, []);return (<div><h3>Notifications</h3><ul>{notifications.map((note, index) => (<li key={index}>{note}</li>))}</ul></div>);
}
3.2 自定义事件发布订阅系统
// eventBus.js
class EventBus {constructor() {this.events = {};}subscribe(event, callback) {if (!this.events[event]) {this.events[event] = [];}this.events[event].push(callback);return () => {this.events[event] = this.events[event].filter(cb => cb !== callback);};}publish(event, data) {if (this.events[event]) {this.events[event].forEach(callback => callback(data));}}
}export default new EventBus();
3.2.1. EventBus 类
class EventBus {constructor() {this.events = {};}
EventBus 是一个类,里面有一个 events 对象,用来存储所有事件及其对应的回调函数。
this.events 以事件名为键 (key),回调函数数组为值 (value),用来存储订阅的事件和回调函数。
3.2.2. subscribe 方法
subscribe(event, callback) {if (!this.events[event]) {this.events[event] = [];}this.events[event].push(callback);return () => {this.events[event] = this.events[event].filter(cb => cb !== callback);};
}
subscribe 方法用于订阅某个事件 (event) 并提供一个回调函数 (callback)。
如果事件名 event 不存在于 this.events 中,会初始化为一个空数组。
然后把回调函数添加到事件对应的回调函数数组中。
subscribe 方法返回一个取消订阅的函数。这是通过在返回值中使用 filter 方法,从 this.events[event] 数组中移除给定的回调函数来实现的。
订阅示例:
const unsubscribe = eventBus.subscribe('someEvent', (data) => {console.log(data);
});
这样,当 ‘someEvent’ 事件发生时,回调会执行。
调用 unsubscribe() 可以取消订阅该事件的回调。
3.2.3. publish 方法
publish(event, data) {if (this.events[event]) {this.events[event].forEach(callback => callback(data));}
}
publish 方法用于触发某个事件 (event),并向订阅该事件的回调函数传递数据 (data)。
如果事件在 this.events 中存在,它会依次执行所有与该事件相关的回调函数,并把 data 作为参数传递给回调函数。
发布事件示例:
eventBus.publish('someEvent', { key: 'value' });
这会触发所有订阅 ‘someEvent’ 的回调,并将 { key: ‘value’ } 传递给它们。
3.2.4. 实例化 EventBus
export default new EventBus();
这一行创建了一个 EventBus 的实例,并将其导出。这样其他模块就可以直接使用这个实例来订阅和发布事件,而无需每次都创建新的 EventBus 实例。
3.2.5 总结
订阅事件:通过 subscribe 方法,可以为某个事件注册一个回调函数。
发布事件:通过 publish 方法,可以触发某个事件,并将数据传递给所有已订阅该事件的回调函数。
取消订阅:subscribe 返回的函数可以用来取消订阅某个事件。
// 使用自定义事件系统
import eventBus from './eventBus';// 发布者组件
function Publisher() {const publishEvent = () => {eventBus.publish('customEvent', {message: 'Hello from custom event'});};return <button onClick={publishEvent}>Publish Event</button>;
}// 订阅者组件
function Subscriber() {const [message, setMessage] = useState('');useEffect(() => {const unsubscribe = eventBus.subscribe('customEvent', (data) => {setMessage(data.message);});return () => unsubscribe();}, []);return <div>Custom Event Message: {message}</div>;
}
3.3 使用 RxJS
// 安装: npm install rxjsimport { Subject } from 'rxjs';const messageSubject = new Subject();// 发布者组件
function RxPublisher() {const publishMessage = () => {messageSubject.next({text: 'Hello from RxJS',timestamp: new Date()});};return <button onClick={publishMessage}>Publish RxJS Message</button>;
}// 订阅者组件
function RxSubscriber() {const [message, setMessage] = useState('');useEffect(() => {const subscription = messageSubject.subscribe(data => {setMessage(data.text);});return () => subscription.unsubscribe();}, []);return <div>RxJS Message: {message}</div>;
}
4. 最佳实践
4.1 选择合适的通信方式
-
父子组件通信:
- 优先使用 props 和回调函数
- 需要调用子组件方法时使用 ref
-
兄弟组件通信:
- 简单场景:通过共同父组件
- 复杂场景:使用 Context 或状态管理库
-
跨层级组件通信:
- 使用 Context
- 使用消息订阅发布
- 考虑使用状态管理库(Redux/MobX)
4.2 性能优化
// 使用 useMemo 优化 props
function ParentComponent() {const [count, setCount] = useState(0);const expensiveData = useMemo(() => {return computeExpensiveValue(count);}, [count]);return <ChildComponent data={expensiveData} />;
}// 使用 useCallback 优化回调函数
function ParentComponent() {const handleClick = useCallback((value) => {console.log(value);}, []);return <ChildComponent onClick={handleClick} />;
}
4.3 注意事项
- 清理订阅
useEffect(() => {const subscription = someEventSource.subscribe();return () => subscription.unsubscribe();
}, []);
- 避免过度使用全局状态
// 不推荐
const GlobalContext = React.createContext();// 推荐:将 Context 拆分为更小的粒度
const UserContext = React.createContext();
const ThemeContext = React.createContext();
- 合理使用 memo
const MemoizedChild = React.memo(ChildComponent, (prevProps, nextProps) => {return prevProps.value === nextProps.value;
});
5. 总结
组件通信方式选择建议:
-
就近原则:
- 父子组件优先使用 props
- 兄弟组件优先通过父组件通信
-
灵活性考虑:
- 简单场景使用 props 和回调
- 复杂场景考虑发布订阅或状态管理
-
性能考虑:
- 合理使用 useMemo 和 useCallback
- 适当使用 React.memo
- 注意清理订阅避免内存泄漏
-
维护性考虑:
- 保持通信逻辑清晰
- 避免过度使用全局状态
- 合理划分组件职责
实际应用场景
- 跨组件通信:
// 数据更新组件(发布者)
function DataUpdateComponent() {const updateData = () => {// 执行数据更新操作PubSub.publish(TOPICS.DATA_UPDATED, {message: 'Data has been updated',timestamp: new Date()});};return <button onClick={updateData}>Update Data</button>;
}// 多个需要响应数据更新的组件(订阅者)
function TableComponent() {const [data, setData] = useState([]);useEffect(() => {const token = PubSub.subscribe(TOPICS.DATA_UPDATED, () => {// 重新获取数据fetchData().then(setData);});return () => PubSub.unsubscribe(token);}, []);return <table>{/* 渲染数据 */}</table>;
}function ChartComponent() {const [chartData, setChartData] = useState(null);useEffect(() => {const token = PubSub.subscribe(TOPICS.DATA_UPDATED, () => {// 更新图表数据updateChartData();});return () => PubSub.unsubscribe(token);}, []);return <div>{/* 渲染图表 */}</div>;
}
- 全局状态变化通知:
// 主题切换组件(发布者)
function ThemeToggle() {const toggleTheme = () => {const newTheme = 'dark';PubSub.publish('THEME_CHANGED', { theme: newTheme });};return <button onClick={toggleTheme}>Toggle Theme</button>;
}// 需要响应主题变化的组件(订阅者)
function ThemedComponent() {const [theme, setTheme] = useState('light');useEffect(() => {const token = PubSub.subscribe('THEME_CHANGED', (_, data) => {setTheme(data.theme);// 更新组件样式});return () => PubSub.unsubscribe(token);}, []);return <div className={theme}>{/* 组件内容 */}</div>;
}
3.2 使用注意事项
- 命名约定:
// 使用常量定义主题名称
const TOPICS = {USER_ACTION: 'USER_ACTION',SYSTEM_EVENT: 'SYSTEM_EVENT',DATA_CHANGE: 'DATA_CHANGE'
};// 使用命名空间避免冲突
const TOPICS = {USER: {LOGIN: 'USER.LOGIN',LOGOUT: 'USER.LOGOUT'},DATA: {UPDATE: 'DATA.UPDATE',DELETE: 'DATA.DELETE'}
};
- 性能考虑:
function OptimizedComponent() {useEffect(() => {// 使用防抖或节流处理高频事件const handleDataChange = debounce((topic, data) => {// 处理数据变化}, 200);const token = PubSub.subscribe('DATA_CHANGE', handleDataChange);return () => PubSub.unsubscribe(token);}, []);
}
- 错误处理:
function RobustSubscriber() {useEffect(() => {const token = PubSub.subscribe('TOPIC', (topic, data) => {try {// 处理数据} catch (error) {console.error('Error handling published data:', error);// 错误处理逻辑}});return () => PubSub.unsubscribe(token);}, []);
}
相关文章:
React 组件通信完整指南 以及 自定义事件发布订阅系统
React 组件通信完整指南 1. 父子组件通信 1.1 父组件向子组件传递数据 // 父组件 function ParentComponent() {const [data, setData] useState(Hello from parent);return <ChildComponent message{data} />; }// 子组件 function ChildComponent({ message }) {re…...
代码随想录算法【Day5\Day6】
DAY5\Day6 1.熟悉哈希表的数据结构:数组、map和set,使用方法、使用场景 2.哈希表应用场景:解决给你一个元素,判断它在集合里是否出现过。 242.有效的字母异位词 本题用数组解决的。 class Solution { public:bool isAnagram(…...
Oracle 数据库执行计划的查看与分析技巧
目录 Oracle 数据库执行计划的查看与分析技巧一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 SQL Developer 工具查看(三)启用 AUTOTRACE 功能 三、执行计划中的关键信息解读…...
VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比
VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比 目录 VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现VMD-SSA-BiLSTM、VMD-BiLSTM、BiLSTM时间序列预测对比; 2.单变量时间序列预测 就是先vmd把变…...
QGIS二次开发(地图符号库操作)
实习三 地图符号库操作 3.1 任务要求 基于QGIS,实现地图符号的设计/存储与显示;基于QGIS实现一个点、线、面shp矢量图层文件的显示。通过设置引用的符号,改变矢量图层的显示效果;可编辑地图的符号库汇中的点符号、线符号、面符号…...
wordpress网站用token登入开发过程
生成跳转token 示例: function generate_login_token($user_id, $secret_key) {$payload [user_id > $user_id,timestamp > time(),];$payload_json json_encode($payload);$signature hash_hmac(sha256, $payload_json, $secret_key);return base64_en…...
Uniapp在浏览器拉起导航
Uniapp在浏览器拉起导航 最近涉及到要在浏览器中拉起导航,对目标点进行路线规划等功能,踩了一些坑,找到了使用方法。(浏览器拉起) 效果展示 可以拉起三大平台及苹果导航 点击选中某个导航,会携带经纬度跳转…...
在 CentOS 上安装 FFmpeg
在CentOS 上安装 FFmpeg 方法一:在线安装 添加 EPEL 和 RPM Fusion 源: sudo yum install epel-release sudo yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$(rpm -E %rhel).noarch.rpm安装 FFmpeg: sudo yu…...
影刀进阶指令 | liblib反推 (SD AI绘图反推)
文章目录 影刀进阶指令 | liblib反推 (SD AI绘图反推)一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 获取png地址2\. 打开页面3\. 上传png文件4\. 获取png的prompt信息 四. 运维 影刀进阶指令 | liblib反推 (SD AI绘图反推) 先看看我们要实现的功能,li…...
WebStorm 创建一个Vue项目
一、下载并安装WebStorm 步骤一 步骤二 选择激活方式 激活码: I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25rAIOa0uW3peS9nOWupC…...
回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归预测
回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-LSTM卷积长短期记忆神经网络多输入单输出回归…...
rust windwos 两个edit框
use winapi::shared::minwindef::LOWORD; use windows::{core::*,Win32::{Foundation::*,Graphics::Gdi::{BeginPaint, EndPaint, PAINTSTRUCT},System::LibraryLoader::GetModuleHandleA,UI::WindowsAndMessaging::*,}, };// 两个全局静态变量,用于保存 Edit 控件的…...
ArcGIS计算矢量要素集中每一个面的遥感影像平均值、最大值等统计指标
本文介绍在ArcMap软件中,基于矢量面要素集,计算在其中每一个面区域内,遥感影像的像元个数、平均值、总和等统计值,并将统计信息附加到矢量图层的属性表中的方法。 首先,明确一下本文的需求。现在有一个矢量面要素集&am…...
JavaScript高级程序设计基础(十一)
上接语言基础:JavaScript高级程序设计基础(十) 五、集合引用类型 5.1 object 此处简单介绍object,object由两种方式可以创造:由构造函数new Object(),或者对象字面量。如果想要修改对象的值可以用点语法,如object.na…...
【服务器学习专栏 1.2 -- 带外管理】
请阅读 嵌入式学习必备专栏 文章目录 Overview服务器带外管理BMC 介绍BMC 特点BMC 工作原理 Overview 从技术的角度,网络管理可分为带外管理(out-of-band)和带内管理(in-band)两种管理模式。 带内管理,是指…...
《Vue3 二》Vue 的模板语法
在 React 中,想要编写 HTML,是使用 JSX,之后通过 Babel 将 JSX 编译成 React.createElement 函数调用;在 Vue 中,也支持 JSX 的开发模式,但大多数情况下都是使用基于 HTML 的模板语法,在模板中允…...
手机租赁平台开发全攻略打造高效便捷的租赁服务系统
内容概要 手机租赁平台开发,简单说就是让用户能轻松租赁各类手机的高效系统。这一平台不仅帮助那些想要临时使用高端手机的人们节省了不少资金,还为商家开辟了新的收入渠道。随着智能手机的普及,很多人并不需要长期拥有一部手机,…...
【Ext.js 初步入门】Ext.js 作用以及用法 概述
一、Ext.js的作用 首先我们需要了解类似Ext.js以及easyui类似产品的作用是什么。 我的理解是就是相当于一个组件库,它与bootstrap类似产品的区别在于,bootstrap与ext.js和easyui面向的问题不同,bootstrap面向的问题样式,ext.js和…...
基于源码剖析:深度解读JVM底层运行机制
每日禅语 佛说,给你修路的,是你自己;埋葬你的,也是你自己;帮助你的,是你自己;毁灭你的,也是你自己;成就你的,自然还是你自己。所以佛说:自作自受&…...
redis延迟队列
Redis延迟队列 Redis延迟队列是基于Redis构建的消息队列,用来处理需延迟执行的任务。 基本原理 它借助Redis的有序集合(Sorted Set)数据结构达成目的。会把任务及其执行时间分别当成成员与分值存进有序集合,由于执行时间作为分值&…...
GDPU Vue前端框架开发 期末赛道出勇士篇(更新ing)
记住,年底陪你跨年的不会仅是方便面跟你的闺蜜,还有孑的笔记。 选择题 1.下列选项用于设置Vue.js页面视图的元素是()。 A. Template B. script C. style D. title 2.下列选项中能够定义Vuejs根实例对象的元素是(&…...
WordPress TutorLMS插件 SQL注入漏洞复现(CVE-2024-10400)(附脚本)
0x01 产品描述: Tutor LMS是一个功能强大的...
小程序配置文件 —— 14 全局配置 - tabbar配置
全局配置 - tabBar配置 tabBar 字段:定义小程序顶部、底部 tab 栏,用以实现页面之间的快速切换;可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页面; 在上面图中,标注了一些 tabBar …...
基于python+Django+mysql文档格式转换工具系统设计与实现
博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程ÿ…...
异步线程池中,ThreadPoolTaskExecutor和ThreadPoolExecutor有什么区别?
异步线程池中,org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor和java.util.concurrent.ThreadPoolExecutor有什么区别? org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor 和 java.util.concurrent.ThreadPoolExec…...
【机器学习】SVM支持向量机(二)
介绍 支持向量机(Support Vector Machine, SVM)是一种监督学习模型,广泛应用于分类和回归分析。SVM 的核心思想是通过找到一个最优的超平面来划分不同类别的数据点,并且尽可能地最大化离该超平面最近的数据点(支持向量…...
基于NodeMCU的物联网电灯控制系统设计
最终效果 基于NodeMCU的物联网电灯控制系统设计 小程序关灯 上图展现了小程序关灯过程的数据传输过程:用户下达关灯指令→小程序下发关灯指令→MQTT服务器接收关灯指令→下位机接收与处理关灯指令。 项目介绍 该项目是“物联网实验室监测控制系统设计(…...
源码安装redis后配置redis开机自启动
initd风格 #!/bin/sh ### BEGIN INIT INFO # Provides: redis # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/stop Redis server ### END…...
WebRTC服务质量(11)- Pacer机制(03) IntervalBudget
WebRTC服务质量(01)- Qos概述 WebRTC服务质量(02)- RTP协议 WebRTC服务质量(03)- RTCP协议 WebRTC服务质量(04)- 重传机制(01) RTX NACK概述 WebRTC服务质量(…...
22.跳过报错(最简) C#例子
这是一个跳过报错的例子,如果代码出错了会自动跳过,代码正确了就正常执行。 然而这不是一种推荐的做法,正确的做法应该是使用bool类型的值去检测代码运行结果,然后分支判断,在代码内部解决错误。 这只是一种好玩的做…...
windows 本地node版本快速升级
文章目录 前言一、前置条件二、使用步骤1.查看node 安装位置2.下载指定的node 版本3.下载后进行解压缩4. 删除覆盖原来的node文件夹内容5. 验证 总结 前言 Node.js 是一个开源、跨平台的JavaScript运行时环境,它允许开发者在服务器端运行JavaScript代码。Node.js 基…...
windows安装mongodb
一.安装包准备 1.服务端下载 https://www.mongodb.com/try/download/communitya 按需选择,我们这里选择社区版 直接点download浏览器下载可能比较慢,可以尝试copy link后用三方下载软件,会快很多。 2.命令行客户端下载 https://www.mong…...
一文读懂混合专家模型(MoE)
一文读懂混合专家模型(MoE) 概述 混合专家模型(Mixture of Experts,MoE)是一种机器学习和深度学习中的模型架构,它通过多个“专家”子模型来处理不同类型的输入数据或任务。在MoE模型中,输入数…...
自然语言处理(NLP)中的事件检测和事件抽取
事件检测和事件抽取是自然语言处理(NLP)中的两个重要任务,主要用于从文本中识别和提取事件及其相关信息。这两个任务在信息检索、情报分析、新闻摘要等应用中具有重要意义。 事件检测(Event Detection) 事件检测的目…...
深度学习:基于MindSpore NLP的数据并行训练
什么是数据并行? 数据并行(Data Parallelism, DP)的核心思想是将大规模的数据集分割成若干个较小的数据子集,并将这些子集分配到不同的 NPU 计算节点上,每个节点运行相同的模型副本,但处理不同的数据子集。…...
unity NAudio 获取电脑是否静音
测试,这两个办法都可以 打包出来也可以hu 想获取电脑是否静音出现编辑器模式下正常 打包出来失败 需要把 Api Compatibility Level改成.NET 4.x...
SemiDrive E3 MCAL 开发系列(6)– Icu 模块的使用
一、 概述 本文将会介绍 SemiDrive E3 MCAL Icu 模块的简介以及基本配置,其中还会涉及到 Xtrg 模块的配置。此外会结合实际操作的介绍,帮助新手快速了解并掌握这个模块的使用,文中的 MCAL 是基于 PTG3.0 的版本,开发板是官方的 …...
leetCode322.零钱兑换
题目: 给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。 你可以认为每种硬币的数量是无限的。 示例1࿱…...
【Python】什么是元组(Tuple)?
什么是元组(Tuple)? 元组(Tuple)是 Python 中的一种 不可变 的数据结构,用于存储多个元素。它类似于列表(List),但与列表不同的是,元组一旦创建,…...
zentao ubuntu上安装
#下载ZenTaoPMS-21.2-zbox_amd64.tar.gz(https://www.zentao.net/downloads.html) https://dl.zentao.net/zentao/21.2/ZenTaoPMS-21.2-zbox_amd64.tar.gzcd /opt tar -zxvf ZenTaoPMS-21.2-zbox_amd64.tar.gz#启动 /opt/zbox/zbox start /opt/zbox/zbox…...
文档解析丨高效准确的PDF解析工具,赋能企业非结构化数据治理
在数据为王的时代浪潮中,企业数据治理已成为组织优化运营、提高竞争力的关键。随着数字化进程的加速,企业所积累的数据量呈爆炸式增长,数据类型也愈发多样化,这些数据构成了现代企业数据资产的重要组成部分。 然而,传…...
Unity 实现Canvas显示3D物体
新建一个UI相机,选择渲染层为UI 将主相机的渲染层去掉UI层 、 将Canvas的RenderMode设置为Screen Space - Camera,将RenderCamera设置为UI相机 新建3D物体的UI父物体,并将3D物体的层级设置为UI层 适当的放缩3DObjParent,让3D物体能显示出来…...
OpenAI 12天发布会:AI革命的里程碑@附35页PDF文件下载
在人工智能的浪潮中,OpenAI的12天发布会无疑是2024年科技界的一场盛宴。从12月5日开始,OpenAI连续12天每天发布一个新应用或功能,标志着AI技术的又一次飞跃。本文将梳理这些激动人心的发布,带你一探究竟。 OpenAI发布会概览 Ope…...
cellphoneDB进行CCI以及可视化
除了cellchat,在单细胞转录组或者空间组的分析中,cellphoneDB也是一个常用的细胞通讯软件,这个数据库更注重配受体关系,对于有明确先验知识的配受体研究比较友好。 但值得注意的是,它的数据库只包括人的基因名称信息&…...
Facebook 上的社群文化:连接与共享
随着社交媒体的普及,Facebook作为全球最大的社交平台之一,不仅改变了人们的沟通方式,还塑造了独特的社群文化。在Facebook上,用户可以轻松地与朋友、家人保持联系,同时也能加入兴趣相投的群组、参与讨论和共享内容。社…...
数据库的概念和操作
目录 1、数据库的概念和操作 1.1 物理数据库 1. SQL SERVER 2014的三种文件类型 2. 数据库文件组 1.2 逻辑数据库 2、数据库的操作 2.1 T-SQL的语法格式 2.2 创建数据库 2.3 修改数据库 2.4 删除数据库 3、数据库的附加和分离 1、数据库的概念和操作 1.1 物理数据库…...
word运行时错误‘-2147221164(80040154)’ 没有注册类的解决办法
目录 问题描述解决方案 问题描述 解决方案 打开C盘找到路径C:\Users\Administrator\AppData\Roaming\Microsoft\Word\STARTUP或者在everything中搜索“Microsoft\Word\STARTUP”删除NEWebWordAddin.dotm文件即可正确打开word。...
Oracle数据库高级应用与优化策略
Oracle数据库高级应用与优化策略 在数据驱动的时代,Oracle数据库作为企业级数据库管理的佼佼者,以其强大的数据处理能力、高可用性和安全性,在众多行业领域中扮演着不可或缺的角色。本文旨在深入探讨Oracle数据库的高级应用与优化策略,通过具体代码使用案例,帮助开发者和…...
笔记:使用python对飞书用户活跃度统计的一个尝试
说明 一个python练习 代码 import json import time import openpyxl from openpyxl import load_workbook from datetime import datetime, timedelta import lark_oapi as lark from lark_oapi.api.admin.v1 import *def data_r(start_date, end_date):r_data []client la…...
讲解substr函数
substr JavaScript 中的 substr语法示例注意 PHP 中的 substr语法示例 Python 中的等价方法语法示例 其他语言Java 补充 substr 是编程中用于截取字符串的一个方法或函数,其功能是从一个字符串中提取出一部分子字符串。不同的编程语言中,这个功能的实现方…...