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.rhkb.cn/news/490017.html

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

相关文章

华为云服务器搭建基于LNMP部署wordpress

Ubuntu系统搭建过程目录 一、检查环境1.1 检查是否安装Nginx1.2 检查是否安装Mysql1.3 检查是否安装PHP二、更新软件包以及安装所需要的依赖 三、安装Nginx3.1 下载并解压nginx3.2. 编译安装3.3 启动和停止和测试3.4 创建服务脚本3.5 Nginx目录 四、安装Mysql4.1 安全安装配置4…

ElasticSearch01-概述

零、文章目录 ElasticSearch01-概述 1、Elastic Stack &#xff08;1&#xff09;简介 官网地址&#xff1a;https://www.elastic.co/cn/ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际…

Python学习(二)—— 基础语法(上)

目录 一&#xff0c;表达式和常量和变量 1.1 表达式 1.2 变量 1.3 动态类型特性 1.4 输入 二&#xff0c;运算符 2.1 算术运算符 2.2 关系运算符 2.3 逻辑运算符 2.4 赋值运算符 2.5 练习 三&#xff0c;语句 3.1 条件语句 3.2 while循环 3.3 for循环 四&#…

Idea汉化插件Datagrip汉化插件

汉化插件 ‍ ‍ Chinese (Simplified) Language Pack / 中文语言包 ‍ 插件地址 ‍ 安装完了之后,如果还不是中文的怎么办 ‍ 需要手动设置 Seetings -> Appearance & Behavior -> System Settings -> Language and Region -> Language 修改为 [ Chi…

ansible 自动化运维工具(三)playbook剧本

目录 Playbook的定义 Playbook组成 Playbook命令 Playbook剧本编写格式 基本组件 Handlers处理器 tags标签 Facts组件 Register&#xff1a;注册变量 Debug模块 Playbook循环 With_items循环 With_dict循环&#xff08;字典循环&#xff09; With_nested循环&…

12.2【JAVA EXP4]next.js的各种问题,DEBUG,前端补强,前后端交互,springSecurity ,java 配置,h2数据库

在服务器组件中使用了 useState 这样的 React Hook。useState 只能在客户端组件中使用&#xff0c;而不能在服务器组件中使用。Next.js 的新架构&#xff08;App Router&#xff09;中&#xff0c;默认情况下&#xff0c;页面和布局组件是服务器组件&#xff0c;因此不能直接使…

Cursor重置机器码-解决Too many free trials.

参考文章&#xff1a;如何绕过Cursor的机器绑定限制 前言 在前面这篇文章无限使用Cursor指南中&#xff0c;我提到使用 无限邮箱 或者 删除账号并重新注册 的方法&#xff0c;来无限使用Cursor免费版。但是当在本机登录过3个账号后&#xff0c;就会报这个“Too many free tria…

【PlantUML系列】部署图(七)

一、部署图的组成部分 节点&#xff08;Node&#xff09;&#xff1a;使用node关键字定义一个节点&#xff0c;节点可以是服务器、数据库或其他硬件设备。组件&#xff08;Component&#xff09;&#xff1a;使用component关键字定义一个组件&#xff0c;组件可以是软件模块或服…

qt QCommandLineParser详解

1、概述 QCommandLineParser是Qt框架中提供的一个类&#xff0c;专门用于解析命令行参数。它简化了命令行参数的处理过程&#xff0c;使得开发者能够轻松定义、解析和验证命令行选项和参数。QCommandLineParser适用于需要从命令行获取输入的控制台应用程序&#xff0c;以及需要…

青少年夏令营管理系统的设计与开发(社团管理)(springboot+vue)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

vue3-tp8-Element:对话框实现

效果 参考框架 Dialog 对话框 | Element Plus 具体实现 一、建立view页面 /src/views/TestView.vue 二、将路径写入路由 /src/router/index.js import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vueconst router create…

【鸿睿创智开发板试用】移植OpenCV 4到OpenHarmony 4.1

目录 目录 引言 编译系统镜像 (1) 下载代码后解压SDK (2) 下载docker镜像   (3) 编译OH 编译OpenCV 下载OpenCV源代码 构建编译配置文件 执行编译命令 安装库和头文件 测试 结语 引言 最近有个需求是在基于RK3568的OpenHarmony 4.1系统中使用OpenCV&#xff0c…

TimesFM(Time Series Foundation Model)时间序列预测的数据研究(3)

前一篇完成了 TimesFM 的运行 TimesFM&#xff08;Time Series Foundation Model&#xff09;安装&#xff08;2&#xff09;-CSDN博客文章浏览阅读520次&#xff0c;点赞13次&#xff0c;收藏24次。决定在 小红帽ubuntu UBUNTU安装 timesFM在 ide.cloud.tencent.com 的环境上…

【潜意识Java】深入理解 Java 面向对象编程(OOP)

目录 什么是面向对象编程&#xff08;OOP&#xff09;&#xff1f; 1. 封装&#xff08;Encapsulation&#xff09; Java 中的封装 2. 继承&#xff08;Inheritance&#xff09; Java 中的继承 3. 多态&#xff08;Polymorphism&#xff09; Java 中的多态 4. 抽象&…

三、汇总统计

1.SUM、COUNT、AVERAGE 注意&#xff1a;count函数是计算区域中包含数字的单元格的个数&#xff0c;以上案例中两个空白单元格和一个中文列标题都是没有计算在内的。 平均函数AVERAGE也是按照17进行求平均值的。所以在使用平均值的函数时候&#xff0c;可以根据实际情况看是…

EXCEL的各种图形,统计图形

目录 0 EXCEL的各种图形&#xff0c;统计图形 1 统计图形 / 直方图 / 其实叫 频度图 hist最合适(用原始数据直接作图) 1.1 什么是频度图 1.2 如何创建频度图&#xff0c;一般是只选中1列数据&#xff08;1个数组&#xff09; 1.3 如何修改频度图的宽度 1.4 hist图的一个特…

基于Llamaindex的网页内容爬取实战

目的 本文不关注如何解析网页 html 元素和各种 python 爬虫技术&#xff0c;仅作为一种网页数据的预处理手段进行研究。Llamaindex 也并不是爬虫技术的集大成者&#xff0c;使用它是为了后续的存查一体化。 安装依赖 pip install llama-index-readers-web # pip install llam…

debian12学习笔记

前置条件 基于debian12官网的qcow2格式文件进行操作 安装ssh 登录虚拟机后安装ssh服务端 apt install openssh-server配置国内源 新增/etc/apt/sources.list.d/tsinghua.list 使用清华大学的源 https://www.cnblogs.com/shanhubei/p/18104430 deb https://mirrors.tuna.t…

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1&#xff0c;因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

UE5编辑器下将RenderTarget输出为UTexture并保存

在使用UE5开发项目时&#xff0c;RenderTarget是一种非常强大的工具&#xff0c;常用于生成实时纹理效果、后处理和调试。而将RenderTarget的内容转换为UTexture并储存&#xff0c;是许多编辑器内的需求都需要的功能。 1.材质球输出至Texture 首先创建一个Actor类&#xff0c…