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

六十天前端强化训练之第十五天React组件基础案例:创建函数式组件展示用户信息(第15-21天:前端框架(React))

=====欢迎来到编程星辰海的博客讲解======

我们已经学了14天了,再坚持坚持,马上我们就可以变得更优秀了,加油,我相信大家,接下来的几天,我会给大家更新前端框架(React),看完可以给一个免费的三连吗,谢谢大佬!

代码都可以在godepen上运行的,大家可以复制代码试试

https://codepen.io/accounts/signup/user/free/year?ownerId=null&ownerType=null

目录

一、组件核心概念体系

1.1 组件化开发哲学

1.2 虚拟DOM工作原理

二、函数式组件深度剖析

2.1 基础结构

2.2 Hooks 生态系统

三、组件通信模式详解

3.1 父→子通信(Props)

3.2 子→父通信(回调函数)

3.3 Context 跨层通信

实战案例:带交互的用户信息管理

功能演示

关键知识点总结

状态管理策略

列表渲染最佳实践

表单处理模式

性能优化手段

扩展学习路径

官方文档精读

社区优质资源

推荐工具链

进阶挑战任务

一、为删除操作添加确认对话框

二、实现用户编辑功能

三、添加本地存储持久化

四、集成后端API接口

五、添加分页加载功能

六、实现角色权限控制

功能演示


一、组件核心概念体系

1.1 组件化开发哲学
  • 单一职责原则:每个组件应专注于单一功能
  • 封装性:内部实现细节对外隐藏,通过 Props 接口通信
  • 组合模式:通过组件嵌套形成树形结构
  • 可重用性:合理抽象提升组件复用率
1.2 虚拟DOM工作原理

JAVASCRIPT

// 简化版虚拟DOM结构示例
const virtualNode = {type: 'div',props: {className: 'container',children: [{ type: 'h1', props: { children: 'Hello World' } },{ type: 'p', props: { children: 'React原理示例' } }]}
};

Diff 算法通过以下策略优化更新:

  1. 同级比较策略
  2. Key 值优化列表比对
  3. 组件类型判断(相同类型复用实例)

二、函数式组件深度剖析

2.1 基础结构

JSX

/*** 用户信息展示组件* @param {Object} props - 组件属性* @param {string} props.username - 用户名* @param {number} props.age - 用户年龄* @returns {JSX.Element} 用户信息卡片*/
function UserInfo({ username, age }) {return (<div className="user-card"><h2>{username}</h2><p>年龄: {age} 岁</p></div>);
}
2.2 Hooks 生态系统

JSX

import React, { useState, useEffect, useMemo } from 'react';const UserDashboard = () => {// 状态管理:用户数据const [users, setUsers] = useState([]);// 状态管理:加载状态const [loading, setLoading] = useState(false);// 状态管理:错误信息const [error, setError] = useState(null);// 计算属性:用户总数const userCount = useMemo(() => users.filter(user => user.isActive).length,[users]);// 副作用:数据获取useEffect(() => {const fetchUsers = async () => {setLoading(true);try {const response = await fetch('/api/users');if (!response.ok) throw new Error('数据获取失败');const data = await response.json();setUsers(data);} catch (err) {setError(err.message);} finally {setLoading(false);}};fetchUsers();}, []); // 空依赖数组表示仅执行一次// 条件渲染处理if (loading) return <Spinner />;if (error) return <ErrorDisplay message={error} />;return (<div><h3>总用户数: {userCount}</h3><div className="user-list">{users.map(user => (<UserCard key={user.id} {...user} />))}</div></div>);
};


三、组件通信模式详解

3.1 父→子通信(Props)

JSX

// 父组件
const UserManagement = () => {const [userList, setUserList] = useState(initialUsers);const handleUserUpdate = (updatedUser) => {setUserList(prev => prev.map(user => user.id === updatedUser.id ? updatedUser : user));};return (<div><UserTable users={userList} onEdit={handleUserUpdate}/></div>);
};// 子组件
const UserTable = ({ users, onEdit }) => (<table><thead><tr><th>姓名</th><th>操作</th></tr></thead><tbody>{users.map(user => (<tr key={user.id}><td>{user.name}</td><td><button onClick={() => onEdit(user)}>编辑</button></td></tr>))}</tbody></table>
);
3.2 子→父通信(回调函数)

JSX

const SearchBar = ({ onSearch }) => {const [query, setQuery] = useState('');const handleSubmit = (e) => {e.preventDefault();onSearch(query.trim());};return (<form onSubmit={handleSubmit}><inputtype="text"value={query}onChange={(e) => setQuery(e.target.value)}placeholder="输入搜索关键词..."/><button type="submit">搜索</button></form>);
};// 父组件使用
<SearchBar onSearch={(keyword) => filterData(keyword)} />
3.3 Context 跨层通信

JSX

// 创建 Context
const ThemeContext = React.createContext('light');// 提供者组件
const App = () => {const [theme, setTheme] = useState('light');return (<ThemeContext.Provider value={{ theme, setTheme }}><Toolbar /></ThemeContext.Provider>);
};// 消费者组件
const ThemedButton = () => {const { theme, setTheme } = useContext(ThemeContext);return (<button style={{ background: theme === 'dark' ? '#333' : '#fff',color: theme === 'dark' ? '#fff' : '#333'}}onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}>切换主题</button>);
};


实战案例:带交互的用户信息管理

JSX

import React, { useState, useEffect } from 'react';/*** 用户信息管理系统* 功能:* 1. 展示用户列表* 2. 支持新增用户* 3. 支持删除用户* 4. 实时搜索过滤*/
const UserManager = () => {// 主数据状态const [users, setUsers] = useState([]);// 搜索关键词状态const [searchTerm, setSearchTerm] = useState('');// 新用户表单状态const [newUser, setNewUser] = useState({name: '',email: '',role: 'user'});// 模拟初始化数据useEffect(() => {const initialUsers = [{ id: 1, name: '张三', email: 'zhang@example.com', role: 'admin' },{ id: 2, name: '李四', email: 'li@example.com', role: 'user' }];setUsers(initialUsers);}, []);// 处理表单输入const handleInputChange = (e) => {const { name, value } = e.target;setNewUser(prev => ({...prev,[name]: value}));};// 提交新用户const handleAddUser = (e) => {e.preventDefault();if (!newUser.name || !newUser.email) return;const userToAdd = {...newUser,id: Date.now() // 临时ID生成方式};setUsers(prev => [...prev, userToAdd]);setNewUser({ name: '', email: '', role: 'user' });};// 删除用户const handleDelete = (userId) => {setUsers(prev => prev.filter(user => user.id !== userId));};// 过滤用户列表const filteredUsers = users.filter(user =>user.name.toLowerCase().includes(searchTerm.toLowerCase()));return (<div className="user-manager">{/* 搜索栏 */}<div className="search-section"><inputtype="text"placeholder="搜索用户..."value={searchTerm}onChange={(e) => setSearchTerm(e.target.value)}/></div>{/* 添加用户表单 */}<form onSubmit={handleAddUser} className="add-form"><inputname="name"placeholder="姓名"value={newUser.name}onChange={handleInputChange}required/><inputname="email"type="email"placeholder="邮箱"value={newUser.email}onChange={handleInputChange}required/><selectname="role"value={newUser.role}onChange={handleInputChange}><option value="user">普通用户</option><option value="admin">管理员</option></select><button type="submit">添加用户</button></form>{/* 用户列表 */}<div className="user-list">{filteredUsers.map(user => (<div key={user.id} className="user-card"><div className="user-info"><h3>{user.name}</h3><p>{user.email}</p><span className={`role-tag ${user.role}`}>{user.role === 'admin' ? '管理员' : '用户'}</span></div><button className="delete-btn"onClick={() => handleDelete(user.id)}>删除</button></div>))}</div></div>);
};export default UserManager;


功能演示

  1. 实时搜索用户
  2. 添加新用户表单验证
  3. 用户角色标识
  4. 删除确认操作
  5. 响应式布局

关键知识点总结

  1. 状态管理策略
    • 使用 useState 管理组件内部状态
    • 状态提升:将共享状态移动到最近的共同祖先组件
    • 状态合并:使用扩展运算符保持状态不变性
  2. 列表渲染最佳实践
    • 始终提供稳定的 key 属性
    • 复杂列表使用虚拟滚动优化性能
    • 分离列表项为独立子组件
  3. 表单处理模式
    • 受控组件 vs 非受控组件
    • 表单验证实现方案
    • 使用 name 属性批量处理输入
  4. 性能优化手段
    • React.memo 记忆组件
    • useCallback 缓存函数引用
    • useMemo 避免重复计算
    • 按需加载组件 (React.lazy)
  5. 错误边界处理

    • 使用 try/catch 处理同步错误
    • 异步操作的错误处理
    • 全局错误边界组件

扩展学习路径

  1. 官方文档精读
    • 状态管理进阶
    • Hooks 深度指南
    • 上下文 API 最佳实践
  2. 社区优质资源
    • React 模式大全
    • Hooks 常见问题解答
    • React 性能优化手册
  3. 推荐工具链
    • 状态管理:Redux Toolkit / Recoil
    • 路由管理:React Router v6
    • 样式方案:Styled-components / CSS Modules
    • 测试框架:Jest + React Testing Library

进阶挑战任务

  1. 为删除操作添加确认对话框
  2. 实现用户编辑功能
  3. 添加本地存储持久化
  4. 集成后端 API 接口
  5. 添加分页加载功能
  6. 实现角色权限控制
一、为删除操作添加确认对话框

JSX

const DeleteConfirmDialog = ({ onConfirm, onCancel }) => (<div className="confirm-dialog"><p>确定要删除该用户吗?</p><div className="dialog-actions"><button onClick={onConfirm}>确认删除</button><button onClick={onCancel}>取消</button></div></div>
);// 使用示例
const handleDelete = (userId) => {const confirm = window.confirm('确定要删除该用户吗?');if (confirm) {setUsers(prev => prev.filter(user => user.id !== userId));}
};


二、实现用户编辑功能

JSX

const UserEditor = ({ user, onSave, onCancel }) => {const [editData, setEditData] = useState(user);const handleSubmit = (e) => {e.preventDefault();onSave(editData);};return (<div className="edit-form"><form onSubmit={handleSubmit}><inputvalue={editData.name}onChange={(e) => setEditData({...editData, name: e.target.value})}/><inputvalue={editData.email}onChange={(e) => setEditData({...editData, email: e.target.value})}/><div className="form-actions"><button type="submit">保存</button><button type="button" onClick={onCancel}>取消</button></div></form></div>);
};// 在用户卡片中添加:
{isEditing ? (<UserEditor user={user}onSave={(updated) => handleUpdateUser(updated)}onCancel={() => setEditingId(null)}/>
) : (<button onClick={() => setEditingId(user.id)}>编辑</button>
)}


三、添加本地存储持久化

JSX

// 自定义Hook
const useLocalStorage = (key, initialValue) => {const [value, setValue] = useState(() => {const stored = localStorage.getItem(key);return stored ? JSON.parse(stored) : initialValue;});useEffect(() => {localStorage.setItem(key, JSON.stringify(value));}, [key, value]);return [value, setValue];
};// 使用示例
const [users, setUsers] = useLocalStorage('users', []);


四、集成后端API接口

JSX

const api = {fetchUsers: async (page = 1) => {const response = await fetch(`/api/users?page=${page}`);return response.json();},createUser: async (user) => {const response = await fetch('/api/users', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(user)});return response.json();}
};// 在组件中使用
useEffect(() => {const loadData = async () => {setLoading(true);try {const data = await api.fetchUsers();setUsers(data);} catch (err) {setError(err.message);} finally {setLoading(false);}};loadData();
}, []);


五、添加分页加载功能

JSX

const Pagination = ({ current, total, onChange }) => (<div className="pagination">{Array.from({length: total}, (_, i) => (<buttonkey={i+1}className={current === i+1 ? 'active' : ''}onClick={() => onChange(i+1)}>{i+1}</button>))}</div>
);// 使用示例
const [currentPage, setCurrentPage] = useState(1);
const [totalPages, setTotalPages] = useState(1);useEffect(() => {const loadPage = async () => {const { data, total } = await api.fetchUsers(currentPage);setUsers(data);setTotalPages(total);};loadPage();
}, [currentPage]);


六、实现角色权限控制

JSX

// 创建权限上下文
const AuthContext = React.createContext();const AuthProvider = ({ children }) => {const [currentUser, setCurrentUser] = useState({role: 'admin' // 从登录获取实际值});const hasPermission = (requiredRole) => {return currentUser.role === requiredRole;};return (<AuthContext.Provider value={{ hasPermission }}>{children}</AuthContext.Provider>);
};// 在组件中使用
const { hasPermission } = useContext(AuthContext);{hasPermission('admin') && (<button onClick={handleEdit}>编辑</button>
)}


功能演示

每个功能模块都可以独立实现并逐步集成,建议按以下顺序进行开发:

  1. 添加本地存储持久化
  2. 实现API集成
  3. 添加分页功能
  4. 实现编辑功能
  5. 添加权限控制
  6. 最后实现确认对话框

通过本案例可以完整掌握 React 核心组件的开发流程,建议结合实际项目需求扩展功能模块。

相关文章:

六十天前端强化训练之第十五天React组件基础案例:创建函数式组件展示用户信息(第15-21天:前端框架(React))

欢迎来到编程星辰海的博客讲解 我们已经学了14天了&#xff0c;再坚持坚持&#xff0c;马上我们就可以变得更优秀了&#xff0c;加油&#xff0c;我相信大家&#xff0c;接下来的几天&#xff0c;我会给大家更新前端框架&#xff08;React&#xff09;&#xff0c;看完可以给一…...

北大一二三四版全套DeepSeek教学资料

DeepSeek学习资料合集&#xff1a;https://pan.quark.cn/s/bb6ebf0e9b4d DeepSeek实操变现指南&#xff1a;https://pan.quark.cn/s/76328991eaa2 你是否渴望深入探索人工智能的前沿领域&#xff1f;是否在寻找一份能引领你从理论到实践&#xff0c;全面掌握AI核心技术的学习…...

计算机网络:计算机网络的组成和功能

计算机网络的组成&#xff1a; 计算机网络的工作方式&#xff1a; 计算机网络的逻辑功能; 总结&#xff1a; 计算机网络的功能&#xff1a; 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点&#xff08;计算机或设备&…...

管理网络安全

防火墙在 Linux 系统安全中有哪些重要的作用&#xff1f; 防火墙作为网络安全的第一道防线&#xff0c;能够根据预设的规则&#xff0c;对进出系统的网络流量进行严格筛选。它可以阻止未经授权的外部访问&#xff0c;只允许符合规则的流量进入系统&#xff0c;从而保护系统免受…...

音频进阶学习十九——逆系统(简单进行回声消除)

文章目录 前言一、可逆系统1.定义2.解卷积3.逆系统恢复原始信号过程4.逆系统与原系统的零极点关系 二、使用逆系统去除回声获取原信号的频谱原系统和逆系统幅频响应和相频响应使用逆系统恢复原始信号整体代码如下 总结 前言 在上一篇音频进阶学习十八——幅频响应相同系统、全…...

Redis7系列:设置开机自启

前面的文章讲了Redis和Redis Stack的安装&#xff0c;随着服务器的重启&#xff0c;导致Redis 客户端无法连接。原来的是Redis没有配置开机自启。此文记录一下如何配置开机自启。 1、修改配置文件 前面的Redis和Redis Stack的安装的文章中已经讲了redis.config的配置&#xf…...

word甲烷一键下标

Sub 甲烷下标()甲烷下标 宏Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text "CH4".Replacement.Text "CHguoshao4".Forward True.Wrap wdFindContinue.Format False.MatchCase False.MatchWhole…...

SSH 连接中主机密钥验证失败问题的解决方法

问题描述 在尝试通过 SSH 建立连接时&#xff0c;出现以下错误信息&#xff1a; WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack…...

网络安全工具nc(NetCat)

NetCat是一个非常简单的Unix工具&#xff0c;可以读、写TCP或UDP网络连接(network connection)。它被设计成一个可靠的后端(back-end)工具&#xff0c;能被其它的程序程序或脚本直接地或容易地驱动。同时&#xff0c;它又是一个功能丰富的 网络调试和开发工具&#xff0c;因为它…...

探索在生成扩散模型中基于RAG增强生成的实现与未来

概述 像 Stable Diffusion、Flux 这样的生成扩散模型&#xff0c;以及 Hunyuan 等视频模型&#xff0c;都依赖于在单一、资源密集型的训练过程中通过固定数据集获取的知识。任何在训练之后引入的概念——被称为 知识截止——除非通过 微调 或外部适应技术&#xff08;如 低秩适…...

【Linux】37.网络版本计算器

文章目录 1. Log.hpp-日志记录器2. Daemon.hpp-守护进程工具3. Protocol.hpp-通信协议解析器4. ServerCal.hpp-计算器服务处理器5. Socket.hpp-Socket通信封装类6. TcpServer.hpp-TCP服务器框架7. ClientCal.cc-计算器客户端8. ServerCal.cc-计算器服务器9. 代码时序1. 服务器启…...

3.6c语言

#define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <stdio.h> int main() {int sum 0,i,j;for (j 1; j < 1000; j){sum 0;for (i 1; i < j; i){if (j % i 0){sum i;} }if (sum j){printf("%d是完数\n", j);}}return 0; }#de…...

【 IEEE出版 | 快速稳定EI检索 | 往届已EI检索】2025年储能及能源转换国际学术会议(ESEC 2025)

重要信息 主会官网&#xff1a;www.net-lc.net 【论文【】投稿】 会议时间&#xff1a;2025年5月9-11日 会议地点&#xff1a;中国-杭州 截稿时间&#xff1a;见官网 提交检索&#xff1a;IEEE Xplore, EI Compendex, Scopus 主会NET-LC 2025已进入IEEE 会议官方列表!&am…...

JVM常用概念之本地内存跟踪

问题 Java应用启动或者运行过程中报“内存不足&#xff01;”&#xff0c;我们该怎么办? 基础知识 对于一个在本地机器运行的JVM应用而言&#xff0c;需要足够的内存来存储机器代码、堆元数据、类元数据、内存分析等数据结构&#xff0c;来保证JVM应用的成功启动以及未来平…...

JVM 的主要组成部分及其作用?

创作内容丰富的干货文章很费心力&#xff0c;感谢点过此文章的读者&#xff0c;点一个关注鼓励一下作者&#xff0c;激励他分享更多的精彩好文&#xff0c;谢谢大家&#xff01; JVM包含两个子系统和两个组件&#xff0c;两个子系统为Class loader(类装载)、Execution engine(执…...

从能耗监测到碳资产管理:智慧校园能源管理平台的迭代升级与实践启示

一、核心价值提炼 随着我国能源结构转型的持续优化和“双碳”目标的明确&#xff0c;构建现代化能源体系已成为国家发展的重要战略。在这一背景下&#xff0c;校园作为能源消耗的重要领域&#xff0c;其能源管理的智能化、绿色化转型显得尤为重要。本文将深入探讨校园智慧能源…...

数据库核心-redo、undo

一、redo日志 InnoDB操作以页为单位操作数据。并且首先操作内存中缓冲池的数据&#xff0c;然后刷新到disk中&#xff0c;但如果事务提交后宕机、未能刷新到disk中&#xff0c;就会造成不一致情况。 重做日志&#xff1a; 系统重启时按照修改步骤重新更新数据页 redo日志占用…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_core_module

定义在 src\core\nginx.c ngx_module_t ngx_core_module {NGX_MODULE_V1,&ngx_core_module_ctx, /* module context */ngx_core_commands, /* module directives */NGX_CORE_MODULE, /* module type */NULL…...

SQLAlchemy系列教程:如何执行原生SQL

Python中的数据库交互提供了高级API。但是&#xff0c;有时您可能需要执行原始SQL以提高效率或利用数据库特定的特性。本指南介绍在SQLAlchemy框架内执行原始SQL。 在SQLAlchemy中执行原生SQL SQLAlchemy虽然以其对象-关系映射&#xff08;ORM&#xff09;功能而闻名&#xff…...

怎么实现: 大语言模型微调案例

怎么实现: 大语言模型微调案例 目录 怎么实现: 大语言模型微调案例输入一个反常识的问题:首都在北京天安门之后对输出模型进行测试:首都在北京天安门微调代码:测试微调模型代码:微调输出模型结构输出模型参数大小对比Qwen 2.5_0.5:53MB输出模型:951MB 是一样的,没有进行…...

【Linux内核系列】:深入理解缓冲区

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz ★★★ 本文前置知识&#xff1a; 文件系统以及相关系统调用接口 输入以及输出重定向 那么在此前的学习中&#xff0c;我们了解了文件的概念以及相关的系统调用接口&#xff0c;并…...

【Qt】成员函数指针

一、成员函数指针的本质 与普通函数指针的区别&#xff1a; // 普通函数指针 void (*funcPtr)() &普通函数;// 成员函数指针 void (MyClass::*memberFuncPtr)() &MyClass::成员函数;• 绑定对象&#xff1a;成员函数指针必须与类的实例对象结合使用 • 隐含 this 指…...

关于 Can Utils 的详细介绍、使用方法及配置指南

Can Utils&#xff1a;开源CAN总线工具集合 一、Can Utils简介 Can Utils 是一组开源的CAN总线工具链&#xff0c;专为嵌入式开发者和网络诊断工程师设计&#xff0c;支持Linux、Windows和macOS系统。它包含一系列轻量级命令行工具&#xff08;如 cantoolz、candump、canbus …...

【Academy】OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities

OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities 1. 什么是 OAuth&#xff1f;2. OAuth 2.0 是如何工作的&#xff1f;3. OAuth 授权类型3.1 OAuth 范围3.2 授权代码授权类型3.3 隐式授权类型 4. OAuth 身份验证4.1 识别 OAuth 身份验证4.2 侦察OAuth…...

dify中使用NL2SQL

在 Dify 工作流中融入 NL2SQL&#xff08;自然语言转 SQL&#xff09;之能力&#xff0c;可依循如下步骤达成&#xff0c;借由 Dify 的模块化设计以及模型编排之功能&#xff0c;优化数据库查询之智能化交互&#xff1a; 一、环境准备与 Dify 部署 安装 Docker 与 Dify 务须确…...

android viewmodel如何使用

嗯&#xff0c;我现在要学习如何在Android中使用ViewModel。我之前听说过ViewModel是用来管理UI相关数据的&#xff0c;这样在配置变化比如屏幕旋转时数据不会丢失。但具体怎么用呢&#xff1f;我需要先回忆一下相关的知识。 首先&#xff0c;ViewModel应该是Android Architec…...

蓝桥杯备赛-基础训练(四)字符串 day17

好久不见&#xff0c;今天开始继续更新&#xff0c;或许拿不了奖&#xff0c;但是希望记录自己学习的过程&#xff0c;如果感觉有收获的同学在下面多多评论说说我代码的缺陷&#xff0c;感谢大家&#xff01; 1、反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反…...

AI Agent开发框架分析:前端视角

1. Mastra (https://mastra.ai/docs) 优点&#xff1a; 提供直观的界面构建器&#xff0c;适合无代码/低代码开发支持JavaScript/TypeScript&#xff0c;可直接集成到前端项目可视化工作流设计&#xff0c;降低入门门槛内置多种UI组件&#xff0c;加速前端开发 缺点&#xf…...

第3节:IP地址分类与子网划分实战指南

IP地址分类与子网划分实战指南:从小白到入门 在网络通信中,IP地址是设备之间相互识别和通信的基础。无论是家庭网络还是企业网络,IP地址的分配和管理都是网络运维的核心任务之一。然而,对于初学者来说,IP地址的分类、子网掩码、CIDR(无类别域间路由)和VLSM(可变长子网…...

贪心算法三

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…...

pytest基础知识

pytest知识了解 pytest的基础知识了解&#xff1a;Python测试框架之pytest详解_lovedingd的博客-CSDN博客_pytest框架 (包含设置断点&#xff0c;pdb&#xff0c;获取最慢的10个用例的执行耗时) pytest-pytest.main()运行测试用例&#xff0c;pytest参数&#xff1a; pytest-…...

JavaWeb后端基础(7)AOP

AOP是Spring框架的核心之一&#xff0c;那什么是AOP&#xff1f;AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实说白了&#xff0c;面向切面编程就是面向特定方法编程。AOP是一种思想&#xff0c;而在Spring框…...

[AI]从零开始的ComflyUI安装教程

一、前言 AI画图如今已经进化到了让人难以想象的地步。早在2022年各大视频网站上就出现了许多真人使用AI绘制二次元形象的视频。在那个时期&#xff0c;也有人凭借AI画图狠狠的吃到了一波AI红利。在现在&#xff0c;对于普通人来说&#xff0c;AI画图仍然是非常值得探索的。不管…...

文本对抗样本系列的论文阅读笔记(整理合订)

文本对抗样本系列的论文阅读笔记 以前调研文本对抗样本时的论文笔记梳理&#xff0c;论文都很经典&#xff0c;有现成的框架&#xff08;TextAttack&#xff09;可以直接用&#xff0c;论文中部分内容直接是截取自论文&#xff0c;所以存在中英混合笔记的情况。 BERT-Attack …...

鸿基智启:东土科技为具身智能时代构建确定性底座

人类文明的每一次跨越都伴随着工具的革新。从蒸汽机的齿轮到计算机的代码&#xff0c;生产力的进化始终与技术的“具身化”紧密相连。当大语言模型掀起认知革命&#xff0c;具身智能正以“物理实体自主决策”的双重属性重新定义工业、医疗、服务等领域的运行逻辑。在这场革命中…...

javascript-es6 (六)

编程思想 面向过程 面向过程 就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次 调用就可以了 就是按照我们分析好了的步骤&#xff0c;按照步骤解决问题 面向对象 面向对象 是把事务分解成为一个个对象&am…...

【leetcode hot 100 19】删除链表的第N个节点

解法一&#xff1a;将ListNode放入ArrayList中&#xff0c;要删除的元素为num list.size()-n。如果num 0则将头节点删除&#xff1b;否则利用num-1个元素的next删除第num个元素。 /*** Definition for singly-linked list.* public class ListNode {* int val;* Lis…...

微信小程序将markdown内容转为pdf并下载

要在微信小程序中将Markdown内容转换为PDF并下载,您可以使用以下方法: 方法一:使用第三方API服务 选择第三方API服务: 可以选择像 Pandoc、Markdown-PDF 或 PDFShift 这样的服务,将Markdown转换为PDF。例如,PDFShift 提供了一个API接口,可以将Markdown内容转换为PDF格式…...

【贪心算法】将数组和减半的最小操作数

1.题目解析 2208. 将数组和减半的最少操作次数 - 力扣&#xff08;LeetCode&#xff09; 2.讲解算法原理 使用当前数组中最大的数将它减半&#xff0c;&#xff0c;直到数组和减小到一半为止&#xff0c;从而快速达到目的 重点是找到最大数&#xff0c;可以采用大根堆快速达到…...

【面试】Kafka

Kafka 1、为什么要使用 kafka2、Kafka 的架构是怎么样的3、什么是 Kafka 的重平衡机制4、Kafka 几种选举过程5、Kafka 高水位了解过吗6、Kafka 如何保证消息不丢失7、Kafka 如何保证消息不重复消费8、Kafka 为什么这么快 1、为什么要使用 kafka 1. 解耦&#xff1a;在一个复杂…...

PHP MySQL 创建数据库

PHP MySQL 创建数据库 引言 在网站开发中&#xff0c;数据库是存储和管理数据的核心部分。PHP 和 MySQL 是最常用的网页开发语言和数据库管理系统之一。本文将详细介绍如何在 PHP 中使用 MySQL 创建数据库&#xff0c;并对其操作进行详细讲解。 前提条件 在开始创建数据库之…...

通义万相 2.1 × 蓝耘智算:AIGC 界的「黄金搭档」如何重塑创作未来?

我的个人主页 我的专栏&#xff1a; 人工智能领域、java-数据结构、Javase、C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01; 点赞&#x1f44d;收藏❤ 引言 在当今数字化浪潮席卷的时代&#xff0c;AIGC&#xff08;生成式人工智能&#xff09;领域正…...

【面试题系列】:使用消息队列怎么防止消息重复?从原理到实战……

一、消息队列的核心价值与挑战 消息队列&#xff08;MQ&#xff09;作为现代分布式系统的基础设施&#xff0c;其核心价值在于解耦、削峰填谷和异步通信。但在追求高可靠性的过程中&#xff0c;消息重复成为必须攻克的技术难题。根据调研数据&#xff0c;在生产环境中消息重复…...

Damage与Injury

### “Damage”和“Injury”的区别 “Damage”和“Injury”都有“损害”或“伤害”的意思&#xff0c;但它们的用法、语境和侧重点有所不同。以下是从词性、适用对象、语义侧重和具体场景四个方面详细对比两者的区别&#xff1a; --- #### 1. **词性** - **Damage**&#xf…...

18 HarmonyOS NEXT UVList组件开发指南(五)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 第五篇&#xff1a;UVList组件最佳实践与实际应用案例 文章目录 第五篇&#xff1a;UVList组件最佳实践与实际应用案例1. 最佳实践总结1.1 组件设计…...

vue3组合式API怎么获取全局变量globalProperties

设置全局变量 main.ts app.config.globalProperties.$category { index: 0 } 获取全局变量 const { appContext } getCurrentInstance() as ComponentInternalInstance console.log(appContext.config.globalProperties.$category) 或是 const { proxy } getCurrentInstance…...

华为机试牛客刷题之HJ14 字符串排序

HJ14 字符串排序 描述 对于给定的由大小写字母混合构成的 n 个单词&#xff0c;输出按字典序从小到大排序后的结果。 从字符串的第一个字符开始逐个比较&#xff0c;直到找到第一个不同的位置&#xff0c;通过比较这个位置字符对应的&#xff08;A<⋯<Z<a<⋯<…...

CPU 负载 和 CPU利用率 的区别

简单记录下 top 命令中&#xff0c;CPU利用率核CPU负载的概念&#xff0c; &#xff08;1&#xff09;CPU利用率&#xff1a;指在一段时间内 表示 CPU 实际工作时间占总时间的百分比。表示正在执行进程的时间比例&#xff0c;包括用户空间和内核空间程序的执行时间。通常包含以…...

SSM框架

SSM 框架是 Java Web 开发中广泛使用的经典组合&#xff0c;由 Spring、Spring MVC 和 MyBatis 三个开源框架整合而成&#xff0c;适用于构建中大型企业级应用。 1. SSM框架组成 框架作用核心特性Spring管理业务层&#xff08;Service&#xff09;和持久层&#xff08;DAO&am…...

maven无法解析插件 org.apache.maven.plugins:maven-jar-plugin:3.4.1

解决流程 1.修改maven仓库库地址 2.删除本地的maven仓库 maven插件一直加载有问题: 无法解析插件 org.apache.maven.plugins:maven-jar-plugin:3.4.1 开始以为maven版本有问题&#xff0c;重装了maven&#xff0c;重装了idea工具。结果问题还是没解决。研究之后发现&#xf…...