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

uni-app 状态管理深度解析:Vuex 与全局方案实战指南

uni-app 状态管理深度解析:Vuex 与全局方案实战指南

一、Vuex 使用示例

1. 基础 Vuex 配置

1.1 项目结构
src/
├── store/
│   ├── index.js          # 主入口文件
│   └── modules/
│       └── counter.js    # 计数器模块
└── main.js              # 应用入口
1.2 安装 Vuex
npm install vuex --save

2. 核心代码实现

2.1 主入口文件 (store/index.js)
import Vue from 'vue'
import Vuex from 'vuex'
import counter from './modules/counter'Vue.use(Vuex)export default new Vuex.Store({modules: {counter}
})
2.2 计数器模块 (store/modules/counter.js)
export default {state: {count: 0},mutations: {increment(state) {state.count++},decrement(state) {state.count--},setCount(state, value) {state.count = value}},actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment')}, 1000)}},getters: {doubleCount: state => state.count * 2}
}
2.3 应用入口 (main.js)
import Vue from 'vue'
import App from './App.vue'
import store from './store'Vue.config.productionTip = falsenew Vue({store,render: h => h(App)
}).$mount('#app')

3. 组件中使用示例

3.1 显示计数器 (CounterDisplay.vue)
<template><div><h2>计数器示例</h2><p>当前计数: {{ count }}</p><p>双倍计数: {{ doubleCount }}</p></div>
</template><script>
import { mapState, mapGetters } from 'vuex'export default {computed: {...mapState('counter', ['count']),...mapGetters('counter', ['doubleCount'])}
}
</script>
3.2 操作计数器 (CounterControls.vue)
<template><div><button @click="increment">+1</button><button @click="decrement">-1</button><button @click="incrementAsync">1秒后+1</button><input type="number" v-model.number="newCount"><button @click="setCount(newCount)">设置值</button></div>
</template><script>
import { mapMutations, mapActions } from 'vuex'export default {data() {return {newCount: 0}},methods: {...mapMutations('counter', ['increment', 'decrement', 'setCount']),...mapActions('counter', ['incrementAsync'])}
}
</script>

4. 完整应用示例 (App.vue)

<template><div id="app"><CounterDisplay /><CounterControls /></div>
</template><script>
import CounterDisplay from './components/CounterDisplay.vue'
import CounterControls from './components/CounterControls.vue'export default {name: 'App',components: {CounterDisplay,CounterControls}
}
</script>

5. 核心概念说明

  1. State - 存储应用状态数据
state: {count: 0
}
  1. Mutations - 修改状态的同步方法
mutations: {increment(state) {state.count++}
}
  1. Actions - 可以包含异步操作
actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment')}, 1000)}
}
  1. Getters - 计算派生状态
getters: {doubleCount: state => state.count * 2
}
  1. 模块化 - 按功能拆分模块
modules: {counter
}

6. Vuex 中访问数据(state)方式

在 Vuex 中访问数据(state)主要有以下几种方式,取决于你是在组件内还是组件外访问:

1. 在 Vue 组件中访问 Vuex 数据
(1) 使用 this.$store
在 Vue 组件中,可以通过 this.$store 访问 Vuex 的 state、getters、mutations 和 actions:

// 访问 state
this.$store.state.carData// 访问 getter
this.$store.getters.carDataGetter// 调用 mutation
this.$store.commit('setCarData', payload)// 调用 action
this.$store.dispatch('fetchCarData', payload)

(2) 使用 mapStatemapGettersmapMutationsmapActions
Vuex 提供了辅助函数,可以更方便地在组件中引入 Vuex 数据和方法:

import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'export default {computed: {// 映射 state.carData 到 this.carData...mapState(['carData']),// 映射 getters.carDataGetter 到 this.carDataGetter...mapGetters(['carDataGetter']),},methods: {// 映射 this.setCarData(payload) 到 this.$store.commit('setCarData', payload)...mapMutations(['setCarData']),// 映射 this.fetchCarData(payload) 到 this.$store.dispatch('fetchCarData', payload)...mapActions(['fetchCarData']),}
}

(3) 访问模块化的 Vuex 数据
如果使用了模块化(modules),访问方式稍有不同:

// 直接访问模块 state
this.$store.state.moduleName.carData// 使用 mapState 访问模块 state
...mapState('moduleName', ['carData'])// 使用命名空间访问 mutations/actions
this.$store.commit('moduleName/setCarData', payload)
this.$store.dispatch('moduleName/fetchCarData', payload)

2. 在非 Vue 组件(JS 文件)中访问 Vuex
如果你在普通的 JS 文件(如 API 请求、工具函数)中需要访问 Vuex,可以:
(1) 直接导入 store 实例

import store from '@/store'  // 假设 store 导出在 @/store/index.js// 访问 state
const carData = store.state.carData// 调用 mutation
store.commit('setCarData', payload)// 调用 action
store.dispatch('fetchCarData', payload)

(2) 动态获取 store(适用于插件或异步场景)

import Vue from 'vue'// 获取全局 store
const store = Vue.prototype.$storeif (store) {const carData = store.state.carData
}

3. 在 Vuex 内部访问数据
在 Vuex 的 gettersmutationsactions 内部,可以直接访问 stategetters

const store = new Vuex.Store({state: {carData: null,},getters: {getCarData: (state) => state.carData,},mutations: {setCarData(state, payload) {state.carData = payload},},actions: {fetchCarData({ state, commit, getters }) {const currentCarData = state.carDataconst formattedData = getters.getCarDatacommit('setCarData', newData)},},
})

总结

访问方式适用场景示例
this.$store组件内直接访问this.$store.state.carData
mapState/mapGetters组件内计算属性映射...mapState(['carData'])
mapMutations/mapActions组件内方法映射...mapMutations(['setCarData'])
直接导入 store非组件 JS 文件store.state.carData
模块化访问命名空间模块this.$store.state.moduleName.carData

这样,你就可以在 Vue 项目的任何地方正确访问 Vuex 数据了! 🚀

二、全局方案灵活应用(轻量级方案)

2.1 全局变量深度应用

增强型全局数据管理
// app.js
class GlobalData {constructor() {this._config = {apiBase: 'https://api.example.com',theme: 'light'}}get config() {return {...this._config} // 返回副本保证只读}updateTheme(newTheme) {this._config.theme = newThemeuni.$emit('theme-change', newTheme)}
}App({globalData: new GlobalData()
})
组件中安全访问
// 获取可维护的全局对象
const global = getApp().globalData// 读取配置(推荐使用拷贝)
const currentTheme = {...global.config}.theme// 修改时使用封装方法
global.updateTheme('dark')

2.2 事件通信高级技巧

安全通信模式
// 创建事件总线单例
const eventBus = new Vue()// 封装安全监听方法
function safeOn(event, callback) {const wrappedCallback = (...args) => {try {return callback(...args)} catch (error) {console.error(`事件处理错误: ${event}`, error)}}eventBus.$on(event, wrappedCallback)return () => eventBus.$off(event, wrappedCallback)
}// 在组件中使用
export default {mounted() {this.unlisten = safeOn('data-updated', this.handleData)},beforeDestroy() {this.unlisten && this.unlisten()}
}
类型安全通信
// 创建事件类型枚举
const EventTypes = Object.freeze({DATA_UPDATE: Symbol('DATA_UPDATE'),USER_LOGOUT: Symbol('USER_LOGOUT')
})// 发送规范事件
uni.$emit(EventTypes.DATA_UPDATE, {timestamp: Date.now(),payload: newData
})// 接收时类型检查
uni.$on(EventTypes.DATA_UPDATE, ({ timestamp, payload }) => {// 安全处理数据
})

三、方案选型决策树

父子组件
兄弟/跨级
高频
低频
需要管理状态吗?
数据需要跨多个组件吗?
需要长期保持状态吗?
使用Vuex+持久化
使用Vuex基础版
使用组件内状态
无需状态管理
需要组件通信吗?
组件层级关系如何?
使用props/$emit
通信频率如何?
使用Vuex
使用全局事件

四、性能优化实践

4.1 Vuex性能贴士

  • 冻结大对象:防止Vue过度追踪
state: {bigData: Object.freeze(largeStaticData)
}
  • 模块懒加载
const dynamicModule = () => import('./dynamic.module')
// 在需要时注册模块
store.registerModule('dynamic', dynamicModule)

4.2 全局事件优化

  • 节流高频事件
import throttle from 'lodash.throttle'uni.$on('scroll-event', throttle(handleScroll, 100))
  • 使用事件池
const eventPool = new Map()function registerEvent(event, callback) {if (!eventPool.has(event)) {eventPool.set(event, [])}eventPool.get(event).push(callback)
}

五、调试技巧大全

5.1 Vuex调试

// 打印mutation日志
store.subscribe((mutation, state) => {console.groupCollapsed(`mutation ${mutation.type}`)console.log('payload:', mutation.payload)console.log('state:', state)console.groupEnd()
})

5.2 事件追踪

// 监听所有事件
uni.$on('*', (event, ...args) => {console.debug(`[Event Trace] ${event}`, args)
})

六、迁移策略建议

从全局变量迁移到Vuex

  1. 识别候选数据:找出被多个组件修改的全局变量
  2. 创建过渡层
// 临时兼容方案
const legacyData = getApp().globalData.legacy
Object.defineProperty(Vue.prototype, '$legacy', {get() {console.warn('该属性已废弃,请使用store迁移')return legacyData}
})
  1. 逐步替换:按模块迁移数据到Vuex

七、最佳实践总结

  1. 核心准则

    • 表单数据保持本地
    • 用户会话使用Vuex+持久化
    • 页面间参数用URL传递
    • 组件通信优先用事件
  2. 架构建议

    src/
    ├── store/
    │   ├── modules/
    │   │   ├── user.store.js
    │   │   └── product.store.js
    │   └── index.js
    ├── utils/
    │   └── eventBus.js
    └── config/└── global.js
    
  3. 安全原则

    • Vuex mutation必须同步
    • 全局变量只读访问
    • 事件监听必须清理
    • 敏感数据加密存储

通过本指南的实践,开发者可以构建出既具备企业级健壮性,又保持灵活性的uni-app应用架构。根据项目规模选择合适的方案,在保证可维护性的同时提升开发效率。

相关文章:

uni-app 状态管理深度解析:Vuex 与全局方案实战指南

uni-app 状态管理深度解析&#xff1a;Vuex 与全局方案实战指南 一、Vuex 使用示例 1. 基础 Vuex 配置 1.1 项目结构 src/ ├── store/ │ ├── index.js # 主入口文件 │ └── modules/ │ └── counter.js # 计数器模块 └── main.js …...

STM32之DHT11温湿度传感器---附代码

DHT11简介 DHT11的供电电压为 3&#xff0d;5.5V。 传感器上电后&#xff0c;要等待 1s 以越过不稳定状态在此期间无需发送任何指令。 电源引脚&#xff08;VDD&#xff0c;GND&#xff09;之间可增加一个100nF 的电容&#xff0c;用以去耦滤波。 DATA 用于微处理器与DHT11之间…...

Fluent 内置双向流固耦合FSI 液舱晃荡仿真计算

本案例利用Fluent 内置双向流固耦合FSI对液舱晃荡仿真展开了计算&#xff0c;提供了一种更为便捷快速的分析方法&#xff0c;对不同杨氏模量的液舱内部构件进行分析&#xff0c;后续可以通过该案例对不同的双向流固耦合模型展开计算分析。 1 SCDM 设置 1.1 导入几何 本案例根…...

嵌入式开发板调试方式完全指南:串口/SSH/Telnet及其他方式对比

文章目录 &#x1f4bb;嵌入式开发板调试方式完全指南&#xff1a;串口/SSH/Telnet及其他方式对比一、为什么需要连接嵌入式开发板❓二、串口调试&#xff1a;最古老的调试方式仍在发光&#x1f3db;️2.1 什么是串口调试&#xff1f; 三、SSH/Telnet&#xff1a;网络时代的调试…...

JavaScript数据结构与算法实战: 探秘Leetcode经典题目

# JavaScript数据结构与算法实战: 探秘Leetcode经典题目 第一章&#xff1a;掌握LeetCode经典题目 什么是LeetCode&#xff1f; 力扣&#xff09;是一个专门为程序员提供算法题目练习的平台&#xff0c;涵盖了广泛的题目类型&#xff0c;包括数据结构、算法、数据库等多个领域。…...

内网穿透实践:cpolar快速入门教程

最近有个朋友联系我&#xff0c;问我有没有方法将自己做的项目让别人也能访问到&#xff0c;我寻思这不就是外网映射的事情。于是我很愉快的和他说&#xff0c;你去买个云服务器就行&#xff0c;尽管我一再和他说&#xff0c;个人新用户能有免费试用期&#xff0c;但是本着又蠢…...

HAL库(STM32CubeMX)——高级ADC学习、HRTIM(STM32G474RBT6)

系列文章目录 文章目录 系列文章目录前言存在的问题HRTIMcubemx配置前言 对cubemx的ADC的设置进行补充 ADCs_Common_Settings Mode:ADC 模式 Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选 ADC_Se…...

Kafka 详细解读

1. Producer&#xff08;生产部卷王&#xff09; 职责&#xff1a;往 Kafka 里疯狂输出数据&#xff0c;KPI 是「日抛式消息海啸」 职场人设&#xff1a; 白天开会画饼&#xff0c;深夜写周报的奋斗逼&#xff0c;口头禅是「这个需求今晚必须上线&#xff01;」代码里的「福报…...

Python爬虫实战:获取高考网专业数据并分析,为志愿填报做参考

一、引言 高考志愿填报是考生人生的关键节点,合理的志愿填报能为其未来发展奠定良好基础。计算机类专业作为当下热门领域,相关信息对考生填报志愿至关重要。教育在线网站虽提供丰富的计算机类专业数据,但存在反爬机制,增加了数据获取难度。本研究借助 Scrapy 爬虫技术及多…...

Ubuntu下展锐刷机工具spd_dump使用说明

spd_dump使用说明 源码地址&#xff1a;https://github.com/ilyakurdyukov/spreadtrum_flash 编译环境准备&#xff1a; sudo apt update sudo apt install git sudo apt install build-essential sudo apt install libusb-1.0-0-devIf you create /etc/udev/rules.d/80-spd…...

配置 VS Code 使用 ESLint 格式化

1、在设置里面搜索Default Formatter&#xff0c;下拉框里选择eslint 2、并勾选Enables ESlint as a formatter 3、再在settings.json文件中添加配置代码&#xff0c;如下所示&#xff1a; 1&#xff09; 、打开 VS Code 设置 快捷键&#xff1a;Ctrl ,&#xff08;Mac: ⌘ ,…...

极刻云搜-专业的软件网址搜索引擎

软件名&#xff1a;极刻云搜 版本&#xff1a;v1.0 软件功能&#xff1a;搜索实用软件和网址 之前有个全网爆火的软件叫搜软 但是它满屏广告而且很久都没更新了 我看也有好多人在求这门类似的软件 我就按照它扒了一个一模一样的 软件丑是丑了点 但是这个功能确实简单粗暴 因为用…...

android Stagefright框架

作为Android音视频开发人员&#xff0c;学习Stagefright框架需要结合理论、源码分析和实践验证。以下是系统化的学习路径&#xff1a; 1. 基础准备 熟悉Android多媒体体系 掌握MediaPlayer、MediaCodec、MediaExtractor等核心API的用法。 理解Android的OpenMAX IL&#xff08…...

vscode 打开新页签

目录 vscode 打开新页签 完整settings.json内容&#xff1a; vscode 打开新页签 .vscode目录中 新建settings.json 在 settings.json 文件中&#xff0c;添加或修改以下行&#xff1a; json "workbench.editor.enablePreview": false 这将禁用预览模式&#xff0…...

【C++编程入门】:从零开始掌握基础语法

C语言是通过对C语言不足的地方进行优化创建的&#xff0c;C在C语言之上&#xff0c;C当然也兼容C语言&#xff0c; 在大部分地方使用C比C更方便&#xff0c;可能使用C需要一两百行代码&#xff0c;而C只需要五六十行。 目录 C关键字 命名空间 缺省参数 缺省参数分类 函数…...

Vue中如何优雅地阻止特定标签的移除并恢复其原始位置

Vue中如何优雅地阻止特定标签的移除并恢复其原始位置 在使用 Element Plus 或 Element UI 的 <el-select> 组件时,有时我们希望根据某些条件阻止用户移除特定的标签,并且在阻止移除后将该标签重新添加到其原始位置。这在处理与子项目关联的成员时特别有用。本文将详细…...

基于Arduino的ESP8266连接OneNET云平台(MQTT协议 物模型)(二)连接云平台

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、前期准备1.1 硬件配置1.2 软件环境配置 二、接线三、核心代码3.1 总代码 三、最终效果总结 前言 本系列将以0基础新手视角&#xff0c;完整演示ArduinoESP…...

空间注意力和通道注意力的区别

空间注意力和通道注意力是深度学习中两种常见的注意力机制。 1. ​​关注维度不同​​ ​​通道注意力​​&#xff08;Channel Attention&#xff09; 对特征图的每个通道分配不同的权重&#xff0c;强调“哪些通道更重要”。例如&#xff0c;在RGB图像中&#xff0c;可能红色…...

git 版本提交规范

Git 提交规范&#xff08;Git Commit Message Convention&#xff09;是为了让项目的提交历史更加清晰、可读、便于追踪和自动化工具解析。常见的规范之一是 Conventional Commits&#xff0c;下面是一个推荐的格式规范&#xff1a; &#x1f31f; 提交信息格式&#xff08;Con…...

Linux的基础的操作指令

一.目录文件&#xff1a;在Linux中的以d开头的文件&#xff0c;就叫做目录文件(Directory): 二.普通的文件&#xff1a;在Linux中的以-r开头的文件&#xff0c;就叫做普通的文件,他们通常以.txt .cpp .c为后缀: 三.pwd:查看当前目录的绝对路径:查看当前所在位置的目录的绝对路径…...

级联vs端到端、全双工、轮次检测、方言语种、商业模式…语音 AI 开发者都在关心什么?丨Voice Agent 学习笔记

编者按&#xff1a; A16Z在《AI Voice Agents: 2025 Update》中提到&#xff1a; 语音是 AI 应用公司最强大的突破之一。 它是人类沟通中最频繁&#xff08;也是信息密度最高的&#xff09;形式&#xff0c;AI 也让其首次变得“可编程”。 在13期Z沙龙&#xff0c;我们聚焦AI…...

使用Cloudflare加速网站的具体操作步骤

要通过Cloudflare加速网站&#xff0c;您需要按照以下步骤进行设置和配置。这些步骤包括域名设置、接入Cloudflare、配置缓存和其他设置&#xff0c;以及测试网站性能。 1. 注册Cloudflare账户 访问Cloudflare官网&#xff1a;前往 Cloudflare官网。创建账户&#xff1a;点击…...

编译原理实验(四)———— LR(1)分析法

一、实验目的 掌握LR(1)分析法的基本原理与实现流程。通过构造LR(1)分析表&#xff0c;验证符号串是否符合给定文法规则。理解LR(1)分析中向前搜索符&#xff08;Lookahead Symbol&#xff09;的作用&#xff0c;解决移进-归约冲突。 二、实验题目 1.对下列文法&#xff0c;用…...

【Redis】Jedis与Jedis连接池

目录 1. Jedis 单实例连接 2. Jedis 连接池&#xff08;JedisPool&#xff09; 3. JedisPool 与 Jedis 的区别 4. JedisPool 线程安全 6. 使用 JedisPool 的注意事项 1. Jedis 单实例连接 在最简单的用法中&#xff0c;Jedis 提供了直接与 Redis 服务器连接的方式。这适合…...

MongoDB数据库的安装到入门使用详细讲解

本篇文章主要讲解MongoDB的安装使用教程及基础的数据库管理和操作能力的讲解,通过本篇文章您可以快速的掌握对MongDB数据库的基本认识及,基础开发能力。 一、MongoDB介绍 MongoDB是一款免费开源的非关系型数据库,该数据库适应于复杂关系的存储和管理,非常适合数据结构复杂…...

Argo CD

文章目录 一、什么是 Argo CD二、为什么选择 Argo CD三、Argo CD 架构1、API服务器2、存储库服务器3、应用程序控制器 四、Argo CD 的使用1、要求2、安装 Argo CD2.1、创建 argocd 命名空间2.2、部署 Argo CD2.3、验证部署是否成功 3、下载 Argo CD CLI4、发布 Argo CD 服务器5…...

ElementUI中checkbox v-model绑定值为布尔、字符串或数字类型

这篇博客介绍了在Vue.js中使用El-Checkbox组件时&#xff0c;如何设置和处理v-model的布尔值和类型转换。通过示例代码展示了如何设置true-label和false-label属性来改变选中状态的值&#xff0c;适用于需要特定类型&#xff08;如字符串或整数&#xff09;的场景。v-model不能…...

Wasm Client SDK线上优化

前言 随着 WebAssembly&#xff08;Wasm&#xff09;在前端开发中的普及&#xff0c;越来越多的开源项目开始在浏览器端提供高性能的逻辑处理方案。OpenIM Wasm SDK 便是其中的代表&#xff1a;通过将 Go 语言编写的 OpenIMSDK 核心编译为 .wasm 文件&#xff0c;在前端即可完成…...

Spring(第一章)

一&#xff0c;Spring介绍 什么是Spring 1. 轻量级&#xff1a;Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API 2. 依赖注入(DI --- dependency injection、IOC) 3. 面向切面编程(AOP --- aspect oriented programming) 4. 容器: Spring 是…...

蓝桥杯 18.分考场

分考场 原题目链接 题目描述 有 n 个人参加某项特殊考试。 为了公平&#xff0c;要求任何两个认识的人不能分在同一个考场。 你的任务是求出最少需要分几个考场才能满足这个条件。 输入描述 第一行&#xff1a;一个整数 n&#xff0c;表示参加考试的人数&#xff08;1 ≤…...

大文件分片上传进阶版(新增md5校验、上传进度展示、并行控制,智能分片、加密上传、断点续传、自动重试),实现四位一体的网络感知型大文件传输系统‌

上篇文章我们总结了大文件分片上传的主要核心&#xff0c;但是我对md5校验和上传进度展示这块也比较感兴趣&#xff0c;所以在deepseek的帮助下&#xff0c;扩展了一下我们的代码&#xff0c;如果有任何问题和想法&#xff0c;非常欢迎大家在评论区与我交流&#xff0c;我需要学…...

【项目管理】成本类计算 笔记

项目管理-相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知识总览 项目管理知识域 知识点&#xff1a; &#xff08;项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域&#xff09; 对应&…...

Redis 事务

事务介绍 Redis 事务和 MySQL 事务在概念上类似的 把一些列的操作绑定成一组&#xff0c;让这一组能够批量执行 MySQL 事务 原子性&#xff1a;把多个操作打包成一个整体 一致性&#xff1a;事务执行前后数据合理 持久性&#xff1a;事务做出的操作都会修改硬盘 隔离性&#…...

JavaScript day5

立即执行函数 <script>(function(){ console.log//函数不需调用&#xff0c;立马执行 })() </script> //另外写法 <script> (function(){}()) </script> 常见的内置对象 Math console.dir()——打印对象的 使用Math中的属性——console.log(Math.…...

辛格迪客户案例 | 浙江高跖医药委托生产质量管理协同(OWL MAH)项目

一、案例概述 浙江高跖医药科技股份有限公司是一家集“研、产、销”为一体的专业化药品持证企业。高跖医药自成立之初就建立并运行着一套相对完善的质量管理体系&#xff0c;涵盖了药品的研发、生产监管及销售。高跖医药于2022年选择实施了辛格迪的“委托生产质量管理协同解决…...

科学养生指南:解锁健康生活新方式

在快节奏的现代生活中&#xff0c;健康养生已成为人们关注的焦点。科学合理的养生方式&#xff0c;能帮助我们增强体质、预防疾病&#xff0c;享受更优质的生活。​ 饮食是健康养生的基石。遵循 “均衡饮食” 原则&#xff0c;每日饮食需包含谷类、蔬菜水果、优质蛋白质和健康…...

FreeRTos学习记录--2.内存管理

后续的章节涉及这些内核对象&#xff1a;task、queue、semaphores和event group等。为了让FreeRTOS更容易使用&#xff0c;这些内核对象一般都是动态分配&#xff1a;用到时分配&#xff0c;不使用时释放。使用内存的动态管理功能&#xff0c;简化了程序设计&#xff1a;不再需…...

C++ 操作符重载Operator

C可以重载大多数操作符&#xff0c;如算术运算符号&#xff0c;-号。 位操作符<<,>> 下标符号[]等都可以重载。 重载的意思&#xff0c;是让这些符号&#xff0c;按你定义的行为来执行代码&#xff0c;但是这种自定义&#xff0c;是有限制的&#xff0c;必须有一…...

SBTI科学碳目标认证有什么要求?SBTI认证的好处?

SBTi&#xff08;科学碳目标倡议&#xff09;认证要求与好处 SBTi&#xff08;Science Based Targets initiative&#xff0c;科学碳目标倡议&#xff09;是由全球环境信息研究中心&#xff08;CDP&#xff09;、联合国全球契约&#xff08;UNGC&#xff09;、世界资源研究所&…...

RS232转Profibus DP网关:技术革新!

RS232转Profibus DP网关&#xff1a;技术革新&#xff01; 在工业自动化领域&#xff0c;通讯协议的多样性为系统设计提供了灵活性&#xff0c;但同时也带来了不同设备间通信的挑战。其中&#xff0c;RS232和Profibus DP是两种广泛应用的通讯协议。RS232&#xff0c;作为一种串…...

XAML基本语法与例子

XAML (eXtensible Application Markup Language) 是一种基于 XML 的声明性语言&#xff0c;主要用于 WPF、UWP、Xamarin.Forms 和 MAUI 等框架中构建用户界面。 基本语法结构 1. 根元素和命名空间声明 <Page x:Class"MyNamespace.MyPage"xmlns"http://sch…...

map和set封装

创作中心-CSDNhttps://mpbeta.csdn.net/mp_blog/creation/editor/147238663 目录 创作中心-CSDNhttps://mpbeta.csdn.net/mp_blog/creation/editor/147238663 一、封装原理 二、改造红黑树 三、实现迭代器 四、测试 五、小tip 一、封装原理 上一篇文章我们完成了红黑…...

Java第六节:创建线程的其它三种方式(附带源代码)

作者往期文章 Java第五节&#xff1a;继承thread类创建线程-CSDN博客 一、实现Runnable接口 创建一个Thread02类实现Runnable接口 二、使用匿名内部类 在Main函数中匿名内部类创建线程 三、使用Lambda表达式 在Main函数中利用Lambda表达式创建一个线程 四、源代码 此项目源代…...

041-代码味道-大泥团模块

代码味道-大泥团模块 代码味道-Blob Module深度解析与C重构实践 一、Blob Module定义与特征 Blob Module&#xff08;大泥团模块&#xff09;是代码坏味道中的一种典型表现&#xff0c;指某个类或模块承担了过多不相关的职责&#xff0c;导致代码结构臃肿、可维护性差。其核心…...

强化学习系统学习路径与实践方法

一、学习路径规划​​ ​​1. 基础巩固阶段&#xff08;1-2个月&#xff09;​​ ​​必读教材​​&#xff1a; 《Reinforcement Learning: An Introduction》(Sutton & Barto) ​​第1-6章​​重点掌握&#xff1a;马尔可夫决策过程&#xff08;MDP&#xff09;、贝尔曼…...

CSS字体

CSS字体 CSS 中的字体样式设置是网页设计的重要部分&#xff0c;以下是一些关键知识点和常见用法&#xff1a; 1.font-family &#xff1a; 用于设置元素的字体系列。可以指定一个或多个字体名称作为备选项&#xff0c;以确保如果某个字体不可用&#xff0c;可以使用下一个备选…...

JDBC:数据库访问的原始接口

目录 一、JDBC 基础入门&#xff1a;数据库访问的原始接口 JDBC 是什么&#xff1f;它在 Java 中扮演什么角色&#xff1f; JDBC 工作原理图解&#xff08;驱动 -> 连接 -> 执行 -> 关闭&#xff09; 常见 JDBC 驱动类型及差异 第一个 JDBC 示例程序&#xff1a;连…...

使用 Electron 打包可执行文件和资源:完整实战教程

一.项目结构 项目结构建议如下&#xff1a; my-electron-app/ ├── example.exe ← 需打包的外部程序 ├── config.json ← 配置文件 ├── native-lib/ ← 自定义库或 DLL │ └── yourlib.dll ├── main.js …...

【网络安全】CI/CD 流水线漏洞

【网络安全】CI/CD 流水线漏洞 1. 保护您的软件管道&#xff1a;CI/CD 安全2. 什么是 CI/CD 以及它为何重要&#xff1f;2.1 持续集成&#xff08;CI&#xff09;&#xff1a;构建坚实的基础2.2 持续交付&#xff08;CD&#xff09;&#xff1a;准备发布2.3 持续部署&#xff0…...

计算机是如何工作的(上)

对于学习JavaEE初阶为什么要知道计算机是如何工作的&#xff0c;是因为在未来我们写代码的时候&#xff0c;会出现一些bug&#xff0c;而在代码层面是看不出来的&#xff0c;所以我们需要了解一些关于计算机内部是如何工作的&#xff0c;从而提高代码的健壮度。 计算机的组成&…...