React Contxt详解
React Contxt详解
React 的 Context API 是用于跨组件层级传递数据的解决方案,尤其适合解决「prop drilling」(多层组件手动传递 props)的问题。以下是关于 Context 的详细解析:
文章目录
- React Contxt详解
- 一、Context 核心概念
- 二、基础用法
- 1. 创建 Context
- 2. Provider 提供数据
- 3. 在函数式组件中消费数据
- **一、基础用法**
- 1. 创建 Context
- 2. 使用 Provider 提供数据
- 3. 在函数式组件中消费数据
- **二、性能优化**
- 1. 避免无效渲染
- 2. 拆分 Context
- **三、动态更新 Context**
- 1. 更新 Context 的值
- 2. 在子组件中更新 Context
- **四、结合 useReducer 管理复杂状态**
- 1. 创建 Context 和 Reducer
- 2. 在子组件中分别消费状态和派发
- 五、使用场景
- 1. 主题切换(Theme) - 注释版
- 2. 用户认证信息 - 注释版
- 3. 多语言国际化(i18n)- 注释版
- 4. 全局状态管理(购物车)- 注释版
- 5. 复杂表单状态 - 注释版
一、Context 核心概念
- Context 对象:通过
React.createContext()
创建,包含Provider
和Consumer
两个组件。 - Provider:提供数据的组件,包裹下游组件,通过
value
属性传递数据。 - Consumer:消费数据的组件(或使用
useContext
Hook),通过订阅 Context 获取最新值。
二、基础用法
1. 创建 Context
import React, { createContext, useContext, useState } from 'react';// 1. 创建 Context(可选默认值)
const ThemeContext = createContext('light'); // 默认值 'light'
2. Provider 提供数据
function App() {const [theme, setTheme] = React.useState('dark');return (<ThemeContext.Provider value={{ theme, setTheme }}><Toolbar /></ThemeContext.Provider>);
}
3. 在函数式组件中消费数据
function ThemedButton() {// 使用 useContext Hook 获取数据const { theme, setTheme } = useContext(ThemeContext);return (<buttononClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}style={{ background: theme === 'dark' ? '#333' : '#fff' }}>当前主题: {theme}</button>);
}
在 React 函数式组件中使用 Context 主要通过 useContext
Hook 实现。以下是详细步骤和示例:
一、基础用法
1. 创建 Context
import React, { createContext, useContext, useState } from 'react';// 1. 创建 Context(可选默认值)
const ThemeContext = createContext('light'); // 默认值 'light'
2. 使用 Provider 提供数据
function App() {const [theme, setTheme] = useState('dark');return (// Provider 通过 value 传递数据<ThemeContext.Provider value={{ theme, setTheme }}><Toolbar /></ThemeContext.Provider>);
}
3. 在函数式组件中消费数据
function ThemedButton() {// 使用 useContext Hook 获取数据const { theme, setTheme } = useContext(ThemeContext);return (<buttononClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}style={{ background: theme === 'dark' ? '#333' : '#fff' }}>当前主题: {theme}</button>);
}
二、性能优化
1. 避免无效渲染
如果 Provider
的 value
是对象,每次父组件渲染会生成新对象,导致子组件无效重渲染。使用 useMemo
优化:
function App() {const [theme, setTheme] = useState('dark');// 使用 useMemo 避免重复创建对象const value = useMemo(() => ({ theme, setTheme }), [theme]);return (<ThemeContext.Provider value={value}><Toolbar /></ThemeContext.Provider>);
}
2. 拆分 Context
将频繁更新的数据与不常更新的数据拆分到不同的 Context 中:
// UserContext(频繁更新)
const UserContext = createContext({ name: 'Guest' });// ThemeContext(不常更新)
const ThemeContext = createContext('light');
三、动态更新 Context
1. 更新 Context 的值
通过 useState
或 useReducer
动态更新 Context:
function App() {const [theme, setTheme] = useState('dark');const toggleTheme = () => {setTheme(prev => prev === 'dark' ? 'light' : 'dark');};return (<ThemeContext.Provider value={{ theme, toggleTheme }}><Toolbar /></ThemeContext.Provider>);
}
2. 在子组件中更新 Context
function ThemeSwitcher() {const { toggleTheme } = useContext(ThemeContext);return <button onClick={toggleTheme}>切换主题</button>;
}
四、结合 useReducer 管理复杂状态
1. 创建 Context 和 Reducer
const StateContext = createContext();
const DispatchContext = createContext();function reducer(state, action) {switch (action.type) {case 'TOGGLE_THEME':return { ...state, theme: state.theme === 'dark' ? 'light' : 'dark' };default:return state;}
}function App() {const [state, dispatch] = useReducer(reducer, { theme: 'dark' });return (<StateContext.Provider value={state}><DispatchContext.Provider value={dispatch}><Toolbar /></DispatchContext.Provider></StateContext.Provider>);
}
2. 在子组件中分别消费状态和派发
function ThemeSwitcher() {const state = useContext(StateContext);const dispatch = useContext(DispatchContext);return (<buttononClick={() => dispatch({ type: 'TOGGLE_THEME' })}style={{ background: state.theme === 'dark' ? '#333' : '#fff' }}>当前主题: {state.theme}</button>);
}
操作 | 代码示例 | 适用场景 |
---|---|---|
创建 Context | createContext(defaultValue) | 定义全局状态 |
提供数据 | <ThemeContext.Provider value> | 父组件向任意深度子组件传值 |
消费数据 | useContext(ThemeContext) | 函数组件中直接获取数据 |
动态更新 | value={{ theme, setTheme }} | 需要响应式更新的场景 |
性能优化 | useMemo 优化 Provider 的 value | 避免无效重渲染 |
五、使用场景
1. 主题切换(Theme) - 注释版
// ThemeContext.js
import React, { createContext, useContext, useState } from 'react';// 创建主题上下文,默认值为 'light'
const ThemeContext = createContext();/*** 主题提供者组件* @param {Object} props - 组件属性* @param {React.ReactNode} props.children - 子组件*/
export function ThemeProvider({ children }) {// 使用 useState 管理主题状态,初始值为 'light'const [theme, setTheme] = useState('light');// 切换主题的函数const toggleTheme = () => {setTheme(prev => prev === 'light' ? 'dark' : 'light');};return (// 通过 Provider 向下传递主题状态和切换函数<ThemeContext.Provider value={{ theme, toggleTheme }}>{/* 根容器动态添加主题类名 */}<div className={`app ${theme}`}>{children}</div></ThemeContext.Provider>);
}/*** 自定义主题 Hook* @returns {{theme: string, toggleTheme: function}} 主题对象*/
export const useTheme = () => {const context = useContext(ThemeContext);if (!context) {throw new Error('useTheme 必须在 ThemeProvider 内使用');}return context;
};// App.js
import { ThemeProvider } from './ThemeContext';function App() {return (// 包裹应用根组件提供主题功能<ThemeProvider><Header /><Content /></ThemeProvider>);
}// Header.js
import { useTheme } from './ThemeContext';function Header() {// 获取当前主题状态和切换函数const { theme, toggleTheme } = useTheme();return (<header><h1>My App</h1>{/* 主题切换按钮 */}<button onClick={toggleTheme}>当前主题:{theme === 'light' ? '🌞 明亮' : '🌙 暗黑'}</button></header>);
}
2. 用户认证信息 - 注释版
// AuthContext.js
import React, { createContext, useContext, useState } from 'react';// 创建认证上下文
const AuthContext = createContext();/*** 认证提供者组件* @param {Object} props - 组件属性* @param {React.ReactNode} props.children - 子组件*/
export function AuthProvider({ children }) {// 用户信息状态const [user, setUser] = useState(null);// 认证状态const [isAuthenticated, setIsAuthenticated] = useState(false);// 登录方法const login = (userData) => {setUser(userData);setIsAuthenticated(true);};// 退出方法const logout = () => {setUser(null);setIsAuthenticated(false);};return (<AuthContext.Provider value={{ user, isAuthenticated, login, logout }}>{children}</AuthContext.Provider>);
}/*** 自定义认证 Hook* @returns {{* user: Object|null,* isAuthenticated: boolean,* login: function,* logout: function* }} 认证上下文对象*/
export const useAuth = () => {const context = useContext(AuthContext);if (!context) {throw new Error('useAuth 必须在 AuthProvider 内使用');}return context;
};// ProtectedRoute.js
import { useAuth } from './AuthContext';
import { Navigate } from 'react-router-dom';/*** 保护路由组件* @param {Object} props - 组件属性* @param {React.ReactNode} props.children - 子路由*/
function ProtectedRoute({ children }) {const { isAuthenticated } = useAuth();// 未认证时跳转到登录页if (!isAuthenticated) {return <Navigate to="/login" replace />;}return children;
}// UserProfile.js
import { useAuth } from './AuthContext';function UserProfile() {const { user, logout } = useAuth();return (<div className="user-profile"><h2>👤 用户资料</h2>{user ? (<><p>📛 姓名:{user.name}</p><p>📧 邮箱:{user.email}</p><p>🎭 角色:{user.role}</p></>) : (<p>⚠️ 未获取到用户信息</p>)}<button onClick={logout}>🚪 退出登录</button></div>);
}
3. 多语言国际化(i18n)- 注释版
// I18nContext.js
import React, { createContext, useContext, useState } from 'react';// 翻译字典配置
const translations = {en: {greeting: 'Hello',button: 'Click me',welcome: 'Welcome to our app'},zh: {greeting: '你好',button: '点击我',welcome: '欢迎使用我们的应用'}
};// 创建国际化上下文
const I18nContext = createContext();/*** 国际化提供者组件* @param {Object} props - 组件属性* @param {React.ReactNode} props.children - 子组件*/
export function I18nProvider({ children }) {// 当前语言状态,默认英文const [locale, setLocale] = useState('en');/*** 翻译函数* @param {string} key - 翻译键* @returns {string} 翻译文本*/const t = (key) => translations[locale][key] || key;return (<I18nContext.Provider value={{ locale, setLocale, t }}>{children}</I18nContext.Provider>);
}/*** 自定义国际化 Hook* @returns {{* locale: string,* setLocale: function,* t: function* }} 国际化上下文对象*/
export const useI18n = () => {const context = useContext(I18nContext);if (!context) {throw new Error('useI18n 必须在 I18nProvider 内使用');}return context;
};// LanguageSwitcher.js
import { useI18n } from './I18nContext';function LanguageSwitcher() {const { locale, setLocale } = useI18n();return (<div className="language-switcher"><select value={locale} onChange={(e) => setLocale(e.target.value)}><option value="en">🇺🇸 English</option><option value="zh">🇨🇳 中文</option></select></div>);
}// Greeting.js
import { useI18n } from './I18nContext';function Greeting() {const { t } = useI18n();return (<div className="greeting"><h1>🎉 {t('welcome')}</h1><button className="cta-button">{t('button')}</button></div>);
}
4. 全局状态管理(购物车)- 注释版
// CartContext.js
import React, { createContext, useContext, useReducer } from 'react';// 创建购物车上下文
const CartContext = createContext();/*** 购物车 reducer 处理函数* @param {Object} state - 当前状态* @param {Object} action - 操作对象*/
const cartReducer = (state, action) => {switch (action.type) {case 'ADD_ITEM':// 检查是否已存在相同商品const existingItem = state.items.find(item => item.id === action.payload.id);if (existingItem) {// 数量增加return {...state,items: state.items.map(item =>item.id === action.payload.id? { ...item, quantity: item.quantity + 1 }: item)};}// 新增商品return {...state,items: [...state.items, { ...action.payload, quantity: 1 }]};case 'REMOVE_ITEM':// 过滤移除商品return {...state,items: state.items.filter(item => item.id !== action.payload.id)};case 'CLEAR_CART':// 清空购物车return { ...state, items: [] };default:return state;}
};/*** 购物车提供者组件* @param {Object} props - 组件属性* @param {React.ReactNode} props.children - 子组件*/
export function CartProvider({ children }) {// 使用 useReducer 管理复杂状态const [cart, dispatch] = useReducer(cartReducer, { items: [] });// 添加商品到购物车const addToCart = (product) => {dispatch({ type: 'ADD_ITEM', payload: product });};// 从购物车移除商品const removeFromCart = (productId) => {dispatch({ type: 'REMOVE_ITEM', payload: { id: productId } });};// 清空购物车const clearCart = () => {dispatch({ type: 'CLEAR_CART' });};// 计算总数量const totalItems = cart.items.reduce((sum, item) => sum + item.quantity, 0);// 计算总金额const totalPrice = cart.items.reduce((sum, item) => sum + (item.price * item.quantity), 0);return (<CartContext.Provider value={{ cart, addToCart, removeFromCart, clearCart,totalItems,totalPrice}}>{children}</CartContext.Provider>);
}/*** 自定义购物车 Hook* @returns {{* cart: Object,* addToCart: function,* removeFromCart: function,* clearCart: function,* totalItems: number,* totalPrice: number* }} 购物车上下文对象*/
export const useCart = () => {const context = useContext(CartContext);if (!context) {throw new Error('useCart 必须在 CartProvider 内使用');}return context;
};// ProductItem.js
import { useCart } from './CartContext';function ProductItem({ product }) {const { addToCart } = useCart();return (<div className="product-card"><h3>{product.name}</h3><p>💰 价格:${product.price}</p><button onClick={() => addToCart(product)}className="add-to-cart">🛒 加入购物车</button></div>);
}// CartSummary.js
import { useCart } from './CartContext';function CartSummary() {const { cart, removeFromCart, clearCart, totalItems, totalPrice } = useCart();return (<div className="cart-summary"><h2>🛍️ 购物车({totalItems} 件商品)</h2><ul className="cart-items">{cart.items.map(item => (<li key={item.id} className="cart-item"><span>{item.name} × {item.quantity}</span><span>${item.price * item.quantity}</span><button onClick={() => removeFromCart(item.id)}className="remove-button">❌ 移除</button></li>))}</ul><div className="cart-total"><p>💵 总计:${totalPrice}</p><button onClick={clearCart}className="clear-button">🧹 清空购物车</button></div></div>);
}
5. 复杂表单状态 - 注释版
// FormContext.js
import React, { createContext, useContext, useState } from 'react';// 创建表单上下文
const FormContext = createContext();/*** 表单提供者组件* @param {Object} props - 组件属性* @param {React.ReactNode} props.children - 子组件*/
export function FormProvider({ children }) {// 管理复杂表单数据结构const [formData, setFormData] = useState({personalInfo: {firstName: '',lastName: '',email: ''},address: {street: '',city: '',zipCode: ''},preferences: {newsletter: false,notifications: true}});/*** 更新表单字段* @param {string} section - 表单区块(personalInfo/address/preferences)* @param {string} field - 字段名称* @param {any} value - 字段值*/const updateField = (section, field, value) => {setFormData(prev => ({...prev,[section]: {...prev[section],[field]: value}}));};// 表单验证方法const validateForm = () => {// 示例验证逻辑const isValid = !!(formData.personalInfo.firstName &&formData.personalInfo.email.includes('@'));return isValid;};return (<FormContext.Provider value={{ formData, updateField, validateForm }}>{children}</FormContext.Provider>);
}/*** 自定义表单 Hook* @returns {{* formData: Object,* updateField: function,* validateForm: function* }} 表单上下文对象*/
export const useForm = () => {const context = useContext(FormContext);if (!context) {throw new Error('useForm 必须在 FormProvider 内使用');}return context;
};// PersonalInfoStep.js
import { useForm } from './FormContext';function PersonalInfoStep() {const { formData, updateField } = useForm();return (<div className="form-section"><h2>📝 个人信息</h2><div className="form-group"><label>名字:</label><inputtype="text"value={formData.personalInfo.firstName}onChange={(e) => updateField('personalInfo', 'firstName', e.target.value)}placeholder="请输入名字"/></div><div className="form-group"><label>姓氏:</label><inputtype="text"value={formData.personalInfo.lastName}onChange={(e) => updateField('personalInfo', 'lastName', e.target.value)}placeholder="请输入姓氏"/></div><div className="form-group"><label>邮箱:</label><inputtype="email"value={formData.personalInfo.email}onChange={(e) => updateField('personalInfo', 'email', e.target.value)}placeholder="example@domain.com"/></div></div>);
}// FormSubmit.js
import { useForm } from './FormContext';function FormSubmit() {const { formData, validateForm } = useForm();const handleSubmit = () => {if (validateForm()) {console.log('✅ 表单验证通过,提交数据:', formData);// 这里可以添加实际的提交逻辑alert('表单提交成功!');} else {console.log('❌ 表单验证失败');alert('请填写必填字段!');}};return (<button onClick={handleSubmit}className="submit-button">提交表单</button>);
}</div><div className="form-group"><label>邮箱:</label><inputtype="email"value={formData.personalInfo.email}onChange={(e) => updateField('personalInfo', 'email', e.target.value)}placeholder="example@domain.com"/></div></div>);
}// FormSubmit.js
import { useForm } from './FormContext';function FormSubmit() {const { formData, validateForm } = useForm();const handleSubmit = () => {if (validateForm()) {console.log('✅ 表单验证通过,提交数据:', formData);// 这里可以添加实际的提交逻辑alert('表单提交成功!');} else {console.log('❌ 表单验证失败');alert('请填写必填字段!');}};return (<button onClick={handleSubmit}className="submit-button">提交表单</button>);
}
相关文章:
React Contxt详解
React Contxt详解 React 的 Context API 是用于跨组件层级传递数据的解决方案,尤其适合解决「prop drilling」(多层组件手动传递 props)的问题。以下是关于 Context 的详细解析: 文章目录 React Contxt详解一、Context 核心概念二…...
前端工程的相关管理 git、branch、build
环境配置 标准环境打包 测试版:npm run build-test 预生产:npm run build-preview 正式版:npm run build 建议本地建里一个 .env.development.local 方便和后端联调时修改配置相关信息。 和 src 同级有一下区分环境的文件: .env.d…...
鸿蒙 Location Kit(位置服务)
移动终端设备已经深入人们日常生活的方方面面,如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动,都离不开定位用户终端设备的位置。 Location Kit 使用多种定位技术提供服务,可以准确地确定设备在室外/室…...
人工智能、机器学习与深度学习:概念解析与内在联系
人工智能、机器学习与深度学习:概念解析与内在联系 一、人工智能(Artificial Intelligence, AI) (一)人工智能的定义 人工智能的定义随着技术发展不断演变。从广义上讲,人工智能是指通过计算机技术实现的…...
【Linux学习】Ubuntu对用户进行管理
目录 写在前面 【Linux学习】Ubuntu对用户进行管理一、为什么需要用户管理?二、用户管理基础操作(一)用户管理1. 用户管理命令表格2. 关键操作场景说明场景一:创建用户并配置权限场景二:修改用户属性场景三:…...
JVM 垃圾回收器
以下是对主流 JVM 垃圾回收器的详细解析,涵盖 一、Serial GC(单线程串行回收器) 二、Parallel GC(吞吐量优先回收器) 三、CMS(Concurrent Mark Sweep,低延迟回收器) 四、G1&…...
JUC入门(三)
7、Callable 1、可以有返回值 2、可以抛出异常 3、方法不同 run()/call() 代码测试 老版本的应用 package com.yw.callable;public class Old {public static void main(String[] args) {new Thread(new MyThread()).start();} }class MyThread implements Runnable{Overri…...
RV1126多线程获取SMARTP的GOP模式数据和普通GOP模式数据
通过代码的方式同时获取SMARTP模式的VENC码流数据和普通GOP模式的VENC码流数据,并进行对比画质。 一.RV1126 VI采集摄像头数据并同时编码SMARTP模式和普通GOP模式的编码码流流程 RV1126利用多线程同时获取普通GOP的VENC码流数据和SMARTP的码流数据一般如上图&#…...
MySQL事务、视图、索引、备份和恢复
1. 事务 如果不使用事务,那么如果出现了张三账户汇款成功-500元,但是李四那边的服务器出现了故障没有接收到500元,那么就会出现张三账户里有500元但是李四那边的账户还是1元的情况,转账的500元被吞了。 创建事务 2. 视图 创建视图…...
yolov8训练模型优化模型【误检】
针对 YOLOv8 模型在电动车人脸检测中出现误检行人人脸的问题,结合最新研究与实践经验,以下提供多维度优化方案及具体实施步骤: 一、数据集优化 数据清洗与标注增强 剔除干扰样本:确保训练集中所有标注仅包含骑行状态的人脸&#x…...
初识MySQL · 索引
目录 前言: 重温磁盘 认识索引 为什么这么做,怎么做 重谈page 聚簇索引VS非聚簇索引 回表查询 索引分类 前言: 前文我们主要是介绍了MySQL的一些基本操作,增删查改一类的操作都介绍了,并且因为大多数情况下&am…...
Kubernetes in action-配置和应用升级
Kubernetes的配置和应用升级 1、配置1.1 configMap1.2 secret1.3 Downward API1.4 Kubernetes API 2、服务升级2.1 升级方式2.1.1 先删除所有的旧版pod,使用新版本pod替换2.1.2 先创建新版pod,再删除旧版本pod2.1.3 滚动优化 2.2 使用deployment声明式升…...
十三、面向对象底层逻辑-Dubbo序列化Serialization接口
一、引言:分布式通信的数据桥梁 在分布式服务调用中,参数的跨网络传输需要将对象转化为二进制流,这一过程直接影响系统的性能、兼容性与安全性。Dubbo通过Serialization接口构建了可扩展的序列化体系,支持多种序列化协议的无缝切…...
5.19 打卡
DAY 30 模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入...
MathType公式如何按照(1)(2)…编号
在word中使用mathtype插入公式,发现插入的公式编号默认为(1.1),(1.2)…,但论文中常用的公式编号是(1)(2)…,分享一下如何实现(1.1)→(1)。 ①word菜单找到“MathType”,点击“插入编号”-“格式化”。 ②取消勾选“章编号”和“节…...
解决即使安装了pageoffice网页还是无法跳转、点击按钮没有反应等问题
出现的现象: 安装了pageoffice网页还是无法跳转、点击按钮没有反应 网页提示的错误: 点击按钮之前右键检查网页发现的错误: 点击无效按钮之后右键检查出现的错误: 原因: 鉴于安全性的考虑,新版浏览器不支…...
正点原子STM32新建工程
MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。 MDK5 由两个部分组成: MDK Core 和 Software Packs。 MDK Core 又分成四个部分: uVision IDE with Editor(编辑器), ARMC/C Compiler(编译…...
计算机网络 第三章:运输层(一)
运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。该层为运行在不同主机上的应用进程提供直接的通信服务。通常特别关注因特网协议,即 TCP 和 UDP 运输层协议。 讨论运输层和网络层的关析,为研究运输层第一个关键功能ÿ…...
机器学习(14)——模型调参
文章目录 一、动态调参方法论1. 调参策略选择2. 千万数据优化原则 二、模型调参策略对比1. LightGBM调参路线2. XGBoost调参路线3. 随机森林调参策略 三、代码实现示例通用数据准备(适用于所有模型)1. LightGBM调参示例2. XGBoost调参示例3. 随机森林调参…...
基于PetaLinux的Zynq PS应用自启动全攻略
一、嵌入式Linux启动管理的艺术 在工业机器人、智能摄像头、边缘计算网关等场景中,开机自启动管理是系统可靠性的第一道关卡。本文将深入讲解Zynq PS端在PetaLinux环境下实现: Systemd服务深度定制启动时序精准控制启动速度优化技巧动态服务管理创新方案二、环境搭建与工程配…...
贪心算法:多处最优服务次序、删数问题
多处最优服务次序问题 问题描述:设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti(1≤i≤n),共有s处可以提供此项服务。应如何安排n个顾客的服务次序,才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。 算法设计:对于给定的n个顾…...
使用 Flask 框架实现FTP,允许用户通过 Web 界面浏览和下载文件夹中的所有文件
Flask 文件和文件夹下载服务实现 以下是一个基于 Flask 框架的简单 Web 服务,用于开放指定文件夹(./shared_files),允许用户通过浏览器浏览和下载文件夹中的所有文件和子文件夹。ZIP 和 TAR 文件将直接下载,而文件夹将…...
【Go】从0开始学习Go
文章目录 从0开始学习Go0 与C对比1 代码框架1.1 helloworld式代码示例1.2 主体代码元素(核心三部分)1.3 其他 2 与C/C区别3 有用的小工具4 注意事项 从0开始学习Go 0 与C对比 特性CGo编译型语言需要编译为机器码直接编译为二进制可执行文件静态类型类型…...
软件设计师SQL考点分析——求三连
一、考点分值占比与趋势分析 综合知识分值统计表(75分制) 年份考题数量分值分值占比考察重点2018334%关系代数、权限控制2019222.67%SQL注入、授权语句2020445.33%投影操作、权限回收2021334%视图操作、权限传递2022222.67%数据库安全、WITH GRANT OPT…...
使用tcs34725传感器和51单片机识别颜色
使用TCS34725颜色传感器和51单片机来识别颜色是一个非常有趣的项目。TCS34725是一种常用的RGB颜色传感器,能够测量红、绿、蓝光的强度,从而实现颜色识别。 1. 硬件连接 TCS34725传感器通过IC接口与51单片机连接。以下是连接方式: SDA&…...
数据库-oracle-包-视图传参
并发下可能不准确 -- 修改包规范 CREATE OR REPLACE PACKAGE sczz.p_view_param IS function set_n(n varchar2) return varchar2; function get_n return varchar2; function set_ny(ny varchar2) return varchar2; function get_ny return varchar2; …...
深入探讨Java中的上下文传递与ThreadLocal的局限性及Scoped Values的兴起
在Java开发中,特别是在依赖框架的应用程序中,上下文数据的管理是一个常见但具有挑战性的问题。上下文数据可能包括元数据、配置信息或其他需要在代码不同部分之间共享的信息。传统的做法是通过方法参数显式传递这些上下文,但这种方法会导致代码复杂、难以维护,尤其是在大型…...
Spring boot 学习笔记2
Maven 项目管理工具:Maven 通过 pom.xml(Project Object Model)文件描述项目配置,包括依赖、构建流程、插件等,实现项目标准化管理 依赖管理:自动下载并管理项目所需的第三方库(如 Spring、MyB…...
“保证医疗器械信息来源合法 真实、安全的保障措施、情况说明及相关证明”模板
保证医疗器械信息来源合法真实、安全的保障措施、情况说明及相关证明 一、医疗器械信息来源合法、真实、安全的管理措施 目前我公司网站所展示的医疗器械是企业代理品种,是取得合法注册资格的产品,拥有合法证明文件的产品。本网站仅展示本公司行政许可…...
Feature Toggle 不再乱:如何设计一个干净、安全、可控的特性开关系统?
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
不锈钢保温容器行业2025数据分析报告
不锈钢保温容器市场概况 2024年全球不锈钢保温容器市场规模约为453.3亿元,预计到2031年将增长至608.3亿元,年均复合增长率(CAGR)为4.3%。这一增长主要得益于全球范围内对保温容器需求的持续增加,尤其是在户外活动、餐…...
leetcode239 滑动窗口最大值deque方式
这段文字描述的是使用单调队列(Monotonic Queue) 解决滑动窗口最大值问题的优化算法。我来简单解释一下: 核心思路 问题分析:在滑动窗口中,若存在两个下标 i < j 且 nums[i] ≤ nums[j],则 nums[i] 永远…...
腾讯云怎么在游戏云中助力
腾讯云游戏云:依托深厚游戏基因,打造高质量全方位生态平台 在竞争激烈的云计算市场中,腾讯云凭借其得天独厚的游戏生态资源和深耕多年的技术沉淀,正成为游戏行业不可忽视的重要力量。腾讯不仅是全球领先的游戏开发和发行商&#…...
深入理解pip:Python包管理的核心工具与实战指南
# 深入理解pip:Python包管理的核心工具与实战指南 在Python开发中,第三方库是提升效率的关键。而pip作为Python官方的包管理工具,承担着安装、卸载、升级和管理库的重要职责。本文将全面解析pip的核心命令,结合实例演示用法&#…...
【python】windows修改 pip 默认安装路径
在 Windows 系统 下,希望修改 pip 默认安装路径,结合你前面贴的图片和信息,一个 推荐做法(不修改 site.py)的完整教程。 目标:让 pip 安装包默认装到你指定的路径(如 D:\MyPythonLibsÿ…...
Python函数——万字详解
—— 小 峰 编 程 导 语: 从今天开始,我们将进入第二模块的学习——函数。第一模块主要是学习python基础知识,从第二模块开始就可以通过程序去解决工作中实际的问题。从今天开始,我们将进入第二模块的学习,此模块…...
es在已有历史数据的文档新增加字段操作
新增字段设置默认值 场景 在已经有大量数据的索引文档上,增加新字段 技术实现 一.更新索引映射 通过PUT请求显式定义新字段类型,确保后续写入的文档能被正确解析 PUT /文档名/_mapping {"properties": {"字段名1": {"type…...
LeetCode 35 搜索插入位置题解
LeetCode 35 搜索插入位置题解 题目描述 题目链接 给定一个排序数组和一个目标值,在数组中找到目标值并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置(需保证数组仍然有序)。要求时间复杂度为 O(log n)。…...
RabbitMQ通信模式(Simplest)Python示例
RabbitMQ通信模式-Python示例 0.RabbitMQ官网通信模式1.Simplest(简单)模式1.1 发送端1.2 接收端 0.RabbitMQ官网通信模式 1.Simplest(简单)模式 1.1 发送端 # -*- coding: utf-8 -*- """ Author: xxx date: 2025/5/19 11:30 Description: Simaple简单模…...
游戏开发实战(一):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
文章目录 奇美拉项目游戏规则奇美拉(Chimeras)档案领队成员 结果展示: 奇美拉项目 由于项目工程较大,并且我打算把我的思考过程和实现过程中踩过的坑都分享一下,因此会分3-4篇博文详细讲解本项目。本文首先介绍下游戏规则并给出奇美拉档案。…...
力扣热题100之删除链表的倒数第N个节点
题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 代码 方法一 将链表中的值放入列表中,然后删除倒数第n个值,再将剩下的数依次转化为链表 # Definition for singly-linked list. # class ListNode: # …...
OCframework编译Swift
建一个OC的framework: 需要对外暴露的OC文件,需要放到OC的.h文件中 framework中,OC类,调用framework中的Swift类: #import "WowAudioFocus/WowAudioFocus-Swift.h" //02 #import "{工程名}/{工程…...
【AI News | 20250519】每日AI进展
AI Repos 1、deepdrone DeepDrone是一款基于smolagents框架的无人机聊天代理,集成DroneKit实现无人机分析与操作。用户可通过自然语言聊天与无人机助手交互,实现飞行路径和传感器数据可视化、基于飞行时长的维护建议、任务规划以及真实的无人机控制&…...
分布式ID生成系统
代码地址: github mid 简介 分布式 ID 生成系统是一个高性能、可靠的 ID 生成服务,支持两种模式:Snowflake(基于时间戳的内存生成)和 Segment(基于 MySQL 的号段分配)。系统采用双 Buffer 策略优化性能,集成 Prometheus 监控和 Zap 结构化日志,确保高可用性和可观测性…...
MAC常用操作整理
音量方法: 电脑键盘的右上角就有静音和不静音的按钮,还有调节音量的按钮,调节屏幕亮度的按钮 切换输入法方法: 1.大写按键,2.function按键(fn), 3.control 空格键, 选择上一个输入法,4.controloption空格…...
【Canvas与图标】圆角方块蓝星CSS图标
【成图】 120*120的png图标 大小图: 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>圆角方块蓝星CSS Draft1</…...
易境通散货拼柜系统:提高货代企业货物配载效率
在国际物流代理运输领域,货物配载是整个供应链的核心环节,其优化对于提升整个供应链的效率至关重要。传统的配载管理方式往往依赖人工操作,不仅效率低下,还容易出现错误。面对多订单、多货主、多目的地的复杂场景,传统…...
[Spring Boot]整合Java Mail实现Outlook发送邮件
日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等。日常比较常用的邮件发送方包括:163、QQ等,本文主要讲解Outlook SMTP的开启方式、OutLook STARTTTL的配置、如何通过JavaMail来实现电子邮件的发送等。 Outlook作为微软提供的企业电子…...
【盈达科技】GEO优化实战策略
提升内容在生成式引擎中的可见性:实战策略 随着生成式引擎(Generative Engines, GEs)的兴起,内容创作者面临着新的挑战和机遇。这些引擎通过整合和总结多源信息来提供精准且个性化的回答,正在迅速取代传统搜索引擎。为…...
HTTP 协议基础
本篇文章会从如下角度介绍 HTTP 协议: 原理与工作机制请求方法与状态码Header 与 Body 1、原理与工作机制 1.1 HTTP 是什么 HyperText Transfer Protocol,超文本传输协议,"超"表示扩展而非超级,即可以链接到其他文本…...