uniapp中vuex(全局共享)的应用

一、Vuex概述

1.1 官方解释

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。

它采用集中式存储管理 应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化 - Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

在这里插入图片描述

1.2 大白话

状态管理模式、集中式存储管理这些名词听起来就非常高大上,让人捉摸不透。

其实,可以简单的将其看成把需要多个组件共享的变量全部存储在一个对象里面。

然后,将这个对象放在顶层的Vue实例中,让其他组件可以使用。
那么,多个组件是不是就可以共享这个对象中的所有变量属性了呢?

如果是这样的话,为什么官方还要专门出一个插件Vuex呢?难道我们不能自己封装一个对象来管理吗?

当然可以,只是我们要先想想VueJS带给我们最大的便利是什么呢?没错,就是响应式。

如果你自己封装实现一个对象能不能保证它里面所有的属性做到响应式呢?当然也可以,只是自己封装可能稍微麻烦一些。

不用怀疑,Vuex就是为了提供这样一个在多个组件间共享状态的插件,用它就可以了。

1.3 组件间共享数据的方式

List item

父向子传值:v-bind属性绑定
子向父传值:v-on事件绑定
兄弟组件之间共享数据:EventBus
$on 接收数据的组件
$emit 发送数据的组件

上述只适合小范围内数据共享,如果是复杂应用的话,就不再合适了

1.4 再看Vuex是什么

Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享

如图:

在不使用Vuex进行状态管理时,如果要从最下面的紫色组件传递数据的话,还是比较繁琐,也不便于维护。

在使用Vuex进行状态管理时,只需要一个共享Store组件,紫色组件将数据写入Store中,其他使用的组件直接从Store中读取即可。
在这里插入图片描述

1.5 使用Vuex统一管理好处

能够在Vuex中集中管理共享的数据,易于开发和后期维护 能够高效地实现组件之间的数据共享,提高开发效率 存储在Vuex中的数据都是响应式的,能够实时保持数据与页面的同步

二、状态管理

2.1 单页面状态管理

我们知道,要在单个组件中进行状态管理是一件非常简单的事情,如图 在这里插入图片描述 State:指的就是我们的状态,可以暂时理解为组件中data中的属性 View:视图层,可以针对State的变化, 显示不同的信息 Actions:这里的Actions主要是用户的各种操作,如点击、输入等,会导致状态发生变化

简单加减法案例,代码如下:

<template><div><div>当前计数为:{{counter}}</div><button @click="counter+=1">+1</button><button @click="counter-=1">11</button></div>
</template><script>
export default {name: "HelloWorld",data() {return {counter: 0};}
};
</script>

在这个案例中,有没有状态需要管理呢?肯定是有的,就是个数counter
counter需要某种方式被记录下来,也就是上述中的的State部分
counter的值需要被显示在洁面皂,这个就是上述中的View部分
界面发生某些操作(比如此时的+1、-1),需要去更新状态,这就是上述中的Actions部分

这就是一个最基本的单页面状态管理。

2.2 多页面状态管理

Vue已经帮我们做好了单个界面的状态管理,但是如果是多个界面呢,比如

多个视图View都依赖同一个状态(一个状态改了,多个界面需要进行更新)
不同界面的Actions都想修改同一个状态

也就是说对于某些状态(状态1/状态2/状态3)来说只属于我们某一个视图,但是也有一些状态(状态a/状态b/状态c)属于多个试图共同想要维护的,那怎么办呢?

状态1/状态2/状态3你放在自己的组件中,自己管理自己用,没问题
但是状态a/状态b/状态c我们希望交给一个大管家来统一帮助我们管理

没错,Vuex就是为我们提供这个大管家的工具。

2.3 全局单例模式

我们现在要做的就是将共享的状态抽出来,交给我们的大管家,统一进行管理,每个视图按照规定,进行访问和修改操作。

这就是Vuex的基本思想

2.4 管理哪些状态

如果你做过大型开放,你一定遇到过多个状态,在多个界面间的共享问题。

比如用户的登录状态、用户名称、头像、地理位置信息等
比如商品的收藏、购物车中的物品等

这些状态信息,我们都可以放在统一放在Vuex中,对它进行保存和管理,而且它们还是响应式的。

一般情况下,只有组件之间共享的数据,才有必要存储到Vuex中。
对于组件中的私有数据,依旧存储在组件自身的data中即可。

三、Vuex的基本使用

3.1 安装

uniapp中自带 ‘vuex’ 无需安装

3.2 导入

在项目根目录下,新建store目录,在里面新建index.js文件,然后里面这样写:

// @/store/index.js
import Vue from 'vue' //引入vue
import Vuex from 'vuex' //引入vuex
Vue.use(Vuex) //把Vuex作为全局插件,引入到Vue全局实例中

3.3 创建store对象

// @/store/index.js//下方的Store的首字母,必须大写
export default new Vuex.Store({// 全局共享数据,统一放到 store 的 State 中state: {count: 0}
})

创建完成上面store对象后,去main.js页面后,进入下面步骤:

3.4 挂载store对象

将创建的共享数据对象store挂载到Vue实例中,所有的组件,就可以直接从store中获取全局的数据了

// @/main.js页面,如下写:
import App from './App'
import store from './store/index.js' //第一步:引入store/index.js页面。给vuex全局共享使用的// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({...App,store //第二步:把store写到这里。给vuex全局共享使用的
})
app.$mount()
// #endif// #ifdef VUE3
import {createSSRApp
} from 'vue'
export function createApp() {const app = createSSRApp(App)return {app}
}
// #endif

四、Vuex的核心概念

4.1 State 公共数据源

4.1.1 概念

State是提供唯一的公共数据源,所有共享的数据都要统一放到Store的State中进行存储。

如果状态信息是保存到多个Store对象中的,那么之后的管理和维护等都会变得特别困难,所以Vuex也使用了单一状态树(单一数据源Single Source of Truth)来管理应用层级的全部状态。

单一状态树能够让我们最直接的方式找到某个状态的片段,而且在之后的维护和调试过程中,也可以非常方便的管理和维护。

// store.index.js页面
export default new Vuex.Store({state: {count: 0},
}

4.1.2 State数据访问方式一

通过this.$store.state.全局数据名称访问,eg.

当前最新Count值为:{{this.$store.state.count}}

// 在页面模版层 <template> 标签内,不需要使用this. 直接下面这样写
<view>当前最新的count值为:{{$store.state.count}}</view>

4.1.3 State数据访问方式二

从vuex中按需导入mapState函数

import { mapState } from ‘vuex’

通过刚才导入的mapState函数,将当前组件需要的全局数据,映射为当前组件的computed计算属性:

<template><view><text>当前最新Count值为:{{ count }}</text><button>-1</button></view>
</template><script>// 引入vuex的 mapState 函数 S是大写import {mapState} from "vuex";export default {// 在计算属性中使用 count 是定义在 store目录下index.js文件中,全局的属性computed: {...mapState(["count"])}};
</script>

4.2 Mutation 修改count的值

4.2.1 引入

如果想修改count的值,要怎么做呢?看4.2.2 概念:

4.2.2 概念

Mutation用于变更存储在Store中的数据。

只能通过mutation变更Store数据,不可以直接操作Store中的数据 通过这种方式,虽然操作稍微繁琐一些,但可以集中监控所有数据的变化,二直接操作Store数据是无法进行监控的

4.2.3 定义Mutation函数

// @/stare/index.js
// 把 vuex 全写在此文件中
// 第一步下方写
// 第二步去main.js引入
// 第三步在main.js挂载
import Vue from 'vue' //引入vue
import Vuex from 'vuex' //引入vuex
Vue.use(Vuex) //把Vuex作为全局插件,引入到Vue全局实例中//下方的Store的首字母,必须大写
export default new Vuex.Store({// 全局共享数据,统一放到 store 的 State 中state: {count: 0},//修改state下面count的值mutations: {// 自增方法,在其他页面可以调用add(state) {state.count++}}})

定义的函数会有一个默认参数state,这个就是存储在Store中的state对象。

4.2.4 调用Mutation函数

Mutation中不可以执行异步操作,如需异步,请在Action中处理

4.2.4.1 方式一

在普通页面中,通过this.$store.commit(方法名)完成触发,如下:

export default {methods: {add() {//   this.$store.state.count++;this.$store.commit("add");}}
};

4.2.4.2 方式二

在组件中导入mapMutations函数

import { mapMutations } from ‘vuex’

// 普通页面
<script>// 第二种引入全局vuex的方法,下方的s是大写的import {mapState} from 'vuex'export default {name: "Subtraction",data() {return {};}}
</script>

通过刚才导入的mapMutations函数,将需要的mutations函数映射为当前组件的methods方法:

// 普通页面
methods:{...mapMutations('add','addN'),// 当前组件设置的click方法addCount(){this.add()}
}

4.3 Mutation传递参数

在通过mutation更新数据的时候,有时候需携带一些额外的参数,此处,参数被成为mutation的载荷Payload。

如果仅有一个参数时,那payload对应的就是这个参数值,eg.

在这里插入图片描述

如果是多参数的话,那就会以对象的形式传递,此时的payload是一个对象,可以从对象中取出相关的数据。

在mutations中定义函数时,同样可以接收参数,示例如下:

mutations: {// 自增add(state) {state.count++},// 带参数addNum(state, payload) {state.count += payload.number}}

在组件中,调用如下:

methods: {add() {//   this.$store.state.count++;this.$store.commit("add");},addNum() {this.$store.commit("addNum", {number: 10});}
}

4.4 Mutation响应规则

Vuex的store中的State是响应式的,当State中的数据发生改变时,Vue组件也会自动更新。

这就要求我们必须遵守一些Vuex对应的规则:

提前在store中初始化好所需的属性
当给State中的对象添加新属性时,使用如下方式:使用Vue.set(obj,'newProp','propValue')用新对象给旧对象重新赋值

示例代码:

    updateUserInfo(state) {// 方式一Vue.set('user', 'address', '北京市')// 方式二state.user = {...state.user,'address': '上海市'}}

4.5 Mutation常量类型
4.5.1 引入

思考一个问题:

在mutation中, 我们定义了很多事件类型(也就是其中的方法名称),当项目越来越大时,Vuex管理的状态越来越多,需要更新状态的情况也越来越多,也就意味着Mutation中的方法越来越多。

当方法过多,使用者需要花费大量时间精力去记住这些方法,甚至多个文件间来回切换,查看方法名称,也存在拷贝或拼写错误的情况。

那么该如何避免呢?

在各种Flux实现中,一种很常见的方案就是使用常量替代Mutation事件的类型
可以将这些常量放在一个单独的文件中,方便管理,整个App所有的事件类型一目了然

4.5.2 解决方案

解决方案:

创建mutation-types.js文件,在其中定义常量
定义常量时, 可以使用ES2015中的风格, 使用一个常量来作为函数的名称
使用处引入文件即可

新建mutation-types.js:
在这里插入图片描述
在store/index.js中引入并使用:

import Vue from 'vue'
import Vuex from 'vuex'
import * as types from './mutation-type'Vue.use(Vuex)export default new Vuex.Store({state: {count: 0,user: {name: '旺财',age: 12}},mutations: {// 自增[types.ADD_NUM](state) {state.count++},
}

在组件中,引入并调用:

<script>
import { ADD_NUM } from "../store/mutation-type";
export default {methods: {add() {this.$store.commit(ADD_NUM);//   this.addAsync();//   this.$store.state.count++;//   this.$store.commit("add");}}
};
</script>

4.3 Action 异步任务

Action类似于Mutation,但是是用于处理异步任务的,比如网络请求等

如果通过异步操作变更数据,必须通过Action,而不能使用Mutation,但在Action中还是要通过触发Mutation的方式间接变更数据。
4.3.1 参数context

在actions中定义的方法,都会有默认值context。

context是和store对象具有相同方法和属性的对象
可以通过context进行commit相关操作,可以获取context.state数据

但他们并不是同一个对象,在Modules中会介绍到区别。
4.3.2 使用方式一

在index.js中,添加actions及对应的方法:

export default new Vuex.Store({state: {count: 0},mutations: {// 自增add(state) {state.count++}},actions: {addAsync(context) {setTimeout(() => {context.commit('add')}, 1000);}}
})

组件中调用:

<script>
export default {methods: {addNumSync(){// dispatch用于触发Actions中的方法this.$store.dispatch('addAsync')}}
};
</script>

4.3.3 使用方式二

在组件中,导入mapActions函数

import { mapActions } from ‘vuex’

通过刚才导入的mapActions函数,将需要的actions函数映射为当前组件的methods方法:

4.3.4 使用方式三

在导入mapActions后,可以直接将指定方法绑定在@click事件上。

mapActions(["addAsync"]),<button @click="addAsync">+1(异步)</button>

该方式也适用于导入的mapMutations
4.3.5 Actions携带参数

在index.js的actions中,增加携带参数方法,如下:

export default new Vuex.Store({state: {count: 0},mutations: {// 带参数addNum(state, payload) {state.count += payload.number}},actions: {addAsyncParams(context, payload) {setTimeout(() => {context.commit('addNum', payload)}, 1000);}}
})

在组件中,调用如下:

methods: {addNumSyncParams() {this.$store.dispatch("addAsyncParams", {number: 100});}}

4.3.6 Actions与Promise结合

Promise经常用于异步操作,在Action中,可以将异步操作放在Promise中,并且在成功或失败后,调用对应的resolve或reject。

示例:

在store/index.js中,为actions添加异步方法:

actions: {loadUserInfo(context){return new Promise((resolve)=>{setTimeout(() => {context.commit('add')resolve()}, 2000);})}}

在组件中调用,如下:

methods: {addPromise() {this.$store.dispatch("loadUserInfo").then(res => {console.log("done");});}
}

4.4 Getter 专用计算属性

Getters用于对Store中的数据进行加工处理形成新的数据,类似于Vue中的计算属性
Store中数据发生变化,Getters的数据也会跟随变化

4.4.1 使用方式一

在index.js中定义getters

getters:{showNum(state){return '当前Count值为:'+state.count}}

在组件中使用:

{{ this.$store.getters.showNum }}

4.4.2 使用方式二

在组件中,导入mapGetters函数

import { mapGetters } from ‘vuex’

通过刚才导入的mapGetters函数,将需要的getters函数映射为当前组件的computed方法:

 computed: {...mapGetters(["showNum"])}

使用时,直接调用即可:

{{ showNum }}

4.5 Modules 模块

4.5.1 概念

Module是模块的意思,为什么会在Vuex中使用模块呢?

Vues使用单一状态树,意味着很多状态都会交给Vuex来管理
当应用变的非常复杂时,Store对象就可能变的相当臃肿
为解决这个问题,Vuex允许我们将store分割成模块(Module),并且每个模块拥有自己的State、Mutation、Actions、Getters等

4.5.2 使用

在store目录下,新建文件夹modules,用于存放各个模块的modules文件,此处以moduleA为例。

在modules文件夹中,新建moduleA.js,内部各属性state、mutations等都和之前一致,注释详见代码,示例如下:

export default {state: {name: '凤凰于飞'},actions: {aUpdateName(context) {setTimeout(() => {context.commit('updateName', '旺财')}, 1000);}},mutations: {updateName(state, payload) {state.name = payload}},getters: {fullName(state) {return state.name + '王昭君'},fullName2(state, getters) {// 通过getters调用本组方法return getters.fullName + ' 礼拜'},fullName3(state, getters, rootState) {// state代表当前module数据状态,rootState代表根节点数据状态return getters.fullName2 + rootState.counter}}
}
局部状态通过context.state暴露出来,根节点状态则为context.rootState

在store/index.js中引用moduleA,如下:


import Vue from "vue"
import Vuex from "vuex"import moduleA from './modules/moduleA'Vue.use(Vuex)const store = new Vuex.Store({modules: {a: moduleA}
})export default store

这样就通过分模块完成了对状态管理的模块化拆分。

4.6 优化

如果项目非常复杂,除了分模块划分外,还可以将主模块的actions、mutations、getters等分别独立出去,拆分成单独的js文件,分别通过export导出,然后再index.js中导入使用。

示例:
分别将主模块的actions、mutations、getters独立成js文件并导出,以actions.js为例,

export default{aUpdateInfo(context, payload) {return new Promise((resolve, reject) => {setTimeout(() => {context.commit('updateInfo')resolve()}, 1000);})}
}

在store/index.js中,引入并使用,如下:

import Vue from "vue"
import Vuex from "vuex"
import mutations from './mutations'
import actions from './actions'
import getters from './getters'
import moduleA from './modules/moduleA'Vue.use(Vuex)const state = {counter: 1000,students: [{ id: 1, name: '旺财', age: 12 },{ id: 2, name: '小强', age: 31 },{ id: 3, name: '大明', age: 45 },{ id: 4, name: '狗蛋', age: 78 }],info: {name: 'keko'}
}const store = new Vuex.Store({state,mutations,getters,actions,modules: {a: moduleA}
})export default store

最终项目目录图:
在这里插入图片描述
这样子,结构清晰明了,也便于后期的维护

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity中触发器Trigger无法被射线检测到的问题

今天在做项目的时候发现,同一个物体,当他是碰撞器的时候,可以被射线检测到. 但是当他变成触发器的时候,射线就检测不到了??? 本来以为就是这样的,但是查了资料发现并没有这样的限制,触发器也是可以正常被射线检测的 到处查资料都没有发现问题,后来发现是下面这个设置不知道…

搭建springmvc项目

什么是springmvc MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 View视图 Controller控制层 springmvc框架是spring框架的一个分支。它是按照mvc架构思想设计的一款框架。 springmvc的主要作用: 接收浏览器的请求数据&#xff0c;对数据进行处理&#xff0c;…

超越 RAG 基础:AI 应用的高级策略

作者&#xff1a;来自 Elastic Elastic Platform Team 我们最近与 Cohere 举办的虚拟活动深入探讨了检索增强生成 (retrieval augmented generation - RAG) 的世界&#xff0c;重点讨论了在概念验证阶段之后构建 RAG 应用程序的关键注意事项。我们的演讲者是 Elastic 的首席解…

音频开发中常见的知识体系

在 Linux 系统中&#xff0c;/dev/snd 目录包含与声音设备相关的文件。每个文件代表系统中的一部分音频硬件或音频控制接口。以下是你列出的文件及其含义&#xff1a; 一.基本术语 样本长度(sample)&#xff1a;样本是记录音频数据最基本的单位&#xff0c;计算机对每个通道采…

贪心算法 part01

class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值&#xff08;相当于不断确定最大子序终止位置&#xff…

Ubuntu 安装texstudio sty与texlive

手动安装需要的包 访问CTAN网站&#xff08;Comprehensive TeX Archive Network&#xff09;并下载enumitem宏包&#xff1a; enumitem CTAN页面下载后&#xff0c;将宏包解压到/usr/share/texmf/tex/latex/下。 可打开texstudio/帮助/宏包帮助下载。 如果不想手动安装一个个…

Moretl安全日志采集工具

永久免费: 至Gitee下载 使用教程: Moretl使用说明 使用咨询: 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架…

CAN配置---波特率中断引脚等---autochips-AC7811-ARM-M3内核

1、配置工具 虽然不怎么好用&#xff0c;但比没有强多了。具体看图&#xff1a; 时钟选着 NVIC配置 GPIO配置 2、生成的具体配置信息 NXP的配置工具里面&#xff0c;具体的波特率可以直接显示&#xff0c;这个工具没有&#xff0c;怎么办&#xff1f; 它放到了生成的代码里面…

【ETCD】ETCD 架构揭秘:内部各组件概览

ETCD 的主要组件及它们之间的关联关系如下&#xff1a; 目录 1. Client&#xff08;客户端&#xff09;2. gRPC 接口3. Etcd Server Main Loop&#xff08;ETCD 主循环&#xff09;4. Raft&#xff08;共识模块&#xff09;5. Peer Etcd Nodes&#xff08;ETCD 集群节点&#x…

乐凡信息智能安全管控方案:助力油气田行业安全管控多方位升级

我国油田地域广阔&#xff0c;分布着大量各种油井&#xff0c;油井开采设备的连续稳定运行是保证石油开采的首要条件。然而&#xff0c;由于油田多位于特殊地理环境中&#xff0c;因而实现油井之间的通信首要问题就是要克服地理环境所带来的限制&#xff0c;传统通信系统的建设…

windows 使用python共享网络给另外一个网卡

# -*- coding: utf-8 -*- import subprocessdef open_share(to_shared_adapter, from_shared_adapter):"""打开以太网的网络共享:return: None"""powershell_script f"""# Register the HNetCfg library (once)# regsvr32 hnetc…

深度学习实战智能交通计数

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对车辆目标数据集进行训练和优化&#xff0c;该数据集包含丰富的车辆目标图像样本…

rebase ‘A‘ onto ‘master‘ 和 merge ‘master‘ into ‘A‘有什么区别

在Git版本控制系统中&#xff0c;rebase 和 merge 是两种不同的操作&#xff0c;用于合并分支。rebase A onto master 和 merge master into A 虽然最终目的都是将两个分支的更改合并在一起&#xff0c;但它们在处理方式和结果上有所不同。 rebase ‘A’ onto ‘master’ 含义…

MySQL Explain 分析SQL语句性能

一、EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 &#xff08;1&#xff09; 通过EXPLAIN&#xff0c;我们可以分析出以下结果&#xff1a; 表的读取顺序数据读取…

关于SAP Router连接不稳定的改良

这个也是网上看来的&#xff0c;之前在用的时候也在想是不是建立一个长连接&#xff0c;就不至于断线。今天正好看到。 关于SAP Router连接不稳定的改良 我们在使用SAPRouter时经常会碰到断线&#xff0c;其发生原因有很多&#xff0c;如&#xff1a;网络不稳定、操作间隔时间…

游泳溺水识别数据集,对9984张原始图片进行YOLO,COCO JSON, VOC XML 格式的标注,平均识别率在91.7%以上

游泳溺水识别数据集&#xff1a; 对9984张原始图片进行YOLO&#xff0c;COCO JSON, VOC XML 格式的标注&#xff0c;平均识别率在91.7&#xff05;以上 &#xff0c;可识别泳池或者水库中是否有人溺水。 数据集分割 训练组98&#xff05; 9818图片 有效集&#xff05;…

Docker的容器编排

目录 1. 什么是容器编排&#xff08;Docker Compose&#xff09;2. 容器编排的功能3. 容器编排文件&#xff08;docker-compose.yml&#xff09;的介绍3.1 文件语法版本3.2 文件基本结构及常见指令 4. Docker Compose命令详解4.1 Docker Compose命令清单4.2 命令格式和常见选项…

Type 类型 总结

GetType、Typeof Type 官网资料 IsAssignableFrom IsAssignableTo 在C#中&#xff0c;Type.IsAssignableFrom方法用于判断一个类型是否可以从另一个类型赋值。它检查源类型是否是目标类型的基类或接口。 isAssignableFrom(Class<?> c) 标识 “当前Class 是否是给定…

温度传感器DS18B20详解

前面我们学习 DHT11 的时候提到了 DS18B20&#xff0c;它有很宽的测温范围&#xff0c;-55C ~ 125C。那么本次我们就来详细介绍一下 DS18B20。 DS18B20 是一种单总线数字温度传感器&#xff0c;它被广泛应用于各种领域&#xff0c;例如气象监测、室内温度控制、工业自动化等。…

基于MNE的EEGNet 神经网络的脑电信号分类实战(附完整源码)

利用MNE中的EEG数据&#xff0c;进行EEGNet神经网络的脑电信号分类实现&#xff1a; 代码&#xff1a; 代码主要包括一下几个步骤&#xff1a; 1&#xff09;从MNE中加载脑电信号&#xff0c;并进行相应的预处理操作&#xff0c;得到训练集、验证集以及测试集&#xff0c;每个…