学习 Pinia 状态管理【Plan - May - Week 2】
一、定义 Store
Store 由
defineStore()
定义,它的第一个参数要求独一无二的idimport { defineStore } from 'pinia'export const useAlertsStore = defineStore('alert', {// 配置 })
- 最好使用以
use
开头且以Store
结尾 (比如useUserStore
,useCartStore
,useProductStore
) 来命名defineStore()
的返回值- Pinia 将用传入的
id
来连接 store 和 devtoolsdefineStore()
的第二个参数可接受两类值:Setup 函数或 Option 对象。
1、Option Store
与 Vue 的选项式 API 类似,可以传入一个带有
state
、actions
与getters
属性的 Option 对象export const useCounterStore = defineStore('counter', { state: () => ({ count: 0, name: 'Tomato' }), getters: {doubleCount: (state) => state.count * 2, }, actions: {increment() {this.count++}, }, })
state
相当于 store 的数据,getters
相当于 store 的计算属性,action
相当于 store 的方法
2、Setup Store
Setup Store 与 Vue 组合式 API 的 setup 函数 相似
export const useCounterStore = defineStore('counter', () => { const count = ref(0) const doubleCount = computed(() => count.value * 2) function increment() {count.value++ }return { count, doubleCount, increment } })
ref()
相当于state
属性computed()
相当于getters
function()
相当于actions
- 要让 pinia 正确识别
state
,必须在 setup store 中返回state
的所有属性。因此不能在 store 中使用私有属性。- Setup store 也可以依赖于全局提供的属性,比如路由。任何应用层面提供的属性都可以在 store 中使用
inject()
访问,就像在组件中一样import { inject } from 'vue' import { useRoute } from 'vue-router' import { defineStore } from 'pinia'export const useSearchFilters = defineStore('search-filters', () => {const route = useRoute()// 这里假定 `app.provide('appProvided', 'value')` 已经调用过const appProvided = inject('appProvided')// ...return {// ...} })
3、使用 Store
store 实例需要像使用
<script setup>
调用useStore()
才会被创建<script setup> import { useCounterStore } from '@/stores/counter'const store = useCounterStore() </script>
store
是一个用reactive
包装的对象,这意味着不需要在 getters 后面写.value
,就像setup
中的props
一样,所以不能对它进行解构<script setup> import { useCounterStore } from '@/stores/counter' import { computed } from 'vue'const store = useCounterStore()// 这就和直接解构 `props` 一样 const { name, doubleCount } = store name // 将始终是 "Tomato" doubleCount // 将始终是 0 setTimeout(() => {store.increment() }, 1000) // 这样写是响应式的,也可以直接使用 `store.doubleCount` const doubleValue = computed(() => store.doubleCount) </script>
4、从 Store 解构
使用
storeToRefs()
保持属性从 store 中提取时仍然保持其响应性
- 它可以为每一个响应式属性创建引用
<script setup> import { storeToRefs } from 'pinia' const store = useCounterStore() // `name` 和 `doubleCount` 是响应式的 ref // 同时通过插件添加的属性也会被提取为 ref // 并且会跳过所有的 action 或非响应式 (不是 ref 或 reactive) 的属性 const { name, doubleCount } = storeToRefs(store) // 作为 action 的 increment 可以直接解构 const { increment } = store </script>
二、Pinia
1、使用 Pinia
使用 Pinia可以获得以下功能:
- 测试工具集
- 插件:可通过插件扩展 Pinia 功能
- 为 JS 开发者提供适当的 TypeScript 支持以及自动补全功能。
- 支持服务端渲染
- Devtools 支持
- 追踪 actions、mutations 的时间线
- 在组件中展示它们所用到的 Store
- 让调试更容易的 Time travel
- 热更新
- 不必重载页面即可修改 Store
- 开发时可保持当前的 State
2、基础示例
创建 Store
// stores/counter.js import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', { state: () => {return { count: 0 } }, // 也可以这样定义 // state: () => ({ count: 0 }) actions: {increment() {this.count++}, }, })
使用 store
<script setup> import { useCounterStore } from '@/stores/counter'const counter = useCounterStore()counter.count++ // 自动补全! counter.$patch({ count: counter.count + 1 }) // 或使用 action 代替 counter.increment() </script><template> <!-- 直接从 store 中访问 state --> <div>Current Count: {{ counter.count }}</div> </template>
- 使用函数定义 Store
export const useCounterStore = defineStore('counter', () => {const count = ref(0)function increment() {count.value++}return { count, increment } })
3、对比 Vuex
- Pinia 已经实现了我们在 Vuex 5 中想要的大部分功能
- 与 Vuex 相比,Pinia 不仅提供了一个更简单的 API,也提供了符合组合式 API 风格的 API,最重要的是,搭配 TypeScript 一起使用时有非常可靠的类型推断支持
- Pinia 同样要经过 RFC 流程,并且其 API 也已经进入稳定状态
- 无需要创建自定义的复杂包装器来支持 TypeScript,一切都可标注类型,API 的设计方式是尽可能地利用 TS 类型推理
- 无过多的魔法字符串注入,只需要导入函数并调用它们
- 无需要动态添加 Store,它们默认都是动态的
- ……
三、Action
Action 相当于组件中的 method。它们可以通过
defineStore()
中的actions
属性来定义export const useCounterStore = defineStore('main', { state: () => ({count: 0, }), actions: {increment() {this.count++},randomizeCounter() {this.count = Math.round(100 * Math.random())}, }, })
- 类似 getter,action 也可通过
this
访问整个 store 实例action
可以是异步的export const useUsers = defineStore('users', {state: () => ({userData: null,// ...}),actions: {async registerUser(login, password) {try {this.userData = await api.post({ login, password })showTooltip(`Welcome back ${this.userData.name}!`)} catch (error) {showTooltip(error)// 让表单组件显示错误return error}},}, })
- 调用
<script setup> const store = useCounterStore() // 将 action 作为 store 的方法进行调用 store.randomizeCounter() </script> <template><!-- 即使在模板中也可以 --><button @click="store.randomizeCounter()">Randomize</button> </template>
1、访问其他 store 的 action
直接调用
import { useAuthStore } from './auth-store'export const useSettingsStore = defineStore('settings', { state: () => ({preferences: null,// ... }), actions: {async fetchUserPreferences() {const auth = useAuthStore()if (auth.isAuthenticated) {this.preferences = await fetchPreferences()} else {throw new Error('User must be authenticated')}}, }, })
2、使用选项式 API 的用法
使用 setup()
<script> import { useCounterStore } from '../stores/counter' export default defineComponent({ setup() {const counterStore = useCounterStore()return { counterStore } }, methods: {incrementAndPrint() {this.counterStore.increment()console.log('New Count:', this.counterStore.count)}, }, }) </script>
3、订阅 action
通过
store.$onAction()
来监听 action 和它们的结果
- 传递给它的回调函数会在 action 本身之前执行
after
表示在 promise 解决之后,允许你在 action 解决后执行一个回调函数onError
允许你在 action 抛出错误或 reject 时执行一个回调函数const unsubscribe = someStore.$onAction(({name, // action 名称store, // store 实例,类似 `someStore`args, // 传递给 action 的参数数组after, // 在 action 返回或解决后的钩子onError, // action 抛出或拒绝的钩子}) => {// 为这个特定的 action 调用提供一个共享变量const startTime = Date.now()// 这将在执行 "store "的 action 之前触发。console.log(`Start "${name}" with params [${args.join(', ')}].`)// 这将在 action 成功并完全运行后触发。// 它等待着任何返回的 promiseafter((result) => {console.log(`Finished "${name}" after ${Date.now() - startTime}ms.\nResult: ${result}.`)})// 如果 action 抛出或返回一个拒绝的 promise,这将触发onError((error) => {console.warn(`Failed "${name}" after ${Date.now() - startTime}ms.\nError: ${error}.`)})} )// 手动删除监听器 unsubscribe()
- action 会绑定在 store 组件的 setup() 内,当组件被卸载时,它们将被自动删除
- 可以将 true 作为第二个参数传递给 action 订阅器,可以实现即便在组件卸载之后仍会被保留
<script setup> const someStore = useSomeStore() // 此订阅器即便在组件卸载之后仍会被保留 someStore.$onAction(callback, true) </script>
四、插件
1、简介
Pinia 插件是一个函数,可以选择性地返回要添加到 store 的属性。它接收一个可选参数,即
context
。export function myPiniaPlugin(context) { context.pinia // 用 `createPinia()` 创建的 pinia。 context.app // 用 `createApp()` 创建的当前应用(仅 Vue 3)。 context.store // 该插件想扩展的 store context.options // 定义传给 `defineStore()` 的 store 的可选对象。 // ... }pinia.use(myPiniaPlugin)
2、扩展 Store
- 直接通过在一个插件中返回包含特定属性的对象来为每个 store 都添加上特定属性
pinia.use(() => ({ hello: 'world' }))
或者
- 直接在
store
上设置该属性(建议使用返回对象的方法,这样它们就能被 devtools 自动追踪到)pinia.use(({ store }) => {store.hello = 'world'// 确保你的构建工具能处理这个问题,webpack 和 vite 在默认情况下应该能处理。if (process.env.NODE_ENV === 'development') {// 添加你在 store 中设置的键值store._customProperties.add('hello')} })
每个 store 都被
reactive
包装过,所以可以自动解包任何它所包含的 Ref(ref()
、computed()
…)const sharedRef = ref('shared') pinia.use(({ store }) => { // 每个 store 都有单独的 `hello` 属性 store.hello = ref('secret') // 它会被自动解包 store.hello // 'secret'// 所有的 store 都在共享 `shared` 属性的值 store.shared = sharedRef store.shared // 'shared' })
添加新的 state
如果给 store 添加新的 state 属性或者在服务端渲染的激活过程中使用的属性,必须同时在两个地方添加。
- 在
store
上- 在
store.$state
上import { toRef, ref } from 'vue'pinia.use(({ store }) => {// 为了正确地处理 SSR,我们需要确保我们没有重写任何一个// 现有的值if (!store.$state.hasOwnProperty('hasError')) {// 在插件中定义 hasError,因此每个 store 都有各自的// hasError 状态const hasError = ref(false)// 在 `$state` 上设置变量,允许它在 SSR 期间被序列化。store.$state.hasError = hasError}// 我们需要将 ref 从 state 转移到 store// 这样的话,两种方式:store.hasError 和 store.$state.hasError 都可以访问// 并且共享的是同一个变量// 查看 https://cn.vuejs.org/api/reactivity-utilities.html#torefstore.hasError = toRef(store.$state, 'hasError')// 在这种情况下,最好不要返回 `hasError`// 因为它将被显示在 devtools 的 `state` 部分// 如果我们返回它,devtools 将显示两次。 })
- 在一个插件中, state 变更或添加(包括调用
store.$patch()
)都是发生在 store 被激活之前
重置插件中添加的 state
import { toRef, ref } from 'vue'pinia.use(({ store }) => { if (!store.$state.hasOwnProperty('hasError')) {const hasError = ref(false)store.$state.hasError = hasError } store.hasError = toRef(store.$state, 'hasError')// 确认将上下文 (`this`) 设置为 store const originalReset = store.$reset.bind(store)// 覆写其 $reset 函数 return {$reset() {originalReset()store.hasError = false}, } })
3、添加新的外部属性
当添加外部属性、第三方库的类实例或非响应式的简单值时,需要先用
markRaw()
进行包装后再传给 piniaimport { markRaw } from 'vue' // 根据你的路由器的位置来调整 import { router } from './router'pinia.use(({ store }) => { store.router = markRaw(router) })
4、添加新的选项
在定义 store 时,可以创建新的选项,以便在插件中使用它们。例如,你可以创建一个
debounce
选项,允许你让任何 action 实现防抖。defineStore('search', { actions: {searchContacts() {// ...}, },// 这将在后面被一个插件读取 debounce: {// 让 action searchContacts 防抖 300mssearchContacts: 300, }, })
// 使用任意防抖库 import debounce from 'lodash/debounce'pinia.use(({ options, store }) => { if (options.debounce) {// 我们正在用新的 action 来覆盖这些 actionreturn Object.keys(options.debounce).reduce((debouncedActions, action) => {debouncedActions[action] = debounce(store[action],options.debounce[action])return debouncedActions}, {}) } })
学习资料来源:
定义 Store | Pinia
简介 | Pinia
Action | Pinia
插件 | Pinia
相关文章:
学习 Pinia 状态管理【Plan - May - Week 2】
一、定义 Store Store 由 defineStore() 定义,它的第一个参数要求独一无二的id import { defineStore } from piniaexport const useAlertsStore defineStore(alert, {// 配置 })最好使用以 use 开头且以 Store 结尾 (比如 useUserStore,useCartStore&a…...
linux中cpu内存浮动占用,C++文件占用cpu内存、定时任务不运行报错(root) PAM ERROR (Permission denied)
文章目录 说明部署文件准备脚本准备部署g++和编译脚本使用说明和测试脚本批量部署脚本说明执行测试定时任务不运行报错(root) PAM ERROR (Permission denied)报错说明处理方案说明 我前面已经弄了几个版本的cpu和内存占用脚本了,但因为都是固定值,所以现在重新弄个用C++编写的…...
数据湖和数据仓库的区别
在当今数据驱动的时代,企业需要处理和存储海量数据。数据湖与数据仓库作为两种主要的数据存储解决方案,各自有其独特的优势与适用场景。本文将客观详细地介绍数据湖与数据仓库的基本概念、核心区别、应用场景以及未来发展趋势,帮助读者更好地…...
OceanBase 开发者大会,拥抱 Data*AI 战略,构建 AI 数据底座
5 月 17 号以“当 SQL 遇见 AI”为主题的 OceanBase 开发者大会在广州举行,因为行程的原因未能现场参会,仍然通过视频直播观看了全部的演讲。总体来说,这届大会既有对未来数据库演进方向的展望,也有 OceanBase 新产品的发布&#…...
鸿蒙HarmonyOS最新的组件间通信的装饰器与状态组件详解
本文系统梳理了鸿蒙(HarmonyOS)ArkUI中组件间通信相关的装饰器及状态组件的使用方法,重点介绍V2新特性,适合开发者查阅与实践。 概述 鸿蒙系统(HarmonyOS)ArkUI提供了丰富的装饰器和状态组件,用…...
OneDrive登录,账号跳转问题
你的OneDrive登录无需密码且自动跳转到其他账号,可能是由于浏览器或系统缓存了登录信息,或存在多个账号的关联。以下是分步解决方案: 方案三对我有效。 强制手动输入密码 访问登录页面时: 在浏览器中打开 OneDrive网页版。 点击…...
9-码蹄集600题基础python篇
题目如上图所示。 这一题,没什么难度。 代码如下: def main():#code here# x,amap(int,input("").split(" "))# sum((1/2)*(a*x(ax)/(4*a)))# print(f"{sum:.2f}")x,amap(int,input().split())print(f"{((1/2)*(a*…...
CAU人工智能class3 优化器
优化算法框架 优化思路 随机梯度下降 随机梯度下降到缺点: SGD 每一次迭代计算 mini-batch 的梯度,然后对参数进行更新,每次迭代更新使用的梯度都只与本次迭代的样本有关。 因为每个批次的数据含有抽样误差,每次更新可能并不会 …...
学习 Android(十一)Service
简介 在 Android 中,Service 是一种无界面的组件,用于在后台执行长期运行或跨进程的任务,如播放音乐、网络下载或与远程服务通信 。Service 可分为“启动型(Started)”和“绑定型(Bound)”两大…...
SpringAI开发SSE传输协议的MCP Server
SpringAI 访问地址:Spring AI Spring AI是一个面向人工智能工程的应用框架,由Spring团队推出,旨在将AI能力集成到Java应用中。Spring AI的核心是解决AI集成的根本挑战,即将企业数据和API与AI模型连接起来。 MCP…...
【泛微系统】后端开发Action常用方法
后端开发Action常用方法 代码实例经验分享:代码实例 经验分享: 本文分享了后端开发中处理工作流Action的常用方法,主要包含以下内容:1) 获取工作流基础信息,如流程ID、节点ID、表单ID等;2) 操作请求信息,包括请求紧急程度、操作类型、用户信息等;3) 表单数据处理,展示…...
如何成为更好的自己?
成为更好的自己是一个持续成长的过程,需要结合自我认知、目标规划和行动力。以下是一些具体建议,帮助你逐步提升: 1. 自我觉察:认识自己 反思与复盘:每天花10分钟记录当天的决策、情绪和行为,分析哪些做得…...
精益数据分析(74/126):从愿景到落地的精益开发路径——Rally的全流程管理实践
精益数据分析(74/126):从愿景到落地的精益开发路径——Rally的全流程管理实践 在创业的黏性阶段,如何将抽象的愿景转化为可落地的产品功能?如何在快速迭代中保持战略聚焦?今天,我们通过Rally软…...
网站制作公司哪家强?(2025最新版)
在数字化时代,一个优质的网站是企业展示自身实力、拓展业务渠道的重要工具。无论是初创企业还是大型集团,都需要一个功能强大、设计精美的网站来吸引客户、提升品牌形象。但面对市场上众多的网站制作公司,如何选择一家靠谱的合作伙伴呢&#…...
23种经典设计模式(GoF设计模式)
目录 🍀 创建型设计模式(5种) 1. 单例模式(Singleton) 2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 4. 建造者模式(Builder&am…...
深入解析Dify:从架构到应用的全面探索
文章目录 引言一、Dify基础架构1.1 架构概述1.2 前端界面1.3 后端服务1.4 数据库设计 二、Dify核心概念2.1 节点(Node)2.2 变量(Variable)2.3 工作流类型 三、代码示例3.1 蓝图注册3.2 节点运行逻辑3.3 工作流运行逻辑 四、应用场…...
电子电路:怎么理解放大电路中集电极电流Ic漂移?
如果放大电路中集电极电阻RC因为温度或老化而阻值变化,Vce Vcc - IcRc - IcRc,这会改变工作点,导致集电极的电流漂移。 IC漂移的定义:集电极电流随时间、温度等变化。影响IC的因素:β、IB、VBE、温度、电源电压、元件…...
【疑难杂症】Mysql 无报错 修改配置文件后服务启动不起来 已解决|设置远程连接
我修改配置后,服务无法启动可以试试用记事本打开后另存为,格式选择ANSI,然后重新启动mysql试试 设置运行远程、 1、配置my.ini文件 在[mysqld]下 添加bind-address0.0.0.0 2、设置root权限 使用MySql命令行执行, CREATE USER…...
Java基础 5.21
1.多态注意事项和细节讨论 多态的前提是:两个对象(类)存在继承关系 多态的向上转型 本质:父类的引用指向了子类的对象语法:父类类型 引用名 new 子类类型();特点:编译类型看左边,运行类型看…...
探索Puter:一个基于Web的轻量级“云操作系统”
在云计算与Web技术高度融合的今天,开发者们不断尝试将传统桌面体验迁移到浏览器中。近期,GitHub上一个名为Puter的开源项目吸引了社区的关注。本文将带你深入解析Puter的设计理念、技术架构与使用场景,探索它如何通过现代Web技术重构用户的“云端桌面”。 一、项目概览 Put…...
Java SpringBoot 项目中 Redis 存储 Session 具体实现步骤
目录 一、添加依赖二、配置 Redis三、配置 RedisTemplate四、创建控制器演示 Session 使用五、启动应用并测试六、总结 Java 在 Spring Boot 项目中使用 Redis 来存储 Session,能够实现 Session 的共享和高可用,特别适用于分布式系统环境。以下是具体的实…...
电商项目-商品微服务-规格参数管理,分类与品牌管理需求分析
本文章介绍:规格参数管理与分类与品牌管理的需求分析和表结构的设计。 一、规格参数管理 规格参数模板是用于管理规格参数的单元。规格是例如颜色、手机运行内存等信息,参数是例如系统:安卓(Android)后置摄像头像素&…...
Java 定时任务中Cron 表达式与固定频率调度的区别及使用场景
Java 定时任务:Cron 表达式与固定频率调度的区别及使用场景 一、核心概念对比 1. Cron 表达式调度 定义:基于日历时间点的调度,通过 秒 分 时 日 月 周 年 的格式定义复杂时间规则。时间基准:绝对时间点(如每天 12:…...
2025年- H39-Lc147 --394.字符串解码(双栈,递归)--Java版
1.题目描述 2.思路 可以用递归也可以用双栈,这边用栈。 首先先创建一个双栈,一个栈存数字(interger),另一个栈存字符(character)。设置数字临时变量num,设置字母临时变量curString在…...
学编程对数学成绩没帮助?
今天听到某机构直播说“学编程对数学成绩没帮助,如果想提高数学成绩那就单独去学数学”,实在忍不住要和各位家长聊聊我的思考,也欢迎各位家长评论。 恰在此时我看见了一道小学6年级的数学题如下,虽然题不难,但立刻让我…...
现代计算机图形学Games101入门笔记(十九)
光场 在近处画上图像,VR的效果。 任何时间任何位置看到的图像都不一样,是不是就是一个世界了。 光场就是任何一个位置往任何一个方向去的光的强度 知道光场就能知道这个物体长什么样子。 光线可以用一个点和一个方向确定。 也可以用2个点确定一条光线。 …...
STM32单片机GUI系统1 GUI基本内容
目录 一、GUI简介 1、emWin 2、LVGL (Light and Versatile Graphics Library) 3、TouchGFX 4、Qt for Embedded 5、特性对比总结 二、LVGL移植要求 三、优化LVGL运行效果方法 四、LVGL系统文件 一、GUI简介 在嵌入式系统中,emWin、LVGL、TouchGFX 和 Qt 是…...
Prometheus+Grafana实现对服务的监控
PrometheusGrafana实现对服务的监控 前言:PrometheusGrafana实现监控会更加全面,监控的组件更多 Prometheus官网 https://prometheus.io/docs/prometheus/latest/getting_started/ Grafana官网 https://grafana.com/docs/ 一、安装PrometheusGrafana 这…...
hook原理和篡改猴编写hook脚本
hook原理: hook是常用于js反编译的技术;翻译就是钩子,他的原理就是劫持js的函数然后进行篡改 一段简单的js代码 :这个代码是顺序执行的 function test01(){console.log(test01)test02() } function test02(){console.log(02)tes…...
Sign签证绕过
Sign的简介 Sign是指一种类似于token的东西 他的出现主要是保证数据的完整性,防篡改 就是一般的逻辑是 sign的加密的值和你输入的数据是相连的(比如sign的加密是使用输入的数据的前2位数字配合SHA1 等这样的) 绕过 :碰运气可以…...
【Vue篇】重剑无锋:面经PC项目工程化实战面经全解
目录 引言 一、项目功能演示 1. 目标 2. 项目收获 二、项目创建目录初始化 vue-cli 建项目 三、ESlint代码规范及手动修复 1. JavaScript Standard Style 规范说明 2. 代码规范错误 3. 手动修正 四、通过eslint插件来实现自动修正 五、调整初始化目录结构 1. 删除…...
JVM参数详解与实战案例指南(AI)
JVM参数详解与实战案例指南 一、JVM参数概述与分类 JVM参数是控制Java虚拟机运行时行为的关键配置项,合理设置这些参数可以显著提升应用性能。根据功能和稳定性,JVM参数主要分为三类: 标准参数:所有JVM实现都必须支持ÿ…...
C++通过空间配置器实现简易String类
C实现简易String类 在C中,使用空间配置器(allocator)实现自定义string类需要管理内存分配、释放及对象构造/析构。 #include <memory> #include <algorithm> #include <cstring> #include <stdexcept> #include &l…...
MyBatis:简化数据库操作的持久层框架
1、什么是Mybatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由 apachesoftwarefoundation 迁移到了google code,由谷歌托管,并且改名为MyBatis 。 2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框…...
Spring Boot集成Spring AI与Milvus实现智能问答系统
在Spring Boot中集成Spring AI与Milvus实现智能问答系统 引言 随着人工智能技术的快速发展,越来越多的企业开始探索如何将AI能力集成到现有系统中。本文将介绍如何在Spring Boot项目中集成Spring AI和向量数据库Milvus,构建一个高效的智能问答系统。 …...
软件工程(六):一致性哈希算法
哈希算法 定义 哈希算法是一种将任意长度的输入(如字符串、文件等)转换为固定长度输出的算法,这个输出称为“哈希值”或“摘要”。 常见的哈希算法 哈希算法哈希位数特点MD5128位快速,但已不安全SHA-1160位安全性提高…...
Linux内存分页管理详解
Linux内存分页管理详解:原理、实现与实际应用 目录 Linux内存分页管理详解:原理、实现与实际应用 一、引言 二、内存分页机制概述 1. 虚拟地址与物理地址的划分 2. 分页的基本原理 三、虚拟地址到物理地址的转换 1. 地址转换流程 2. 多级页表的遍历 四、多级页表的…...
work-platform阅读
Redis存储的是字节数据,所以任何对象想要存进redis,都要转化成字节。对象转化为字节流的过程,叫序列化,反之,叫反序列化 Redis 序列化详解及高性能实践-CSDN博客https://blog.csdn.net/zhangkunls/article/details/14…...
在 Excel xll 自动注册操作 中使用东方仙盟软件————仙盟创梦IDE
windows 命令 "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" /X "C:\Path\To\仙盟.xll" excel 注册 Application.RegisterXLL "XLMAPI.XLL" 重点代码解析 excel 命令模式 [ExcelCommand(Description "使用参数")] …...
微调后的模型保存与加载
在Hugging Face Transformers库中,微调后的模型保存与加载方式因微调方法(如常规微调或参数高效微调)而异。 一、常规微调模型的保存与加载 1、 保存完整模型 使用 save_pretrained() 方法可将整个模型(包含权重、配置、分词器…...
PostgreSQL 日常维护
目录 一、基本使用 1、登录数据库 2、数据库操作 (1)列出库 (2)创建库 (3)删除库 (4)切换库 (5)查看库大小 3、数据表操作 (1ÿ…...
Ntfs!ATTRIBUTE_RECORD_HEADER结构$INDEX_ROOT=0x90的一个例子
Ntfs!ATTRIBUTE_RECORD_HEADER结构$INDEX_ROOT0x90的一个例子 1: kd> dx -id 0,0,899a2278 -r1 ((Ntfs!_FILE_RECORD_SEGMENT_HEADER *)0xc431a400) ((Ntfs!_FILE_RECORD_SEGMENT_HEADER *)0xc431a400) : 0xc431a400 [Type: _FILE_RECORD_SEGMENT_HEADER …...
leetcode hot100刷题日记——7.最大子数组和
class Solution { public:int maxSubArray(vector<int>& nums) {//方法一:动态规划//dp[i]表示以i下标结尾的数组的最大子数组和//那么在i0时,dp[0]nums[0]//之后要考虑的就是我们要不要把下一个数加进来,如果下一个数加进来会使结…...
LlamaIndex
1、大语言模型开发框架的价值是什么? SDK:Software Development Kit,它是一组软件工具和资源的集合,旨在帮助开发者创建、测试、部署和维护应用程序或软件。 所有开发框架(SDK)的核心价值,都是降低开发、维护成本。 大语言模型开发框架的价值,是让开发者可以更方便地…...
下一代电子电气架构(EEA)的关键技术
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
CSDN gitcode代码推送
当我使用用户名密码时一直无法推送,报下面这个错误 找了半天才知道, 他这个git不能用账号密码推送代码,idea弹出来的用户名,就是你头像旁边这个,没有符号 密码需要你创建一个令牌 这个令牌才是你要填写的密码&#x…...
中级统计师-统计学基础知识-第五章 相关分析
第一节 相关关系 1. 函数关系 vs 相关关系 函数关系 定义:变量间存在严格确定性的对应关系(如 y f ( x ) y f(x) yf(x))例子:本金 x x x 与利息收入 y x 0.027 x y x 0.027x yx0.027x特点:一一对应ÿ…...
OpenCV CUDA模块图像过滤------用于创建一个最大值盒式滤波器(Max Box Filter)函数createBoxMaxFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 createBoxMaxFilter()函数创建的是一个 最大值滤波器(Maximum Filter),它对图像中每个像素邻域内的像素值取最…...
OpenCv高阶(十五)——EigenFace人脸识别
文章目录 前言一、EigenFace人脸识别原理二、EigenFace人脸识别代码1、导入OpenCV和NumPy库2、数据加载与预处理部分3、创建与训练EigenFace模型部分4、预测与结果输出部分5、可视化部分:在测试图像上叠加识别结果 总结 前言 人脸识别作为生物特征识别技术的重要分…...
Linux系统下nslookup命令的基本使用
Linux系统下 nslookup命令的基本使用 引言一、nslookup介绍二、使用帮助三、 基本使用方法1. 查询域名对应的IP地址2. 查询特定的DNS记录类型3. 使用特定的DNS服务器进行查询4. 交互模式 四、注意事项五、总结 引言 在网络管理中,DNS(域名系统ÿ…...