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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不能通过 ip 直接访问 共享盘 解决方法

from base_config.config import OpenSMB, SMB import os, time, calendar, requests, decimal, platform, fs.smbfsinfo_dict SMB.EPDI_dict info_dict[host] (FS03,10.6.12.182) info_dict[direct_tcp] True# smb OpenSMB(info_dict)print(ok)# 根据 ip 查询电脑名 impor…

JavaEE初阶——多线程(线程安全-锁)

复习上节内容&#xff08;部分-掌握程度不够的&#xff09; 加锁&#xff0c;解决线程安全问题。 synchronized关键字&#xff0c;对锁对象进行加锁。 锁对象&#xff0c;可以是随便一个Object对象&#xff08;或者其子类的对象&#xff09;&#xff0c;需要关注的是&#xff…

day2 数据结构 结构体的应用

思维导图 小练习&#xff1a; 定义一个数组&#xff0c;用来存放从终端输入的5个学生的信息【学生的信息包含学生的姓名、年纪、性别、成绩】 1>封装函数 录入5个学生信息 2>封装函数 显示学生信息 3>封装函数 删除第几个学生信息&#xff0c;删除后调用显示学…

五、网络层:控制平面,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》

目录 一、导论 二、路由选择算法 2.1 路由&#xff08;route&#xff09;的概念 2.2 网络的图抽象 2.2.1 边和路由的代价 2.2.2 最优化原则 2.3 路由的原则 2.4 路由选择算法的分类 2.5 link state 算法 2.5.1 LS路由工作过程 2.5.2 链路状态路由选择&#xff08;lin…

内网是如何访问到互联网(H3C源NAT)

H3C设备NAPT配置 直接打开29篇的拓扑&#xff0c;之前都配置好了 「模拟器、工具合集」复制整段内容 链接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil 现在是出口路由器可以直接访问61.128.1.1&#xff0c;下面的终端访问不了&#xff0c;需要做NAPT源…

生产者-消费者模型

目录 生产者-消费者模型介绍 生产者-消费者模型优点 生产者-消费者之间的关系 基于阻塞队列实现生产者-消费者模型 基于环形队列实现生产者-消费者模型 生产者-消费者模型介绍 ● 计算机中的生产者和消费者本质都是线程/进程 ● 生产者和消费者不直接通讯&#xff0c;而是…

.NET6 WebAPI从基础到进阶--朝夕教育

1、环境准备 1. Visual Studio 2022 2. .NET6 平台支持 3. Internet Information Services 服务器&#xff08; IIS &#xff09; 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器&#xff08; Docker 部署使用&#xff09; …

Linux系统中进程的概念 -- 冯诺依曼体系结构,操作系统,进程概念,查看进程,进程状态,僵尸进程,孤儿进程,进程优先级,进程切换,进程调度

目录 1. 冯诺依曼体系结构 2. 操作系统(Operator System) 2.1 操作系统的概念 2.2 设计操作系统(OS)的目的 2.3 系统调用和库函数概念 3. 进程 3.1 进程的基本概念与基本操作 3.1.1 进程的基本概念 3.1.2 PCB -- 描述进程 3.1.3 task_ struct 3.1.4 查看进程 3.1.5…

4.redis通用命令

文章目录 1.使用官网文档2.redis通用命令2.1set2.2get2.3.redis全局命令2.3.1 keys 2.4 exists2.5 del(delete)2.6 expire - (失效时间)2.7 ttl - 过期时间2.7.1 redis中key的过期策略2.7.2redis定时器的实现原理 2.8 type2.9 object 3.生产环境4.常用的数据结构4.1认识数据类型…

Web项目图片视频加载缓慢/首屏加载白屏

Web项目图片视频加载缓慢/首屏加载白屏 文章目录 Web项目图片视频加载缓慢/首屏加载白屏一、原因二、 解决方案2.1、 图片和视频的优化2.1.1、压缩图片或视频2.1.2、 选择合适的图片或视频格式2.1.3、 使用图片或视频 CDN 加速2.1.4、Nginx中开启gzip 三、压缩工具推荐 一、原因…

成人教育专升本-不能盲目选择

成人教育专升本都有哪些方法?在当今时代&#xff0c;学历往往是打开职业机会的敲门砖&#xff0c;成人教育专升本成为突破职业发展瓶颈的途径&#xff0c;然而&#xff0c;你是否清楚它们之间究竟有着怎样的区别呢? 一、成人教育专升本&#xff0c;成人高考 1、考试形式 成人…

repmgr集群部署-PostgreSQL高可用保证

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

【前端】 canvas画图

一、场景描述 利用js中的canvas画图来画图&#xff0c;爱心、动画。 二、问题拆解 第一个是&#xff1a;canvas画图相关知识。 第二个是&#xff1a;动画相关内容。 三、知识背景 3.1 canvas画图相关内容 canvas画图的基本步骤 获取页面上的canvas标签对象获取绘图上下文…

深度学习——激活函数、损失函数、优化器

深度学习——激活函数、损失函数、优化器 1、激活函数1.1、一些常见的激活函数1.1.1、sigmoid1.1.2、softmax1.1.3、tanh1.1.4、ReLU1.1.5、Leaky ReLU1.1.6、PReLU1.1.7、GeLU1.1.8、ELU 1.2、激活函数的特点1.2.1、非线性1.2.2、几乎处处可微1.2.3、计算简单1.2.4、非饱和性1…

硬件设计-电源轨噪声对时钟抖动的影响

目录 定义 实际案例 总结 定义 首先了解抖动的定义&#xff0c;在ITU-T G.701中有关抖动的定义如下&#xff1a; 数字信号重要瞬间相对于其理想时间位置的短期非累积变化。 抖动是时钟或数据信号时序的短期时域变化。抖动包括信号周期、频率、相位、占空比或其他一些定时特…

搭建自己的wiki知识库(重新整理)

写在前面&#xff1a; 之前写过一篇&#xff0c;因为这次修改的内容比较多&#xff0c;所以不想在原基础上修改了&#xff0c;还是重新整理一篇吧。搭建wiki知识库&#xff0c;可以使用在线文档&#xff0c;如xx笔记、xx文档、xx博客、git仓库&#xff08;如&#xff1a;GitHu…

数据可视化的Python实现

一、GDELT介绍 GDELT ( www.gdeltproject.org ) 每时每刻监控着每个国家的几乎每个角落的 100 多种语言的新闻媒体 -- 印刷的、广播的和web 形式的&#xff0c;识别人员、位置、组织、数量、主题、数据源、情绪、报价、图片和每秒都在推动全球社会的事件&#xff0c;GDELT 为全…

【Python基础】Python知识库更新中。。。。

1、Python知识库简介 现阶段主要源于个人对 Python 编程世界的强烈兴趣探索&#xff0c;在深入钻研 Python 核心语法、丰富库函数应用以及多样化编程范式的基础上&#xff0c;逐步向外拓展延伸&#xff0c;深度挖掘其在数据分析、人工智能、网络开发等多个前沿领域的应用潜力&…

SpringCloud微服务实战系列:02从nacos-client源码分析注册中心工作原理

目录 角色与功能 工作流程&#xff1a; nacos-client关键源码分析 总结&#xff1a; 角色与功能 服务提供者&#xff1a;在启动时&#xff0c;向注册中心注册自身服务&#xff0c;并向注册中心定期发送心跳汇报存活状态。 服务消费者&#xff1a;在启动时&#xff0c;把注…

电感2222

1 电感 1电感是什么 2 电感的电流不能突变&#xff1a;电容是两端电压不能突变 3 电感只是限制电流变化速度