《Pinia 从入门到精通》Vue 3 官方状态管理 -- 进阶使用篇
《Pinia 从入门到精通》Vue 3 官方状态管理 – 基础入门篇
《Pinia 从入门到精通》Vue 3 官方状态管理 – 进阶使用篇
《Pinia 从入门到精通》Vue 3 官方状态管理 – 插件扩展篇
目录
- Store 的模块化设计
- 4.1 多模块结构设计
- ✅ 推荐目录结构(中大型项目)
- 4.2 定义独立模块 Store
- 4.3 在组件中组合多个 Store
- 4.4 跨模块调用(解耦调用)
- 4.5 模块化 Store 的命名约定
- 4.6 所有 Store 统一导出(可选)
- ✅ 小结
- 类型系统集成(TypeScript 支持)
- 5.1 Store 的类型推导基础
- 5.2 自定义类型(推荐)
- ✅ 定义接口
- ✅ 使用泛型定义 Store
- 5.3 Setup Store(组合式写法)中的类型支持
- 5.4 类型提示与 IDE 自动补全效果
- 5.5 类型约束下的好处
- ✅ 小结
- 持久化存储与插件机制
- 6.1 什么是 Pinia 插件?
- 6.2 状态持久化插件:`pinia-plugin-persistedstate`
- ✅ 安装
- ✅ 注册插件
- 6.3 使用持久化配置
- 6.4 自定义持久化策略
- 6.5 多模块下持久化组合
- 6.6 自定义插件机制(进阶)
- 6.7 生命周期钩子:`$subscribe` & `$onAction`
- 1. `$subscribe` —— 监听状态变化
- 2. `$onAction` —— 监听 Action 执行
- ✅ 小结
- 最佳实践总结与项目结构规范化设计
- 7.1 推荐项目结构
- 7.2 Store 命名规范
- 7.3 状态设计原则
- 7.4 Store 类型系统统一
- 7.5 持久化策略标准化
- 7.6 自动化导出 Store
- 7.7 组合逻辑封装:`useXXXLogic`
- ✅ 实战应用:多页面应用的 Store 模型设计范式
- ✅ 统一 Store 模板(可直接复制)
- ✅ 结语:Pinia 最佳实践总览图
Store 的模块化设计
随着项目规模扩大,单一 Store 会迅速膨胀,导致维护困难。
我们将从实际项目结构出发,讲解如何构建多模块 Store,支持清晰组织、职责分离和可维护性。
Pinia 提供了天然模块化的设计,每一个 Store 就是一个模块,天生支持按需加载、组合调用。
4.1 多模块结构设计
✅ 推荐目录结构(中大型项目)
src/
├── stores/
│ ├── index.ts # 导出所有 store(可选)
│ ├── user.ts # 用户模块
│ ├── auth.ts # 登录认证模块
│ ├── cart.ts # 购物车模块
│ └── product.ts # 商品模块
每个模块都用 defineStore
定义自己的状态、逻辑、计算属性,保持内聚。
4.2 定义独立模块 Store
// stores/user.ts
import { defineStore } from 'pinia'export const useUserStore = defineStore('user', {state: () => ({name: '',email: ''}),actions: {setUser(name: string, email: string) {this.name = namethis.email = email}}
})
// stores/cart.ts
import { defineStore } from 'pinia'export const useCartStore = defineStore('cart', {state: () => ({items: [] as { id: number; name: string; qty: number }[]}),getters: {totalItems: (state) => state.items.reduce((sum, item) => sum + item.qty, 0)},actions: {addItem(item: { id: number; name: string; qty: number }) {this.items.push(item)}}
})
4.3 在组件中组合多个 Store
<script setup lang="ts">
import { useUserStore } from '@/stores/user'
import { useCartStore } from '@/stores/cart'const userStore = useUserStore()
const cartStore = useCartStore()function checkout() {console.log(`${userStore.name} 正在购买 ${cartStore.totalItems} 件商品`)
}
</script>
4.4 跨模块调用(解耦调用)
Pinia 中不同 Store 可相互独立调用,而无需手动注入依赖:
// stores/order.ts
import { defineStore } from 'pinia'
import { useUserStore } from './user'export const useOrderStore = defineStore('order', {actions: {submitOrder() {const userStore = useUserStore()console.log(`下单用户:${userStore.name}`)// ...业务逻辑}}
})
注意:调用其他 Store 必须在 action 中动态获取,而不能在 Store 顶层直接引入(避免依赖环问题)。
4.5 模块化 Store 的命名约定
内容 | 命名规则 | 示例 |
---|---|---|
Store 函数 | useXxxStore | useUserStore |
文件名 | 模块名小写 | user.ts |
Store ID | 与函数名一致的小写形式 | 'user' |
命名空间 | 使用 id 区分,无需嵌套定义 | 所有 Store 自动隔离 |
4.6 所有 Store 统一导出(可选)
你可以在 stores/index.ts
中统一导出,方便使用:
// stores/index.ts
export * from './user'
export * from './cart'
export * from './order'
// 使用
import { useUserStore, useCartStore } from '@/stores'
✅ 小结
模块化是构建大型 Vue 应用的核心策略,Pinia 以其函数式 Store 和天然隔离的 Store ID 设计,使模块化变得:
- 更加清晰(每个模块职责单一)
- 更易维护(按需加载,互不干扰)
- 更易测试(每个 Store 独立可测试)
类型系统集成(TypeScript 支持)
Pinia 天生支持 TypeScript,基于其函数式 API 和明确的声明结构,使得类型推导更加自然、精准。
5.1 Store 的类型推导基础
最基础的 defineStore
形式在 TS 中已经具备类型提示能力:
export const useCounterStore = defineStore('counter', {state: () => ({count: 0,name: 'Counter Module'}),getters: {doubleCount: (state) => state.count * 2},actions: {increment() {this.count++}}
})
此时使用该 Store 时会自动获得类型提示:
const store = useCounterStore()
store.count // number ✅
store.increment() // 自动补全 ✅
5.2 自定义类型(推荐)
虽然大多数场景下可自动推导,但我们仍推荐使用接口显式定义 state
、getters
、actions
类型以获得更强可维护性。
✅ 定义接口
// types/store.d.ts
export interface CounterState {count: numbername: string
}export interface CounterGetters {doubleCount(state: CounterState): number
}export interface CounterActions {increment(): void
}
✅ 使用泛型定义 Store
import { defineStore, StoreDefinition } from 'pinia'
import type { CounterState, CounterActions, CounterGetters } from '@/types/store'export const useCounterStore: StoreDefinition<'counter', CounterState, CounterGetters, CounterActions> = defineStore('counter', {state: (): CounterState => ({count: 0,name: 'Counter Store'}),getters: {doubleCount: (state) => state.count * 2},actions: {increment() {this.count++}}
})
5.3 Setup Store(组合式写法)中的类型支持
对于复杂逻辑,我们可以使用组合式写法,即 setup
形式的 Store,TS 类型控制更灵活。
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'export const useUserStore = defineStore('user', () => {const name = ref('Alice')const age = ref(25)const summary = computed(() => `${name.value}(${age.value}岁)`)function setName(newName: string) {name.value = newName}return {name,age,summary,setName}
})
此种写法中,Pinia 能自动推导返回值类型,无需额外泛型,只要你在返回时显式写出 ref
/ computed
。
5.4 类型提示与 IDE 自动补全效果
- State 属性:可识别为
ref<number>
/ref<string>
等 - Getter 属性:识别为
ComputedRef
- Action 方法:自动推导参数和返回值类型
举个例子:
const userStore = useUserStore()
userStore.age.value // number ✅
userStore.summary.value // string ✅
userStore.setName('Bob') // ✅
5.5 类型约束下的好处
特性 | 说明 |
---|---|
自动补全 | 所有属性、方法可自动提示,无需手动查找 |
静态校验 | 错误属性/参数在编译期即可发现,避免运行时异常 |
支持重构 | 改名、移动属性时 IDE 可自动跟踪更新引用 |
接口复用 | 同一份接口可复用在组件、接口、后端通讯中 |
✅ 小结
Pinia 在 TypeScript 项目中具备一流的类型体验:
- 推荐用接口明确 State / Action / Getter 结构
- 可选使用组合式写法提升灵活性与组合能力
- 强类型推导贯穿编写、使用、调试各个环节
持久化存储与插件机制
本节将深入讲解如何使用 Pinia 插件 实现 Store 状态的持久化存储,以及自定义扩展 Store 功能。
在实际项目中,我们常常需要:
- 保持用户登录信息,即使刷新页面也不丢失
- 记住用户的主题偏好、语言设置
- 在多个 Tab 页面之间共享状态
Pinia 原生支持插件机制,非常适合用于这些扩展场景。
6.1 什么是 Pinia 插件?
插件是一个函数,在每个 Store 实例创建时执行。你可以通过插件:
- 添加全局状态
- 劫持/监听 Store 生命周期
- 自动同步状态到 localStorage / sessionStorage
- 注入外部依赖(如 Axios)
6.2 状态持久化插件:pinia-plugin-persistedstate
最常用的第三方插件是 pinia-plugin-persistedstate
,可自动将状态持久化到本地存储。
✅ 安装
npm install pinia-plugin-persistedstate
✅ 注册插件
// main.ts
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)app.use(pinia)
6.3 使用持久化配置
只需在 defineStore
中增加 persist
配置:
// stores/user.ts
export const useUserStore = defineStore('user', {state: () => ({token: '',theme: 'light'}),persist: true // 默认使用 localStorage
})
刷新后依然保留 token 和主题偏好。
6.4 自定义持久化策略
persist: {enabled: true,strategies: [{key: 'user-token',storage: sessionStorage,paths: ['token'] // 只存 token}]
}
key
:本地存储的键名storage
:可选localStorage
或sessionStorage
paths
:只持久化指定字段
6.5 多模块下持久化组合
每个模块 Store 都可独立配置 persist
,互不影响:
// user.ts => 存 token 到 sessionStorage
persist: {storage: sessionStorage,paths: ['token']
}// settings.ts => 存 theme 到 localStorage
persist: {storage: localStorage,paths: ['theme']
}
6.6 自定义插件机制(进阶)
你可以自定义自己的插件来扩展 Store 功能:
// plugins/logger.ts
import type { PiniaPluginContext } from 'pinia'export function loggerPlugin({ store }: PiniaPluginContext) {store.$subscribe((mutation, state) => {console.log(`[${mutation.storeId}]`, mutation.type, mutation.events)})
}
注册插件:
pinia.use(loggerPlugin)
这样每次状态改变都会打印日志。
6.7 生命周期钩子:$subscribe
& $onAction
Pinia 提供两种原生生命周期钩子:
1. $subscribe
—— 监听状态变化
const userStore = useUserStore()userStore.$subscribe((mutation, state) => {console.log('状态发生变化:', mutation, state)
})
2. $onAction
—— 监听 Action 执行
userStore.$onAction(({ name, args, after, onError }) => {console.log(`Action 被调用: ${name}`, args)after(() => console.log(`${name} 执行成功`))onError((err) => console.error(`${name} 报错`, err))
})
非常适合做埋点、错误日志等逻辑。
✅ 小结
Pinia 插件机制极为强大和灵活:
功能类型 | 工具 | 用途描述 |
---|---|---|
本地持久化 | pinia-plugin-persistedstate | 自动同步状态到 Storage |
状态监听 | $subscribe | 跟踪 State 的变化 |
行为监听 | $onAction | 跟踪 Action 的执行情况 |
自定义扩展 | 插件函数 | 注入工具、处理副作用、封装逻辑等 |
最佳实践总结与项目结构规范化设计
将基于前面内容,系统梳理一套企业级 Pinia 状态管理的最佳实践,从模块设计、命名规范、状态解耦、持久化、类型安全等多个维度,构建一个清晰、稳定、可维护、易扩展的 Store 架构体系。
7.1 推荐项目结构
src/
├── stores/ # 所有 Pinia Store 模块
│ ├── user.ts # 用户相关状态
│ ├── auth.ts # 权限与登录认证
│ ├── ui.ts # UI 状态(如 sidebar)
│ ├── settings.ts # 全局设置项
│ └── index.ts # 自动导出所有 Store
├── types/ # Store 类型定义
│ └── store.d.ts
├── plugins/ # 自定义插件(如 router 注入、日志等)
├── composables/ # 组合逻辑封装,可配合 Store 使用
7.2 Store 命名规范
类型 | 命名建议 | 示例 |
---|---|---|
Store 名称 | useXxxStore | useUserStore |
ID(storeId) | 模块名小写 | user , auth , ui |
文件名 | 模块名小写 | user.ts , auth.ts |
命名统一,利于团队协作和自动化生成。
7.3 状态设计原则
- 一个模块职责单一,避免巨型 Store
- 状态最小化:只存 UI 需要的状态,不要存派生数据(放 getters)
- 与组件无关的数据放 Store,临时数据放组件
- 使用
ref
,computed
,watch
配合使用 Store 提高响应性控制
7.4 Store 类型系统统一
统一定义 Store 的 state
, getters
, actions
类型接口:
// types/store.d.ts
export interface UserState { name: string; age: number }
export interface UserActions { login(): void; logout(): void }
export interface UserGetters { isAdult: boolean }
结合 StoreDefinition
:
export const useUserStore: StoreDefinition<'user', UserState, UserGetters, UserActions> =defineStore('user', {state: (): UserState => ({ ... }),...})
优点:
- 强类型保障
- 便于重构
- 编辑器智能提示清晰
7.5 持久化策略标准化
- token、用户信息 → 存到
sessionStorage
(浏览器关闭清空) - 用户偏好、主题设置 → 存到
localStorage
(长期保存) - 配置统一封装成策略常量:
const localPersist = {storage: localStorage,paths: ['theme', 'language']
}
7.6 自动化导出 Store
// stores/index.ts
export * from './user'
export * from './auth'
export * from './settings'
支持模块自动导入:
import { useUserStore, useAuthStore } from '@/stores'
7.7 组合逻辑封装:useXXXLogic
业务逻辑不要堆在组件里,应该封装成组合逻辑:
// composables/useLogin.ts
export function useLogin() {const userStore = useUserStore()const doLogin = async (formData) => {await userStore.login(formData)router.push('/dashboard')}return { doLogin }
}
- 提高复用性
- 分离 UI 与业务逻辑
- 组件更轻盈可测试
✅ 实战应用:多页面应用的 Store 模型设计范式
模块名称 | 典型状态字段 | 持久化 | 常驻内存 | 是否解耦 UI |
---|---|---|---|---|
user | token , info | ✅ | ✅ | ✅ |
ui | sidebar , theme | ✅ | ✅ | ✅ |
auth | roles , routes | ❌ | ✅ | ✅ |
search | keyword , filters | ❌ | ❌ | ❌(页面级) |
✅ 统一 Store 模板(可直接复制)
// stores/xxx.ts
import { defineStore } from 'pinia'
import type { XxxState } from '@/types/store'export const useXxxStore = defineStore('xxx', {state: (): XxxState => ({ ... }),getters: {...},actions: {...},persist: {enabled: true,strategies: [...]}
})
✅ 结语:Pinia 最佳实践总览图
+-------------------------------+
| 模块划分清晰 |
| ↓ |
| 单一职责 |
| ↓ |
| 类型定义接口统一 |
| ↓ |
| Plugin 封装 & 逻辑抽离 |
| ↓ |
| 状态最小化 & 可持久化 |
| ↓ |
| 与 Router / API / UI 解耦 |
+-------------------------------+
Pinia 的设计理念是简单、透明、类型友好。配合组合式 API,它不仅可以替代 Vuex,还能帮助我们构建更现代、更可控、更高效的前端架构。
相关文章:
《Pinia 从入门到精通》Vue 3 官方状态管理 -- 进阶使用篇
《Pinia 从入门到精通》Vue 3 官方状态管理 – 基础入门篇 《Pinia 从入门到精通》Vue 3 官方状态管理 – 进阶使用篇 《Pinia 从入门到精通》Vue 3 官方状态管理 – 插件扩展篇 目录 Store 的模块化设计4.1 多模块结构设计✅ 推荐目录结构(中大型项目) …...
HarmonyOs @hadss/hmrouter路由接入
参考文档:官方文档 在根目录oh-package.json5配置 {"dependencies": {"hadss/hmrouter": "^1.0.0-rc.11"} }加入路由编译插件 hvigor/hvigor-config.json文件 {"dependencies": {"hadss/hmrouter-plugin": &…...
第九节:性能优化高频题-首屏加载优化策略
路由懒加载:component: () > import(‘…’) CDN加速第三方库、Tree-Shaking移除未使用代码 前端首屏加载优化核心策略解析 一、路由懒加载:按需拆分代码块 实现原理 通过动态导入语法 import() 将路由组件拆分为独立代码块,仅在用户访问…...
ESP32_IDF_VScode安装多版本共存
ESP32_IDF_VScode安装多版本共存 一、安装离线版本idf 详情见文章:ESP32_IDF_基于win11的开发环境搭建 二、windows的VScode安装乐鑫插件 三、导入已经安装好的idf(将VScode插件和本地安装的IDF绑定的一个关系) 1、选择“配置ESP-IDF扩展”…...
JavaScript 的“积木”:函数入门与实践
引言:告别重复,拥抱模块化 想象一下,你在写代码时发现,有几段逻辑几乎一模一样,需要在不同的地方反复使用。你是选择每次都复制粘贴,还是希望能像搭积木一样,把这段逻辑封装起来,需…...
代码注释标记的含义
在代码中,TODO 是一种常用的注释标记,用于标识需要后续处理或完善的任务。它是开发者之间的常见约定,帮助团队协作和任务管理。以下是详细解释: 1. TODO 的核心含义 待办事项:标记代码中需要完成但尚未实现的功能、需…...
深度学习:迁移学习
迁移学习 标题1.什么是迁移学习 迁移学习(Transfer Learning)是一种机器学习方法,就是把为任务 A 开发 的模型作为初始点,重新使用在为任务 B 开发模型的过程中。迁移学习是通过 从已学习的相关任务中转移知识来改进学习的新任务,虽然大多数…...
Nest集成健康检查
文章目录 前言✅ NestJS 健康检查集成思路(标准实践)📦 推荐使用官方包: 🧱 结构设计✅ 1. 创建健康模块✅ 2. 集成 nestjs/terminushealth.module.tshealth.controller.ts ✅ 3. 在 AppModule 注册模块 🔍…...
第十五届蓝桥杯 2024 C/C++组 拼正方形
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 易错点: 代码: 代码详解: 题目: 题目描述: 题目链接: P10898 [蓝桥杯 2024 省 C] 拼正…...
前端出现的一些新技术或者升级的技术汇总
以下是截至2024年第三季度前端领域的最新技术动态与论坛热议焦点,涵盖框架、工具链、性能优化等方向,结合社区讨论和实际案例展开分析: 一、框架演进与争议热点 1. React 19「Actions」引发范式转变 核心变化: 服务端Actions&…...
SQL数据类型
数字类型 1. 整型(Integer) 整型数据类型用于存储整数值,不包含小数部分。通常用于表示没有小数部分的数字,如年龄、数量、ID 等。 常见的整型数据类型: INT:用于存储常规整数值,通常占用 4 字…...
手机访问电脑端Nginx服务器配置方式
修改当前站点Nginx的配置如下。其中端口号必须是一个比较独特的端口号,比如8001。这样可以跟别的项目区分开来。域名使用0.0.0.0。 server {listen 80;listen 8001;server_name zfmap.cc 0.0.0.0;假设你电脑端的ip地址是192.168.1.101,那么你的手机与你的电脑连在同…...
PyQt6基础_QTabWidget
目录 代码 运行 官方文档 PySide6.QtWidgets.QTabWidget - Qt for Python 代码 class TempWidget(QWidget):def __init__(self):super().__init__()self.tabs QTabWidget()self.tabs.tabBarClicked.connect(self.tabs_tabBarClicked)widget_tab1 QWidget()widget_tab2…...
海思ISP调试记录
1、proc_param 功能:在海思中,proc_param参数用来控制每个多少帧更新一次ISP,默认是30帧。 过短的更新间隔会导致图像参数不稳定,产生闪烁或色彩跳跃4过长的间隔会使3A调整滞后,影响动态场景适应性1海思建议在1080p3…...
以运营为核心的智能劳动力管理系统,破解连锁零售、制造业排班难题
在连锁零售、制造业、物流等劳动力密集型行业中,排班与考勤管理不仅是人力资源管理的核心环节,更是直接影响企业运营效率、成本控制与合规风险的关键场景。尤其在当前经济环境下,企业面临用工成本攀升、政策合规趋严、业务波动频繁等多重挑战…...
缓存穿透、雪崩、击穿深度解析与解决方案
缓存穿透、雪崩、击穿深度解析与解决方案 一、缓存三大核心问题全景解析 1. 问题定位与影响分析 问题类型触发条件典型现象核心风险缓存穿透大量请求访问不存在的键Redis 命中率骤降(<10%)数据库压力激增,可能宕机缓存雪崩大量缓存键同…...
【AI】基于OllamaSharp与.NET Core API的高效LLM查询实现
本文旨在演示如何通过OllamaSharp NuGet包在.NET Core API中高效查询Ollama大语言模型,重点展示如何通过JSON配置文件动态设置模型参数和服务器地址,实现灵活维护的AI服务架构。 创建.NET Core API项目dotnet new webapi -n OllamaLLMAPI cd OllamaLLMAPI添加OllamaSharp NuG…...
kotlin和MVVM的结合使用总结(二)
MVVM 架构详解 核心组件:ViewModel 和 LiveData 在 Android 中,MVVM 架构主要借助 ViewModel 和 LiveData 来实现。ViewModel 负责处理业务逻辑,而 LiveData 则用于实现数据的响应式更新。 ViewModel 的源码分析 ViewModel 的核心逻辑在 …...
U盘能识别但无法写入数据的原因
1. U 盘物理损坏 原因:U 盘内部存储芯片、电路板或接口接触不良,可能因摔落、高温、频繁插拔等导致。表现:插入电脑能识别盘符,但读写时提示 “磁盘错误”“无法访问” 或操作无反应。解决方法: 尝试用其他设备&#…...
多模态大模型 Qwen2.5-VL 的学习之旅
Qwen-VL 是阿里云研发的大规模视觉语言模型(Large Vision Language Model, LVLM)。Qwen-VL 可以以图像、文本、检测框作为输入,并以文本和检测框作为输出。Qwen-VL 系列模型性能强大,具备多语言对话、多图交错对话等能力ÿ…...
linux sudo 命令介绍
sudo(superuser do)是一个用于 Linux 系统的命令,它允许授权用户以其他用户(通常是 root 超级用户)的安全权限执行命令。 有了 sudo,用户在执行特定的、需要更高权限的操作时,就不需要切换到 r…...
STM32F103系列单片机寄存器操作和标准库操作
关于stm32,标准库很早就学完了,但如果想要更加深入学习计算机硬件,那么学会寄存器操作是非常有必要的。今天从最简单的点灯开始,我们来对比一下二者的不同。 一、寄存器操作和标准库操作中点亮LED的区别 寄存器操作:…...
如何解决PyQt从主窗口打开新窗口时出现闪退的问题
在PyQt5中,当从主窗口打开新窗口时,经常会出现闪退现象,这通常是由于对象生命周期管理不当或事件循环错误等所导致。 1. 确保新窗口实例被正确引用 新窗口的实例若未被主窗口引用,可能会被Python的垃圾回收机制销毁。 错误示例&…...
2025五一杯数学建模竞赛思路助攻预定
2025五一杯数学建模竞赛思路助攻预定(思路内容见文末名片) 一、概况 数学建模竞赛是一项模拟面对实际问题寻求解决方案的活动,是一次近似 于“真刀真枪”的创新探索性实践训练。在丰富并活跃学生课外生活活动的同 时,数学建模竞…...
Java集合框架解析
一、集合框架概述 1. 集合框架体系结构 Java集合框架(Java Collections Framework, JCF)位于java.util包中,包含三大核心接口: Collection:单列数据集合的根接口 List:有序可重复集合Set:无序…...
《100天精通Python——基础篇 2025 第1天:从编程语言到计算机基础,开启你的学习之旅》
目录 一、计算机组成原理之概述篇二、编程语言是什么三、编译型语言和解释型语言的区别3.1 编译型语言3.2 解释型语言 四、Python是什么五、Python有哪些优点和缺点?5.1 Python的优点5.2 Python 的缺点 六、学Python能干什么,Python的应用领域有哪些&…...
JavaFX 第三篇 HostServices和Platform
1、HostServices类 介绍这个类主要是使用里面的一个方法 返回类型方法说明voidshowDocument(java.lang.String uri)使用默认浏览器打开一个url地址 /*** description: 程序打开3秒后,打开百度* author: HK* since: 2025/4/24 16:40*/ public class Demo1 extends…...
【Java 8新特性】Stream API 和 Lambda 表达式
一、前言 Java 8 的 Stream API 和 Lambda 表达式 为集合处理带来了函数式编程风格,显著简化了代码并提高了可读性。 二、Lambda 表达式 1.作用 简化匿名内部类的语法,允许将函数作为参数传递。实现函数式接口(只有一个抽象方法的接口&…...
Vue 3 相比 Vue 2 的优势
1. 性能优化 更快的渲染: 基于 Proxy 的响应式系统,比 Vue 2 的 Object.defineProperty 更高效,初始化速度和内存占用优化显著。编译时优化(如静态树提升、补丁标志等),减少运行时开销。 更小的体积&#…...
深度解析 TransmittableThreadLocal(TTL):原理、实战与优化指南
深度解析 TransmittableThreadLocal(TTL):原理、实战与优化指南 在现代 Java 应用中,ThreadLocal 被广泛用于线程隔离上下文,比如用户会话、链路追踪等。但随着线程池的普及,ThreadLocal 也暴露出严重局限性,尤其是在异步场景中上下文无法正确传递的问题。 本文从 Thr…...
入门 Go 语言
本专栏的 Go 语言学习参考了B站UP 软件工艺师的视频 本节需要: Go 语言环境VSCode 安装环境 下载 Go 环境,并安装下载 VSCode,安装。在 VSCode 中安装 Go 扩展: 接下来就可以编写 Go 语言了 第一条 Go Go 语言是一种编译型…...
膳食营养诊断活动:科技赋能,共筑全民健康新基石
膳食营养诊断活动:科技赋能,共筑全民健康新基石 一、活动背景:响应营养周号召,开启健康新征程 (一)2025营养周主题解读 2025年全民营养周的核心主题“吃动平衡,健康体重,全民行动…...
考拉悠然:科技与匠心,以烟草虫情AI监测系统共筑品质未来
李工,一位在卷烟厂辛勤耕耘了二十余载的老工艺师,他的青春和汗水,都挥洒在了这片弥漫着烟草香气的土地上。他像一位老农,精心呵护着每一片烟叶,因为他深知,烟草品质的把控,就是守护着卷烟厂的生…...
k8s基于角色的访问控制(RBAC)
Kubernetes(k8s)权限管理主要是基于角色的访问控制(RBAC),以下是其核心内容: 核心概念 Role 和 ClusterRole Role :定义特定命名空间内的权限规则,用于在某个命名空间内设置访问权限…...
拆解华为Pura X新发现:“仿生”散热与钛合金“骨架”
拆解华为Pura X新发现:“仿生”散热与钛合金“骨架” 原创 黑毛警长008 AR圈 2025年04月24日 09:42 广东 01 引言:AI时代带来折叠屏新挑战 随着华为Pura X的发布,市场上已出现多家机构的拆解分析,但大多聚焦于芯片和电子组件层面…...
Typecho 访客统计插件最新版-前后台统计图均可显示
这是一个为 Typecho 博客系统开发的访客统计插件,基于原版的VistorLogger修改版本。该插件提供了详细的访问统计功能,包括访问国家/地区统计、IP分布等信息,并进行了隐私保护处理。 功能特点 独立页面模板显示访问国家/地区统计(…...
与智者同行:京东零售技术人的成长书单
我们正处在一个快速变化的时代,信息洪流奔涌而来,如何穿透纷繁的表象,理解世界的复杂性?又如何在充满不确定性的环境中,找到属于自己的方向? 阅读,是最从容的答案,让我们站在智者的…...
matplotlib1-画成对数据图
画图的类型 成对数据(Pairwise data) 成对形式的数据 (x, y);表格形式的数据 (var_0, var_1, ..., var_n) ;函数形式的数据 f(x) y 1. 绘图-plot(x, y) 以线条或标记的形式将 y 随 x 的变化情况绘制成图表。 2. 散点图-scatt…...
深入理解表单---提交用户与网页交互的重要方式:GET 与 POST 的本质区别与应用实践
在 Web 开发中,表单(<form>)是用户与网页交互的重要方式,而表单的 method 属性则决定了数据是如何发送到服务器的。本文将带你系统理解 GET 和 POST 请求方式的区别、使用场景与注意事项,并结合示例进行实战分析…...
VIVADO中单bit信号的跨时钟域处理(快时钟到慢时钟)
VIVADO中单bit信号的跨时钟域处理 同步触发器的约束,确保软件布局布线时把同步的触发器放到同一个SLICE中 目录 前言 一、快时钟的脉冲到慢时钟的同步方法一 1、正确结果 2、源时钟脉冲展宽组合逻辑输出不加触发器的风险 3、目的时钟采样组合逻辑输出不加触发器…...
解决 Windows10 下 UWP 应用无法使用本地代理
从Micorsoft Store下载的应用默认不允许使用本地代理(或者说就不允许访问localhost) 但是可以借助于系统自带的 CheckNetIsolation 工具来突破该限制 操作 找出要修改的应用 SID 在注册表 HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Cur…...
实验三 进程间通信实验
一、实验目的 1、了解什么是信号。 2、熟悉LINUX系统中进程之间软中断通信的基本原理。 3、理解进程的同步关系。 4、掌握用信号实现进程间的同步操作。 5、了解什么是管道。 6、熟悉UNIX/LINUX支持的管道通信方式。 二、实验内容 1、阅读下列程序,执行程序…...
NHANES指标推荐:TyG-WHtR
文章题目:Can cardiovascular health and its modifiable healthy lifestyle offset the increased risk of all-cause and cardiovascular deaths associated with insulin resistance? DOI:10.1186/s12933-025-02674-z 中文标题:心血管健康…...
Winddows11官网下载安装VMware Workstation Pro17(图文详解)
Winddows11安装VMware17 1、官网下载2、安装3、总结 1、官网下载 官网地址 点击Products,滑到最下面,选择SEE DESKTOPP HYPERVISORS 选择 DOWNLOAD FUSION OR WORKSTATION 自动跳转到下面哪个服界面,注册 输入邮箱地址和图片下面的文字…...
YOLO训练时到底需不需要使用权重
1. 预训练权重的作用与本质 预训练权重(Pretrained Weights)是在大规模数据集上训练得到的模型参数。这些权重能够学习通用的特征模式,如边缘、纹理、形状等,从而帮助模型更快收敛并提高泛化能力。YOLO提供的官方预训练权重通常基…...
2025最新软件测试面试八股文(答案+文档+视频讲解)
1、你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求自己&…...
SpringBoot整合AOP
没事做个Demo案例,首先看下项目结构: 第1步,导入依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 第2步…...
第16章:MCP服务端项目开发实战:对话系统
第16章:MCP服务端项目开发实战:对话系统 对话系统,尤其是聊天机器人和虚拟助手,是 AI Agent 最广泛的应用领域之一。然而,传统的对话系统常常面临挑战,如难以维持长对话连贯性、缺乏个性化交互、无法有效利用对话中积累的知识等。MCP(Memory, Context, Planning)框架为…...
JavaScript 页面刷新:从传统到现代的全面解析
在 Web 开发中,"刷新"是一个基础但极其重要的功能。本文将全面探讨页面刷新的实现方式,从传统方法到现代最佳实践,深入解析每一种方案的原理和适用场景,并给出实用代码示例。 一、理解页面刷新的本质 在 Web 开发中&am…...
2025年Google Play审核策略全面解析
大家好,我是老妙,出海十余年的老司机,目前在死磕google play上架这一块。 目前来说,上架这一块不管是合规产品还是不合规产品,都建议使用有在架包的老号,更稳定,上架的审核时间更短,…...