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

news2024/12/18 18:47:57

一、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.coloradmin.cn/o/2261738.html

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

相关文章

React简单入门 - [Next.js项目] - 页面跳转、AntD组件、二级目录等

须知 1Next.js 官网(英文)Next.js by Vercel - The React Framework2Next.js 文档(中文)简介 | Next.js 中文文档3React官网(中文)https://react.docschina.org/learn4Ant Design组件总览组件总览 - Ant Design5tailwindcss类名大全 官网英Justify Content - TailwindCS…

【十进制整数转换为其他进制数——短除形式的贪心算法】

之前写过一篇用贪心算法计算十进制转换二进制的方法&#xff0c;详见&#xff1a;用贪心算法计算十进制数转二进制数&#xff08;整数部分&#xff09;_短除法求二进制-CSDN博客 经过一段时间的研究&#xff0c;本人又发现两个规律&#xff1a; 1、不仅仅十进制整数转二进制可…

企业内训|阅读行业产品运营实战训练营-某运营商数字娱乐公司

近日&#xff0c;TsingtaoAI公司为某运营商旗下数字娱乐公司组织的“阅读行业产品运营实战训练营”在杭州落下帷幕。此次训练营由TsingtaoAI资深互联网产品专家程靖主持。该公司的业务骨干——来自内容、市场、业务、产品与技术等跨部门核心岗位、拥有8-10年实战经验的中坚力量…

pinctrl子系统学习笔记

一、背景 cpu的gpio引脚可以复用成多个功能&#xff0c;如可以配置成I2C或者普通GPIO模式。配置方式一般是通过写引脚复用的配置寄存器&#xff0c;但是不同芯片厂商配置寄存器格式内容各不相同&#xff0c;设置引脚复用无法做到通用且自由的配置&#xff0c;只能在启动初始化…

免费开源了一个图床工具 github-spring-boot-starter

文章目录 第一步&#xff0c;新建一个SpringBoot项目第二步&#xff0c;在pom文件里面引入jar包第三步&#xff0c;配置你的github信息github.authorization1、进入github官网&#xff0c;登录账号&#xff0c;点击头像&#xff0c;选择setting2、选择[Developer Settings](htt…

JVM系列之内存区域

每日禅语 有一位年轻和尚&#xff0c;一心求道&#xff0c;多年苦修参禅&#xff0c;但一直没有开悟。有一天&#xff0c;他打听到深山中有一古寺&#xff0c;住持和尚修炼圆通&#xff0c;是得道高僧。于是&#xff0c;年轻和尚打点行装&#xff0c;跋山涉水&#xff0c;千辛万…

自动驾驶AVM环视算法--python版本的俯视碗型投影模式

c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--3D碗型投影模式的exe测试工具》本文档进用于展示部分代码的视线&#xff0c;获取方式网盘自行获取&#xff08;非免费介意勿下载&#xff09;&#xff1a;链接: https://pan.baidu.com/s/1STjUd87_5wDk_C…

【并发容器】源码级ConcurrentHashMap详解(java78)

1. ConcurrentHashMap 为什么要使用ConcurrentHashmap 在多线程的情况下&#xff0c;使用HashMap是线程不安全的。另外可以使用Hashtable&#xff0c;其是线程安全的&#xff0c;但是Hashtable的运行效率很低&#xff0c;之所以效率低下主要是因为其实现使用了synchronized关…

程序设计考题汇总(四:SQL练习)

文章目录 查询结果限制返回行数 查询结果限制返回行数 select device_id from user_profile LIMIT 2;

Alan Chhabra:MongoDB AI应用程序计划(MAAP) 为客户提供价值

MongoDB全球合作伙伴执行副总裁 Alan Chhabra 每当有人向我问询MongoDB&#xff0c;我都会说他们很可能在不觉之间已经与MongoDB有过交集。事实上&#xff0c;包括70%财富百强在内的许多世界领先企业公司都在使用MongoDB。我们在MongoDB所做的一切都是为了服务客户&#xff0c…

centos使用mkisofs构建无人值守镜像(附官方学习文档)

安装mkisofs yum install -y mkisofs 挂载镜像并确认 并拷贝文件(/mnt 为我们的工作目录) 1.3 准备自动应答文件(保存为 ins.ks) 修改系统引导 实际上就是添加inst.ks 这个引导参数 传递应答文件 传统模式引导

jenkins pipeline打包流程

Jenkins Pipeline 是 Jenkins 提供的一种用于持续集成和持续交付&#xff08;CI/CD&#xff09;的脚本化流程工具。它允许你通过编写一个 Jenkinsfile 文件来定义整个构建、测试和部署的流程。本文介绍打包springcloud项目&#xff0c;react项目为docker镜像 文章目录 1.项目结…

【容器】k8s学习笔记原理详解(十万字超详细)

Pod详解 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的容器&#xff0c;数量可多可少Pause容器&#xff0c;这是每个Pod都会有的一个根容器&#xff0c;它的作用有两个&#xff1a; 可以以它为依据&am…

用.Net Core框架创建一个Web API接口服务器

我们选择一个Web Api类型的项目创建一个解决方案为解决方案取一个名称我们这里选择的是。Net 8.0框架 注意&#xff0c;需要勾选的项。 我们找到appsetting.json配置文件 appsettings.json配置文件内容如下 {"Logging": {"LogLevel": {"Default&quo…

多音轨视频使用FFmpeg删除不要音轨方法

近期给孩子找宫崎骏动画&#xff0c;但是有很多是多音轨视频但是默认的都是日语&#xff0c;电视上看没办法所以只能下载后删除音轨文件只保留中文。 方法分两步&#xff0c;先安装FFmpeg在转文件即可。 第一步FFmpeg安装 FFmpeg是一个开源项目&#xff0c;包含了处理视频的…

Ubuntu22.04切换gcc版本教程

在编译安装程序的时候,由于gcc版本过高,导致编译无法通过,需要降低gcc版本。 一、安装gcc版本 根据自己的需求安装gcc版本。 sudo apt update sudo apt install gcc-10 g++-10二、切换gcc版本 sudo update-alternatives --install /usr/bin/gcc gcc

[SZ901] JTAG合并功能(类似FPGA菊花链)

SZ901 JTAG支持将JTAG端口组合&#xff0c;最多将四个JTAG变成一个 设置如下 Vivado 识别结果如下 两块板子&#xff0c;变成一组&#xff0c;&#xff0c;可以同时抓取信号&#xff0c;调试&#xff01; SZ901 已上架淘宝&#xff0c;搜素“SZ901”哦

【收藏】Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候&#xff0c;有一个需求是限制相机倾斜角&#xff0c;也就是鼠标中键调整视图俯角时&#xff0c;不能过大&#xff0c;一般 pitch 角度范围在 0 至 -90之间&#xff0c;-90刚好为正俯视。 在网上查阅了很多资料&#xff0c;发现并没有一个合适的…

如何解决samba服务器共享文件夹不能粘贴文件

sudo vim /etc/samba/smb.conf在samba的配置文件中增加一个选项 writable yes重启Samba服务以使更改生效&#xff1a; sudo service smbd restart

数据结构简介:结构创造效率

一、数据结构的本质 数据结构是组织大量数据的方法&#xff08;data structures&#xff1a;methods of organizing large amounts of data &#xff09;。 根据这个定义&#xff0c;一条数据&#xff0c;就不能构成数据结构。 因为结构是数据与数据之间的关联&#xff0c;…