react实现一个列表的拖拽排序(react实现拖拽)
需求场景:
我的项目里需要实现一个垂直列表的拖拽排序,效果图如下图:
技术调研:
借用antd Table实现:
我的项目里使用了antd,antd表格有一个示例还是挺像的,本来我想用Table实现,它自带拖拽。但后来想了一下,还要改antd的样式,而且布局不灵活。
antd Table 拖拽排序
库调研:
核心库分类与特点
react-dnd
核心能力:基于 HTML5 拖拽 API 设计,支持复杂场景(跨容器、嵌套拖拽)
优势:灵活度高,可搭配 HTML5Backend 或自定义后端实现多端兼容
缺点:需手动处理动画效果,开发成本较高
github react-dnd
请参阅网站上的文档、教程和示例(这个需要用梯子才能访问):
http://react-dnd.github.io/react-dnd/
react-beautiful-dnd
核心能力:专注列表拖拽排序,内置流畅动画和视觉反馈
优势:API 简洁,适合垂直/水平列表场景
缺点:维护停滞(2025年已不推荐新项目使用)
github react-dnd
请参阅网站上的文档、教程和示例(这个需要用梯子才能访问):
http://react-dnd.github.io/react-dnd/
适合复杂拖拽场景
这个库的相同作者:pragmatic-drag-and-drop (这个库更强大灵活)
react-beautiful-dnd issues 2672
这个作者最后推荐了dnd-kit所以我最后选择了这个库,但其实我这个需求用react-beautiful-dnd 也能实现。
react-beautiful-dnd 例子地址
dnd-kit
核心能力:模块化设计,支持拖拽、排序、缩放等多种交互
优势:性能优异(基于 CSS Transform),支持触控设备
适用场景:现代 React 项目优先选择(活跃维护)
轻量级(核心包仅 4KB)
提供完整的 拖拽动画/碰撞检测
官方文档:dndkit.com
react-sortable-hoc
核心能力:通过高阶组件快速实现拖拽排序
缺点:已停止维护,仅适合老旧项目兼容
react-grid-layout
核心能力:网格布局拖拽(如仪表盘、表单设计器)
优势:内置响应式布局算法,支持拖拽+缩放
比较流行的有react-beautiful-dnd和dnd-kit,可能还有react-sortable-hoc,不过这个好像已经不再维护了。现在应该推荐使用比较新的库,比如dnd-kit,因为它更轻量且维护活跃。
选型建议(2025年)
需求场景 | 推荐库 | 关键理由 |
---|---|---|
复杂交互(跨容器) | react-dnd | 灵活性高,支持自定义后端 |
列表排序+动画 | dnd-kit | 性能优,维护活跃,API 友好 |
网格布局拖拽 | react-grid-layout | 专为网格设计,支持响应式 |
老旧项目维护 | react-sortable-hoc | 快速适配旧代码,无需重构 |
使用dnd-kit的步骤与代码:
官网文档使用即了解:
例子demo:
dnd-kit 垂直拖拽例子
dnd-kit 垂直拖拽例子 带手柄
切换到 Docs 然后 右下角有个showCode就能看到代码了:
其实这个demo就大致符合我的需求,我只需要修改一下布局即可!
实现效果步骤:
安装dnd-kit (使用 react版本即可):
npm install @dnd-kit/react
使用官网例子:
官网例子,点击Docs就能查看一些示例的基础代码:
import { useSortable } from '@dnd-kit/react/sortable';function Sortable({ id, index }) {const { ref } = useSortable({ id, index });return (<li ref={ref} className="item">Item {id}</li>);
}function App() {const items = [1, 2, 3, 4];return (<ul className="list">{items.map((id, index) =><Sortable key={id} id={id} index={index} />)}</ul>);
}
export default App;
如果能拖动说明引入成功了!只需要修改一下布局即可。
dnd-kit react 官网档
dnd-kit react官网例子
使用react-dnd的步骤与代码:
官网文档使用即了解:
官网的例子代码:github react-dnd examples示例代码
例子网址https://react-dnd.github.io/react-dnd/examples/sortable/simple
这个的代码地址:sortable simple
react-dnd-main\packages\examples\src\04-sortable\simple:
index.ts没什么用可以不用看。
建议之际gitcloe 下来或者 下载成zip在本地打开更方便!
具体实现react-dnd:
下载react-dnd:
npm install react-dnd react-dnd-html5-backend
把官网的例子放到项目里:
把官网的例子放到代码里看看能不能运行,能的话说明依赖下载成功。
react-dnd 推拽排序例子
新建一个组件 index.tsx:
import React from "react";
import Example from './Container';
import { DndProvider } from 'react-dnd'
import { HTML5Backend } from 'react-dnd-html5-backend'
// 定义一个名为App的函数
const App = () => {// 返回一个div元素,类名为Appreturn (<DndProvider backend={HTML5Backend}><Example /></DndProvider>);
}
export default App
新建一个Card.tsx:
import React, { useRef } from 'react';
import { useDrag, useDrop } from 'react-dnd'
// import { ItemTypes } from './ItemTypes.js'
const style = {border: '1px dashed gray',padding: '0.5rem 1rem',marginBottom: '.5rem',backgroundColor: 'white',cursor: 'move',
}
export const Card = ({ id, text, index, moveCard }) => {const ref = useRef(null)const [{ handlerId }, drop] = useDrop({accept: "card",collect(monitor) {return {handlerId: monitor.getHandlerId(),}},hover(item, monitor) {if (!ref.current) {return}const dragIndex = item.indexconst hoverIndex = index// Don't replace items with themselvesif (dragIndex === hoverIndex) {return}// Determine rectangle on screenconst hoverBoundingRect = ref.current?.getBoundingClientRect()// Get vertical middleconst hoverMiddleY =(hoverBoundingRect.bottom - hoverBoundingRect.top) / 2// Determine mouse positionconst clientOffset = monitor.getClientOffset()// Get pixels to the topconst hoverClientY = clientOffset.y - hoverBoundingRect.top// Only perform the move when the mouse has crossed half of the items height// When dragging downwards, only move when the cursor is below 50%// When dragging upwards, only move when the cursor is above 50%// Dragging downwardsif (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) {return}// Dragging upwardsif (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) {return}// Time to actually perform the actionmoveCard(dragIndex, hoverIndex)// Note: we're mutating the monitor item here!// Generally it's better to avoid mutations,// but it's good here for the sake of performance// to avoid expensive index searches.item.index = hoverIndex},})const [{ isDragging }, drag] = useDrag({type: "card",item: () => {return { id, index }},collect: (monitor) => ({isDragging: monitor.isDragging(),}),})const opacity = isDragging ? 0 : 1drag(drop(ref))return (<div ref={ref} style={{ ...style, opacity }} data-handler-id={handlerId}>{text}</div>)
}
新建一个Container.tsx:
import update from 'immutability-helper'
import React,{ useCallback, useState } from 'react'
import { Card } from './Card.js'
const style = {width: 400,
}
const Container = () => {{const [cards, setCards] = useState([{id: 1,text: 'Write a cool JS library',},{id: 2,text: 'Make it generic enough',},{id: 3,text: 'Write README',},{id: 4,text: 'Create some examples',},{id: 5,text: 'Spam in Twitter and IRC to promote it (note that this element is taller than the others)',},{id: 6,text: '???',},{id: 7,text: 'PROFIT',},])const moveCard = useCallback((dragIndex, hoverIndex) => {setCards((prevCards) =>update(prevCards, {$splice: [[dragIndex, 1],[hoverIndex, 0, prevCards[dragIndex]],],}),)}, [])const renderCard = useCallback((card, index) => {return (<Cardkey={card.id}index={index}id={card.id}text={card.text}moveCard={moveCard}/>)}, [])return (<><div style={style}>{cards.map((card, i) => renderCard(card, i))}</div></>)}
}
export default Container
如果你使用的是jsx后缀改为jsx即可,这个例子需要单独下载一个immutability-helper:
cnpm install immutability-helper
npm immutability-helper
immutability-helper是一个小型JavaScript库,旨在提供一种方便的方法来无副作用地修改数据,同时保持原始数据源的不变性。它由Kolodny创建,主要功能是创建数据的副本并对其进行修改,而不是直接修改原数据主要功能和用法
immutability-helper提供了一系列API来操作不可变数据,包括:$push:将数组中的所有项推送到目标数组中。
$unshift:将数组中的所有项插入到目标数组的开头。
$splice:对目标数组进行多次操作。
$set:用任意值替换目标。
$toggle:切换目标数组中指定下标的布尔值。
$unset:从目标对象中移除指定的键列表。
$merge:将参数对象的键与目标合并。
$apply:将当前值传递给函数进行处理
我的需求实现代码:
新建一个组件 index.tsx:
import React from "react";
import Example from './Container';
import { DndProvider } from 'react-dnd'
import { HTML5Backend } from 'react-dnd-html5-backend'
// 定义一个名为App的函数
const App = () => {// 返回一个div元素,类名为Appreturn (<DndProvider backend={HTML5Backend}><Example /></DndProvider>);
}
export default App
新建一个Card.tsx:
import React, { useRef } from 'react';
import { useDrag, useDrop } from 'react-dnd' // 拖拽库核心API
import "./index.less"
import moveIcon from "@/assets/img/icon/move.png"; // 拖拽手柄图标
import closeIcon from "@/assets/img/icon/close.png"; // 关闭按钮图标/*** 可拖拽排序卡片组件* @param {number} id - 卡片唯一标识* @param {string} text - 卡片显示文本* @param {number} index - 卡片在列表中的位置索引* @param {function} moveCard - 卡片位置交换回调* @param {function} closeCard - 卡片关闭回调*/
export const Card = ({ id, text, index, moveCard, closeCard }) => {// 引用DOM节点用于拖拽定位const ref = useRef(null)/* 放置区域配置 */const [{ handlerId }, drop] = useDrop({accept: "card", // 只接受同类型拖拽元素collect: (monitor) => ({// 获取拖拽源的处理器ID(用于调试)handlerId: monitor.getHandlerId(),}),// 悬停时触发排序逻辑hover(item, monitor) {if (!ref.current) returnconst dragIndex = item.index // 拖拽元素的原始索引const hoverIndex = index // 当前卡片的索引// 相同位置不处理if (dragIndex === hoverIndex) return// 获取当前卡片布局信息const hoverBoundingRect = ref.current.getBoundingClientRect()// 计算卡片垂直中点const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2// 获取鼠标当前位置const clientOffset = monitor.getClientOffset()// 计算鼠标相对于卡片顶部的位置const hoverClientY = clientOffset.y - hoverBoundingRect.top/* 拖拽方向判断逻辑 */// 向下拖拽:仅当鼠标超过50%高度时触发交换if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) return// 向上拖拽:仅当鼠标超过50%高度时触发交换if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) return// 执行卡片位置交换moveCard(dragIndex, hoverIndex)// 性能优化:直接修改监控项索引避免重复计算item.index = hoverIndex}})/* 拖拽行为配置 */const [{ isDragging }, drag] = useDrag({type: "card", // 拖拽类型标识item: () => ({// 传递拖拽所需数据id,index}),collect: (monitor) => ({// 收集拖拽状态isDragging: monitor.isDragging()})})// 将拖拽和放置逻辑绑定到同一DOM节点drag(drop(ref))return (<divref={ref}className={isDragging ? "move list_item" : "no_move list_item"} // 拖拽时应用特殊样式data-handler-id={handlerId} // 调试用标识>{/* 拖拽手柄 */}<img src={moveIcon} alt="move_icon" className='move_icon' />{/* 卡片内容 */}<div className='list_item_content'>{text}</div>{/* 关闭按钮 */}<img src={closeIcon} alt="close_icon" className='close_icon' onClick={() => closeCard(id)} // 传递当前卡片ID/></div>)
}
新建一个Container.tsx:
// 引入依赖库
import update from 'immutability-helper' // 不可变数据操作工具
import React, { useCallback, useEffect, useState } from 'react'
import { Card } from './Card.js' // 自定义卡片组件// 容器样式
const style = {width: 400,
}const Container = () => {// 卡片初始状态const [cards, setCards] = useState([{ id: 1, text: '策略类型' },{ id: 2, text: '策略场景' },{ id: 3, text: '上周' },{ id: 4, text: '近一月' },{ id: 5, text: '今年以来' }])// 卡片副本状态(当前未实际使用)const [cardCopy, setCardCopy] = useState(cards)// 同步主状态到副本状态useEffect(() => {console.log(cards, "cardCopy")setCardCopy(cards)}, [cards])/*** 卡片移动逻辑* @param dragIndex 拖拽卡片的原始位置* @param hoverIndex 拖拽目标位置*/const moveCard = useCallback((dragIndex, hoverIndex) => {setCards(prevCards => update(prevCards, {$splice: [[dragIndex, 1], // 删除原始位置的元素[hoverIndex, 0, prevCards[dragIndex]] // 在目标位置插入拖拽元素],}))}, [])// const moveCard = useCallback((dragIndex, hoverIndex) => {// setCards(prevCards => {// // 创建新数组副本// const newCards = [...prevCards]// // 提取被拖拽元素// const draggedCard = newCards[dragIndex]// // 删除原位置元素// newCards.splice(dragIndex, 1)// // 插入到新位置// newCards.splice(hoverIndex, 0, draggedCard)// return newCards// })// }, [])/*** 关闭卡片逻辑(当前实现存在问题)* @param id 卡片ID* @param index 卡片索引*/const closeCard = useCallback((id) => {setCards(prevCards =>// 使用 filter 创建新数组,排除目标卡片prevCards.filter(card => card.id !== id))}, [])// 渲染单个卡片const renderCard = useCallback((card, index) => {return (<Cardkey={card.id}index={index}id={card.id}text={card.text}moveCard={moveCard}closeCard={closeCard}/>)}, [])return (<>{/* 卡片容器 */}<div style={style}>{cards.map((card, i) => renderCard(card, i))}</div></>)
}export default Container
这里有两个版本,我不想用immutability-helper库,觉得多一个依赖没啥意义,所以我去掉了。
import React, { useCallback, useEffect, useState } from 'react'
import { Card } from './Card.js' // 自定义卡片组件// 容器样式
const style = {width: 400,
}const Container = () => {// 卡片初始状态const [cards, setCards] = useState([{ id: 1, text: '策略类型' },{ id: 2, text: '策略场景' },{ id: 3, text: '上周' },{ id: 4, text: '近一月' },{ id: 5, text: '今年以来' }])// 卡片副本状态(当前未实际使用)const [cardCopy, setCardCopy] = useState(cards)// 同步主状态到副本状态useEffect(() => {console.log(cards, "cardCopy")setCardCopy(cards)}, [cards])/*** 卡片移动逻辑* @param dragIndex 拖拽卡片的原始位置* @param hoverIndex 拖拽目标位置*/const moveCard = useCallback((dragIndex, hoverIndex) => {setCards(prevCards => {// 创建新数组副本const newCards = [...prevCards]// 提取被拖拽元素const draggedCard = newCards[dragIndex]// 删除原位置元素newCards.splice(dragIndex, 1)// 插入到新位置newCards.splice(hoverIndex, 0, draggedCard)return newCards})}, [])/*** 关闭卡片逻辑(当前实现存在问题)* @param id 卡片ID* @param index 卡片索引*/const closeCard = useCallback((id) => {setCards(prevCards =>// 使用 filter 创建新数组,排除目标卡片prevCards.filter(card => card.id !== id))}, [])// 渲染单个卡片const renderCard = useCallback((card, index) => {return (<Cardkey={card.id}index={index}id={card.id}text={card.text}moveCard={moveCard}closeCard={closeCard}/>)}, [])return (<>{/* 卡片容器 */}<div style={style}>{cards.map((card, i) => renderCard(card, i))}</div></>)
}export default Container
总结:
dnd-kit 有react版本也有 所有库都能用的版本:
@dnd-kit/react 就是react版本
@dnd-kit/core就是所有都能用的版本
我这个需求简单,我直接用了react版本,使用很简单!
如果你需求复杂,我还是建议使用 dnd-kit的!!
相对来看 dnd-kit/react相对实现简单,具体用什么你自己来定夺。
react-dnd也还可以,不过我还是倾向于 dnd-kit,别的作者也推荐使用这个。
相关文章:
react实现一个列表的拖拽排序(react实现拖拽)
需求场景: 我的项目里需要实现一个垂直列表的拖拽排序,效果图如下图: 技术调研: 借用antd Table实现: 我的项目里使用了antd,antd表格有一个示例还是挺像的,本来我想用Table实现࿰…...
通过mybatis的拦截器对SQL进行打标
1、背景 在我们开发的过程中,一般需要编写各种SQL语句,万一生产环境出现了慢查询,那么我们如何快速定位到底是程序中的那个SQL出现的问题呢? 2、解决方案 如果我们的数据访问层使用的是mybatis的话,那么我们可以通过…...
【MySQL】MySQL服务器——mysqld
1.MySQL服务器 是名为 mysqld 的数据库服务器程序,和“主机”(host)不一样是一个多线程的单进程管理对磁盘和内存中数据库的访问支持并发的客户端连接支持多个存储引擎,常见的存储引擎包括InnoDB、MyISAM、Memory、Archive支持事…...
JAVA面试_进阶部分_Java JVM:垃圾回收(GC 在什么时候,对什么东西,做了什么事情)
在什么时候: 首先需要知道,GC又分为minor GC 和 Full GC(major GC)。Java堆内存分为新生代和老年代,新生代 中又分为1个eden区和两个Survior区域。 一般情况下,新创建的对象都会被分配到eden区ÿ…...
【探秘海洋伤痕】海洋环境污染损害的警世启示
在地球这个蓝色星球上,广袤无垠的海洋孕育了无数生命,支撑着地球的生态平衡与人类的生存发展。然而,随着工业化和现代化的加速,海洋环境遭受的伤害日益严重,海洋环境污染损害成为了我们必须直面的严峻问题。本文将带您…...
过滤器(Filter)与拦截器(Interceptor)
在Java Web开发中,**拦截器(Interceptor)和过滤器(Filter)**都用于在请求处理过程中拦截和处理HTTP请求或响应,但它们有不同的应用场景和工作原理。下面将详细解释它们的区别,并提供代码演示。 …...
智慧城市运行管理服务平台建设方案
随着城市化的快速发展,城市运行管理面临着前所未有的挑战。智慧城市的概念应运而生,旨在通过信息技术手段提升城市管理效率和居民生活质量。智慧城市运行管理服务平台作为智慧城市建设的核心组成部分,其建设方案的科学性和前瞻性至关重要。 …...
Java是怎么解决并发问题的?
Happens-Before规则(前言) Happens-Before规则 是 Java 内存模型(JMM)中用于定义线程间操作可见性和有序性的一种规范。它的核心目的是:确保一个线程的某些操作结果对其他线程是可见的,并且这些操作在时间上的顺序不会被重排序破…...
使用 Chrome Flags 设置(适用于 HTTP 站点开发)
使用 Chrome Flags 设置(适用于 HTTP 站点开发) 在 Chrome 地址栏输入:chrome://flags/在搜索框输入 “Insecure origins” 或 “Allow invalid certificates”。找到 “Insecure origins treated as secure” 选项(或者 #allow-…...
解锁 AI 开发的无限可能:邀请您加入 coze-sharp 开源项目
大家好!今天我要向大家介绍一个充满潜力的开源项目——coze-sharp!这是一个基于 C# 开发的 Coze 客户端,旨在帮助开发者轻松接入 Coze AI 平台,打造智能应用。项目地址在这里:https://github.com/zhulige/coze-sharp&a…...
【Swift】面向协议编程之HelloWorld
定义一个协议(protocol),swift 中可以对protocol 进行扩展(extension)通过协议的扩展可以对函数有默认的实现 protocol Sleepable {func sleep() } protocol Eatable {func eat() } extension Eatable {func eat() {print("eat food")} }在类(class)或结…...
图神经网络学习笔记—纯 PyTorch 中的多 GPU 训练(专题十二)
对于许多大规模的真实数据集,可能需要在多个 GPU 上进行扩展训练。本教程将介绍如何通过 torch.nn.parallel.DistributedDataParallel 在 PyG 和 PyTorch 中设置多 GPU 训练管道,而无需任何其他第三方库(如 PyTorch Lightning)。请注意,此方法基于数据并行。这意味着每个 …...
Linux云计算SRE-第二十周
完成ELK综合案例里面的实验,搭建完整的环境 一、 1、安装nginx和filebeat,配置node0(10.0.0.100),node1(10.0.0.110),node2(10.0.0.120),采用filebeat收集nignx日志。 #node0、node1、node2采用以下相同方式收集ngin…...
springcloud gateway搭建及动态获取nacos注册的服务信息信息
前言 Spring Cloud Gateway 通过集成 Nacos 服务发现,可以动态获取注册到 Nacos 的微服务实例信息,并根据服务名(Service Name)自动生成路由规则或手动配置路由规则,实现请求的动态路由和负载均衡。 一个最简单的网关就…...
SSM基础专项复习6——Spring框架AOP(3)
系列文章 1、SSM基础专项复习1——SSM项目整合-CSDN博客 2、SSM基础专项复习2——Spring 框架(1)-CSDN博客 3、SSM基础专项复习3——Spring框架(2)-CSDN博客 4、SSM基础专项复习4——Maven项目管理工具(1ÿ…...
【嵌入式linux】网口和USB热插拔检测
在Linux常常需要对网口和USB等外设接口进行插拔检测,从而执行部分初始化操作。下面简要介绍Linux的Netlink机制,并在C程序中使用Linux的Netlink机制完成网口和USB口插拔检测。 Netlink 是 Linux 内核与用户空间进程通信的一种机制,主要用于内…...
C++(13)—类和对象(中) ③拷贝构造函数
文章目录 一、拷贝构造函数的基本概念1.1 什么是拷贝构造函数?1.2 拷贝构造函数的调用场景 二、拷贝构造函数的核心特性2.1 拷贝构造函数的参数2.2 默认拷贝构造函数 三、深拷贝与浅拷贝3.1 浅拷贝的问题 四、拷贝构造函数的实际应用4.1 何时需要显式定义拷贝构造函…...
【GPT入门】第17课 RAG向量检索分类、原理与优化
【GPT入门】第16课 RAG向量检索分类、原理与优化 1.向量检索概念1.1 文本检索的两类方式1.2 向量的定义1.3 文本向量(Text Embeddings)1.4 文本向量如何得到1.5 向量间相似度计算1.6 向量数据库功能对比1.7 open ai发布的两个向量模型2.向量数据库1.8 向量检索的优化3.检索后…...
Operator <=> (spaceship operator)
operator <>动机 在C20以前定义比较运算符:其他比较运算符基于<和实现 struct Type {int value;// 相等运算符friend bool operator(const Type& a, const Type& b) {return a.value b.value;}// 不等运算符friend bool operator!(const Type&a…...
队列的简单例题
题目如下 模拟队列 首先你要明白队列的话 只有队尾才能进行新增,也就是入队 只有队首才能出队,也就是删除 队首队尾指针一开始默认都是0 相当于队列中一开始是有一个元素的就是 0的位置 队首指针head0 队尾指针tail0 1.入队也就是队尾要先赋值…...
Calibre-Web-Automated:打造你的私人图书馆
有没有小伙伴在工作、学习或生活中喜欢保存一些书籍或PDF文件,结果过一段时间想找的时候却怎么也找不到,最后只能无奈放弃?你是否已经厌倦了手动管理电子书的繁琐?是否梦想拥有一个私人图书馆,随时随地都能轻松访问自己…...
第27周JavaSpringboot 前后端联调
电商前后端联调课程笔记 一、项目启动与环境搭建 1.1 项目启动 在学习电商项目的前后端联调之前,需要先掌握如何启动项目。项目启动是整个开发流程的基础,只有成功启动项目,才能进行后续的开发与调试工作。 1.1.1 环境安装 环境安装是项…...
【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.1AWS OpenSearch无服务器方案
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 8.2.1AWS OpenSearch 无服务器方案深度解析与实践指南1. Serverless架构的核心价值与行业趋势1.1 传统Elasticsearch集群的运维挑战1.2 Serverless技术演进路线技术特性对比…...
鸿蒙开发者社区资源的重要性
鸿蒙系统,作为华为公司自主研发的操作系统,旨在为各类智能设备提供统一的平台。它不仅支持手机、平板电脑等移动设备,还涵盖了物联网(IoT)设备和其他智能家居产品。鸿蒙系统的开发环境和工具链对于开发者来说至关重要&…...
【QT】事件系统入门——QEvent 基础与示例
一、事件介绍 事件是 应用程序内部或者外部产生的事情或者动作的统称 在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候&…...
⚡️Jolt -- 通过JSON配置来处理复杂数据转换的工具
简介:一个能够通过JSON配置(特定的语法)来处理复杂数据转换的工具。 比如将API响应转换为内部系统所需的格式,或者处理来自不同来源的数据结构差异。例如,将嵌套的JSON结构扁平化,或者重命名字段࿰…...
2025-03-13 禅修-错误的做法
摘要: 2025-03-13 禅修-错误的做法 禅修-错误的做法 我们今天的课程是这个禅修防误。主要是有一些我们所明令禁止的。在整个禅修过程中,会对我们禅修出现一些弊端的这部分,我们会给大家介绍。第一,在禅修中要防止自由联想,防止幻…...
uni-app学习笔记——自定义模板
一、流程 1.这是一个硬性的流程,只要按照如此程序化就可以实现 二、步骤 1.第一步 2.第二步 3.第三步 4.每一次新建页面,都如第二步一样;可以选择自定义的模版(vue3Setup——这是我自己的模版),第二步的…...
【医院绩效管理专题】8.医院绩效数据的收集与整理方法:洞察现状,引领未来
医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今医疗行业竞争日益激烈的背景下,医院绩效管理已成为提升医疗服务质量、优化运营效率、增强综合竞争力的关键因素。而绩效数据的收集与整理作为绩效管理的基础环节,其科学性、准确性和完整性直…...
麒麟系统如何安装Anaconda
在银河麒麟操作系统(Kylin OS)中安装 Anaconda 的步骤相对简单,以下是基于搜索结果整理的详细安装指南: 步骤 1:下载 Anaconda 安装脚本 打开浏览器,访问 Anaconda 官方下载页面。选择适合 Linux 系统的安…...
Linux网络套接字编程——UDP服务器
Linux网络套接字编程——创建并绑定-CSDN博客 前面已经介绍了网络套接字的创建和绑定,这篇文章会通过UDP套接字实现一个UDP服务器。 先介绍将使用的接口。 recvfrom ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr,…...
deepseek+kimi做ppt教程记录
1.首先注册deepseek和kimi deepseek官网:https://chat.deepseek.com/ kimi官网:https://kimi.moonshot.cn/ 以下以一篇工作总结报告为例 2.使用deepseek生成ppt大纲 让deepseek生成kimi生成ppt所需要的内容时,需要注意提示词内容,…...
Cursor 终极使用指南:从零开始走向AI编程
Cursor 终极使用指南:从零开始走向AI编程 问什么是cursor? mindmaproot(Cursor核心功能)智能编码代码生成自动补全错误修复项目管理多窗口布局版本控制终端集成个性设置主题定制快捷键配置插件扩展AI协作对话编程知识检索文档生成前些天发现了一个巨牛的人工智能学…...
TiDB 观测性解读(一)丨索引观测:快速识别无用索引与低效索
导读 可观测性已经成为分布式系统成功运行的关键组成部分。如何借助多样、全面的数据,让架构师更简单、高效地定位问题、分析问题、解决问题,已经成为业内的一个技术焦点。本系列文章将深入解读 TiDB 的关键参数,帮助大家更好地观测系统的状…...
批量将 Excel 文档中的图片提取到文件夹
前面我们介绍过如何批量删除 Excel 文档中的所有图片或者指定的图片,其中就需要用到批量提取 Excel 文档中图片的操作。我们如何才能够将 Excel 文档中的图片快速的提取出来呢?其实单个 Excel 文档中的图片提取到文件夹中是有多种方法可以完成的…...
postgresql 数据库使用
目录 索引 查看索引 创建 删除索引 修改数据库时区 索引 查看索引 select * from pg_indexes where tablenamet_table_data; 或者 select * from pg_statio_all_indexes where relnamet_table_data; 创建 CREATE INDEX ix_table_data_time ON t_table_data (id, crea…...
怎样进行相关论文的调研——How to conduct research on relevant papers?
怎样进行相关论文的调研 写在前面1.打开Web of Science2.检索同类表达3.构建“检索式”什么是“检索式” 参考内容 写在前面 偶然间刷到一篇知乎文章,顺着文章的推荐看了钟澄老师的科研论和在B站上的教学视频,深入了解后发现读文章还有这么多讲究&#…...
蓝桥杯备赛-基础练习 day1
1、闰年判断 问题描述 给定一个年份,判断这一年是不是闰年。 当以下情况之一满足时,这一年是闰年:1.年份是4的倍数而不是100的倍数 2.年份是400的倍数。 其他的年份都不是闰年。 输入格式 输入包含一个…...
本地算力部署大模型详细流程(一)
1、版本选择 本地部署就是自己部署deepseek模型,使用本地的算力。 主要瓶颈:内存显存的大小。特点:此方案不用联网。适合:有数据隐私方面担忧的或者保密单位根本就不能上网的。 2、部署过程 比较流行的是使用ollama:ht…...
便利店商品推荐数字大屏:基于python和streamlit
基于python和streamlit实现的便利店商品推荐大屏,针对选择困难症消费者。 import streamlit as st import pandas as pd import numpy as np import altair as alt from datetime import datetime, timedelta import time# 模拟数据生成 def generate_data():np.ra…...
机器视觉工程师红外相机的选择:红外长波工业相机和短波红外工业相机玄机大总结
红外长波(LWIR)和短波(SWIR)工业相机在原理、应用场景和技术特点上有显著差异。以下是它们的对比分析: 1. 波长范围与成像原理 2. 技术特点 3. 典型应用场景 4. 优缺点对比 LWIR优势: 无需光照,适用于完全黑暗环境。 直接反映物体温度分布。 对烟雾、灰尘穿透能力强。…...
AI重构SEO关键词布局
内容概要 在搜索引擎优化(SEO)领域,AI技术的深度应用正在颠覆传统关键词布局逻辑。通过机器学习算法与语义分析模型,智能系统能够实时解析海量搜索数据,构建动态词库并精准捕捉用户意图。相较于依赖人工经验的关键词筛…...
c语言经典基础编程题
c语言经典基础编程题 一、输出输出1.1温度输出1.2排齐数据1.3进制转换 二、选择分支2.1求最大值2.2成绩评定2.3分段函数求值2.4 利润计算2.5判断闰年2.6二次方程根 三、循环结构3.1倒数求和3.2最大数3.3判断素数3.4判断完全数3.5打印菱形🚀🚀Ὠ…...
【每日学点HarmonyOS Next知识】防截屏、作用域问题、观察器问题、对话框关闭、判断对象包含某个字段
1、HarmonyOS 防截屏功能如何实现? 防截屏功能如何实现 参考demo: aboutToDisappear(): void {let windowClass: window.Window | undefined undefined;window.getLastWindow(getContext(this)).then((win) > {this.window win }) window.getLas…...
linux操作系统实战
第一题 创建根目录结构中的所有的普通文件 [rootlocalhost ~]# cd /[rootlocalhost /]# mkdir /text[rootlocalhost /]# cd /text[rootlocalhost text]# mkdir /text/boot /text/root /text/home /text/bin /text/sbin /text/lib /text/lib64 /text/usr /text/opt /text/etc /…...
MKS HA-MFV:半导体制造中的高精度流量验证技术解析
引言 在半导体先进制程(如3nm节点)中,工艺气体流量的精准控制直接决定刻蚀、沉积等关键步骤的均匀性和良率。MKS Instruments推出的 HA-MFV(High Accuracy Mass Flow Verifier) 通过创新设计解决了传统流量验证技术的…...
图论part2|200. 岛屿数量、695. 岛屿的最大面积
200、岛屿数量 🔗:200. 岛屿数量 - 力扣(LeetCode)思路: 1. 深度优先算法 二叉树中dfs要素:1、访问左右相邻子节点 2、判断base case(终止条件)参考二叉树中的dfs看网格问题1. 网格…...
小白学Agent技术[5](Agent框架)
文章目录 Agent框架Single Agent框架BabyAGIAutoGPTHuggingGPTHuggingGPT工作原理说明GPT-EngineerAppAgentOS-Copilot Multi-Agent框架斯坦福虚拟小镇TaskWeaverMetaGPT微软UFOAgentScope现状 常见Agent项目比较概述技术规格和能力实际应用案例开发体验比较ChatChain模式 Agen…...
SpringBoot为什么流行以及能解决什么问题?
Spring Boot 之所以流行,主要是因为它极大地简化了 Spring 应用的开发,提供了一种开箱即用的体验,使开发者能够快速构建独立运行的、生产级的 Spring 应用。 Spring Boot 为什么流行? 简化配置 传统 Spring 需要大量 XML 或 Java…...
MySQL -- 数据类型
1、数据库的基础数据类型 TINYINT INT BIGINT FLOAT DECIMAL CHAR VARCHAR TEXT BLOB DATE DATETIME TIMESTAMP SET ENUM 2、不同数据类型区别以及作用 1、数值类型 1.1 整数类型 1.1.1 TINYINT 这里我们以TINYINT这个类型为例,解释一下在mysql中…...