Vue3学习总结
一、Vue 3 基础搭建与核心语法
1.创建 Vue 3 应用
在项目的入口文件 main.js 中,通过以下代码创建 Vue 3 应用实例:
import { createApp } from 'vue';
import App from './App.vue';const app = createApp(App);
app.mount('#app');
这几行代码的作用是引入 createApp 函数,创建一个应用实例,并将 App.vue 挂载到页面上指定的 #app 元素。
2.组合式 API
Vue 3 引入了 组合式 API(Composition API),提供了更灵活的逻辑复用方式。
- 组合逻辑:Composition API 提供了一种新的方式来组织和复用逻辑代码。它允许开发者以函数的形式定义组件的逻辑,而不是像 Options API 那样分散在
data、methods、computed等选项中。 - 生命周期钩子:如
onMounted,onUnmounted等等,与 Options API 中的生命周期钩子相对应,但更灵活,可以自由组合。 -
setup:组件的入口函数,用于定义响应式数据、计算属性、方法等。
<script setup>
import { ref, onMounted } from 'vue';const message = ref('Hello World');onMounted(() => {console.log('Component is mounted!');
});
</script><template><p>{{ message }}</p>
</template>
import { ref, onMounted } from 'vue';export default {setup() {const count = ref(0);onMounted(() => {console.log('Component mounted');});return {count,};},
};
3.<script setup> 语法
<script setup> 是 Vue 3 提供的重要语法糖,极大地简化了组件的代码结构。在该语法下,模块顶层的代码会自动编译到 setup() 函数中,无需显式定义 setup 函数。
二、响应式原理与数据处理
Vue 3 使用 Proxy 实现响应式系统,Vue 3 使用 Proxy 替代了 Vue 的 Object.defineProperty,实现了更强大的响应式系统。
1.ref 和 reactive
ref和reactive:ref用于创建简单的响应式引用,而reactive则用来处理对象。对于数组和对象,建议使用reactive。.value访问器:当使用ref创建的响应式引用时,需要通过.value来读取或设置其内部值。
<script setup>
import { ref, reactive } from 'vue';// 使用 ref 创建基本类型响应式变量
const count = ref(0);// 使用 reactive 创建复杂类型的响应式对象
const state = reactive({name: 'Vue',version: 3,
});function increment() {count.value++;
}
</script><template><div><p>Count is {{ count }}</p><button @click="increment">Increment</button><p>Name is {{ state.name }}, Version is {{ state.version }}</p></div>
</template>
2.toRefs
toRefs 函数用于将一个响应式对象转换为普通对象,其中每个属性都转换为一个 ref,这样在解构响应式对象时能够保持其响应性。
<template><div><p>姓名: {{ name }}</p><p>年龄: {{ age }}</p></div>
</template><script setup>
import { reactive, toRefs } from 'vue';const person = reactive({name: '王五',age: 30
});const { name, age } = toRefs(person);
</script>
三、组件化开发
1.组件定义与使用
Vue 3 使用 .vue 文件来定义组件,包含 <template>、<script> 和 <style> 三个部分。
<template><div><p>{{ message }}</p><button @click="increment">Increment</button></div>
</template><script>
import { ref } from 'vue';export default {setup() {const message = ref('Hello, Vue 3!');const increment = () => {message.value += '!';};return {message,increment,};},
};
</script><style scoped>
p {color: blue;
}
</style>
使用 <script setup> 定义组件十分便捷,只需在 <script setup> 标签内编写逻辑代码,在 <template> 标签内编写模板内容。
// 子组件 Child.vue
<template><div><p>这是一个子组件</p></div>
</template><script setup>
// 这里可以定义子组件的逻辑
</script>
在父组件中使用子组件时,先导入子组件,然后在模板中直接使用子组件标签即可。
// 父组件 Parent.vue
<template><div><Child /></div>
</template><script setup>
import Child from './Child.vue';
</script>
2.组件通信
-
Props:父组件向子组件传递数据。
-
事件:子组件向父组件传递数据。
父传子
通过 props 实现父组件向子组件传递数据。
// 父组件 Parent.vue
<template><div><ChildComponent :message="parentMessage" /></div>
</template><script setup>
import ChildComponent from './ChildComponent.vue';
const parentMessage = '父组件传递的信息';
</script>
// 子组件 ChildComponent.vue
<template><div><p>{{ message }}</p></div>
</template><script setup>
const props = defineProps(['message']);
</script>
子传父
子组件通过 emit 触发事件向父组件传递数据。
// 子组件 Child.vue
<template><div><button @click="sendDataToParent">传递数据给父组件</button></div>
</template><script setup>
import { defineEmits } from 'vue';const emits = defineEmits(['dataFromChild']);
const sendDataToParent = () => {emits('dataFromChild', '子组件的数据');
};
</script>
// 父组件 Parent.vue
<template><div><Child @dataFromChild="handleDataFromChild" /></div>
</template><script setup>
import Child from './Child.vue';const handleDataFromChild = (data) => {console.log('接收到子组件的数据:', data);
};
</script>
兄弟组件通信
兄弟组件通信通常借助事件总线或状态管理库(如 Pinia)来实现。事件总线可以通过创建一个空的 Vue 实例来作为事件中心,兄弟组件通过这个实例来触发和监听事件。使用 Pinia 时,将共享的数据存储在 Pinia 的 store 中,兄弟组件都可以访问和修改这个 store 中的数据。
3.插槽
匿名插槽
父组件可以在子组件标签内插入内容,子组件通过 <slot> 标签渲染这些内容。
// 父组件 Parent.vue
<template><div><ChildComponent><p>这是插入到子组件的匿名插槽内容</p></ChildComponent></div>
</template><script setup>
import ChildComponent from './ChildComponent.vue';
</script>
// 子组件 ChildComponent.vue
<template><div><slot></slot></div>
</template><script setup>
</script>
具名插槽
父组件可以通过 template 标签和 #name 语法指定插槽名称,子组件通过 <slot name="xxx"> 渲染对应的内容。
// 父组件 Parent.vue
<template><div><ChildComponent><template #header><h1>这是头部插槽内容</h1></template><template #content><p>这是内容插槽内容</p></template></ChildComponent></div>
</template><script setup>
import ChildComponent from './ChildComponent.vue';
</script>
// 子组件 ChildComponent.vue
<template><div><slot name="header"></slot><slot name="content"></slot></div>
</template><script setup>
</script>
四、生命周期管理
在 <script setup> 中,可以方便地使用各种生命周期钩子函数,这些钩子函数在组件的不同阶段被调用。
<template><div><p>组件内容</p></div>
</template><script setup>
import { onMounted, onUpdated, onUnmounted } from 'vue';onMounted(() => {console.log('组件已挂载');
});onUpdated(() => {console.log('组件已更新');
});onUnmounted(() => {console.log('组件已卸载');
});
</script>
onMounted 在组件挂载完成后调用,可用于初始化数据、获取 DOM 元素等操作;onUpdated 在组件更新后调用,可用于在数据更新后执行一些额外的逻辑;onUnmounted 在组件卸载时调用,可用于清理定时器、解绑事件等操作。
五、计算属性与监听器
1.计算属性
计算属性是基于响应式数据的缓存值,只有当它所依赖的响应式数据发生变化时才会重新计算。
<template><div><p>原始数字: {{ number }}</p><p>加倍后的数字: {{ doubleNumber }}</p></div>
</template><script setup>
import { ref, computed } from 'vue';const number = ref(10);
const doubleNumber = computed(() => number.value * 2);
</script>
在这个例子中,doubleNumber 是一个计算属性,依赖于 number 的值。当 number 变化时,doubleNumber 会自动重新计算。
2.监听器
监听器用于监听响应式数据的变化,并在数据变化时执行相应的操作。
<template><div><input v-model="inputValue" /></div>
</template><script setup>
import { ref, watch } from 'vue';const inputValue = ref('');
watch(inputValue, (newValue, oldValue) => {console.log('新值:', newValue, '旧值:', oldValue);
});
</script>
上述代码中,通过 watch 监听 inputValue 的变化,当 inputValue 改变时,会在控制台打印出新值和旧值。
六、指令系统
1.内置指令
v-model
v-model 用于表单元素的双向数据绑定,使得表单元素的值与响应式数据保持同步。
<template><div><input v-model="inputText" /><p>输入的内容: {{ inputText }}</p></div>
</template><script setup>
import { ref } from 'vue';const inputText = ref('');
</script>
v-if、v-else、v-else-if
这些指令用于条件渲染,根据表达式的真假来决定是否渲染相应的内容。
<template><div><p v-if="isShow">显示的内容</p><p v-else>不显示的内容</p></div>
</template><script setup>
import { ref } from 'vue';const isShow = ref(true);
</script>
v-for
v-for 用于列表渲染,通过遍历数组或对象来渲染多个元素。
<template><div><ul><li v-for="(item, index) in list" :key="index">{{ item }}</li></ul></div>
</template><script setup>
import { ref } from 'vue';const list = ref(['苹果', '香蕉', '橙子']);
</script>
v-bind
v-bind 可以缩写为 :,用于动态绑定 HTML 属性,使属性值根据响应式数据的变化而变化。
<template><div><img :src="imageUrl" :alt="imageAlt" /></div>
</template><script setup>
import { ref } from 'vue';const imageUrl = ref('path/to/image.jpg');
const imageAlt = ref('描述图片');
</script>
v-on
v-on 可以缩写为 @,用于绑定事件监听器,当事件触发时执行相应的函数。
<template><div><button @click="handleClick">点击我</button></div>
</template><script setup>
const handleClick = () => {console.log('按钮被点击了');
};
</script>
2.自定义指令
自定义指令可以扩展 Vue 的功能,通过 directive 函数来定义。
<template><div><input v-focus /></div>
</template><script setup>
import { directive } from 'vue';const vFocus = directive('focus', {mounted(el) {el.focus();}
});
</script>
上述代码定义了一个自定义指令 v-focus,当组件挂载时,会自动将焦点设置在使用该指令的输入框上。
七、状态管理(Pinia)
Vue 3 推荐使用 Pinia 作为状态管理库。
1.安装与引入
首先通过 npm install pinia 安装 Pinia,然后在 main.js 中引入并使用:
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import App from './App.vue';const pinia = createPinia();
const app = createApp(App);
app.use(pinia);
app.mount('#app');
2.创建 Store
使用 defineStore 函数定义一个 store,用于存储和管理应用的状态。
// store/counter.js
import { defineStore } from 'pinia';export const useCounterStore = defineStore('counter', {state: () => ({count: 0}),actions: {increment() {this.count++;}}
});
3.在组件中使用 Store
在组件中通过 useCounterStore 函数来访问和使用 store 中的状态和方法。
<template><div><p>计数器: {{ counterStore.count }}</p><button @click="counterStore.increment">增加</button></div>
</template><script setup>
import { useCounterStore } from './store/counter.js';const counterStore = useCounterStore();
</script>
八、路由管理(Vue Router)
1.安装与配置
通过 npm install vue-router 安装 Vue Router,然后在 router/index.js 中配置路由:
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'const router = createRouter({// 配置使用history模式history: createWebHistory(import.meta.env.BASE_URL),// 定义路由规则routes: [{path: '/', // 路由名称name: 'home',component: HomeView // 同步组件},{path: '/about',name: 'about',// route level code-splitting// this generates a separate chunk (About.[hash].js) for this route// which is lazy-loaded when the route is visited.component: () => import('../views/AboutView.vue') // 异步组件}]
})export default router
2.动态路由和嵌套路由
-
动态路由:通过
:id定义动态路径参数。 -
嵌套路由:通过
children定义嵌套路由。
const routes = [{path: '/user/:id',component: User,children: [{ path: 'profile', component: Profile },{ path: 'posts', component: Posts },],},
];
3.在 main.js 中引入路由
在 main.js 中引入配置好的路由:
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'const app = createApp(App)app.use(router)app.mount('#app')
3.在组件中使用路由
在组件中可以使用 router-link 来创建导航链接,使用 router-view 来显示当前路由对应的组件。
<script setup>
// RouterLink是一个组件
// RouterView也是一个组件
import { RouterLink, RouterView } from 'vue-router'
</script><template><!-- 配置路由出口 --><nav><router-link to="/">Home</router-link><router-link to="/about">About</router-link></nav><main><router-view></router-view></main>
</template><style scoped>
nav {display: flex;width: 200px;
}
nav a {flex: 1;
}
main {width: 400px;height: 200px;border: 1px solid #ccc;
}
</style>
九、性能优化
1 懒加载
-
组件懒加载:使用
defineAsyncComponent或import()动态加载组件。 -
路由懒加载:使用
import()动态加载路由组件。
const Home = defineAsyncComponent(() => import('./views/Home.vue'));
2 代码拆分
-
使用 Webpack 或 Vite 的代码拆分功能,将代码分割成多个 chunk。
3 缓存组件
-
使用
<keep-alive>缓存组件状态,避免重复渲染。
<keep-alive><router-view />
</keep-alive>
4.Teleport
- 传送内容到DOM的不同位置:允许你把组件的内容“传送”到应用程序中的任意位置,而不受组件层级结构的限制。这对于模态框、提示信息等场景特别有用。
<teleport to="body"><!-- 这里的内容会被插入到 body 元素中 --><div id="modal">...</div>
</teleport>
5.Transition 组件增强
TransitionGroup 和 Transition:提供了更强大的过渡效果控制,包括列表动画等功能。
6. Suspense
- 异步组件加载:允许你在等待异步依赖(如从服务器获取数据)时展示占位符内容,直到所需资源准备好为止。
<suspense><template #default><AsyncComponent /></template><template #fallback>Loading...</template>
</suspense>
十、最佳实践
1 组件设计
-
单一职责:每个组件只负责一个功能。
-
Props 验证:使用
props的type和validator进行数据验证。
export default {props: {message: {type: String,required: true,validator: (value) => value.length > 0,},},
};
2 代码风格
-
使用组合式 API 组织逻辑。
-
使用
ref和reactive定义响应式数据。 -
使用
computed和watch处理复杂逻辑。
3 错误处理
-
使用
try...catch捕获异步错误。 -
使用全局错误处理函数捕获未处理的异常。
app.config.errorHandler = (err, vm, info) => {console.error('Global error:', err);
};
十一、 工具链
1 Vite
Vite 是 Vue 3 的推荐构建工具,支持快速开发和热更新。
2 Vue DevTools
Vue DevTools 是浏览器扩展,用于调试 Vue 应用。
十二、测试
1 单元测试
使用 Jest 或 Vitest 进行单元测试。
import { mount } from '@vue/test-utils';
import MyComponent from './MyComponent.vue';test('renders correctly', () => {const wrapper = mount(MyComponent);expect(wrapper.text()).toContain('Hello, Vue 3!');
});
2 端到端测试
使用 Cypress 进行端到端测试。
describe('MyComponent', () => {it('renders correctly', () => {cy.visit('/');cy.contains('Hello, Vue 3!');});
});
十三、TypeScript 支持
- 内置对 TypeScript 的友好支持:包括类型推断、类型检查以及更好的开发体验。Composition API 特别适合 TypeScript,因为它提供了更明确的类型定义。
<template><p>{{ message }}</p>
</template><script setup lang="ts">
import { ref } from 'vue';const message = ref<string>('Hello, Vue 3 with TypeScript!');
</script>
相关文章:
Vue3学习总结
一、Vue 3 基础搭建与核心语法 1.创建 Vue 3 应用 在项目的入口文件 main.js 中,通过以下代码创建 Vue 3 应用实例: import { createApp } from vue; import App from ./App.vue;const app createApp(App); app.mount(#app); 这几行代码的作用是引入…...
Type-C双屏显示器方案
在数字化时代,高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步,一款结合了便携性和高效视觉输出的设备——双屏便携屏,逐渐崭露头角,成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…...
【读书与思考】焦虑与内耗
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 导言 今天一个朋友和我说,最近比较焦虑和内耗,无心工作和学习,我问他你焦虑内耗的时候,时间主要花在哪了,他告诉我说主要花在看有关移…...
基于python的网页表格数据下载--转excel
基于 Python 的网页表格数据爬取与下载:以维基百科为例 目录 基于 Python 的网页表格数据爬取与下载:以维基百科为例1. 背景介绍2. 工具与环境3. 操作步骤1. 获取网页内容2. 定位表格元素3. 表格变身 Pandas DataFrame4. 检查数据,收工!5. 进阶玩法与优化6. 完整代码4. 结果…...
Vue.js开发入门:从零开始搭建你的第一个项目
前言 嘿,小伙伴们!今天咱们来聊聊 Vue.js,一个超火的前端框架。如果你是编程小白,别怕,跟着我一步步来,保证你能轻松上手,搭建起属于自己的第一个 Vue 项目。Vue.js 可能听起来有点高大上&#…...
LS1046+XILINX XDMA PCIE调通
欢迎点赞收藏,欢迎私下讨论技术,分享技术 硬件平台 :NXP LS1046 XILINX FPGA 软件平台:LINUX 4.19.68 buildroot LS1046 PEX3 接 XILINX FPGA,linux使用designware的PCI主控制器。下载XILINX DMA驱动,解…...
HarmonyOS:@LocalBuilder装饰器: 维持组件父子关系
一、前言 当开发者使用Builder做引用数据传递时,会考虑组件的父子关系,使用了bind(this)之后,组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题,引入LocalBuilder装饰器。…...
YOLOv10-1.1部分代码阅读笔记-downloads.py
downloads.py ultralytics\utils\downloads.py 目录 downloads.py 1.所需的库和模块 2.def is_url(url, checkFalse): 3.def delete_dsstore(path, files_to_delete(".DS_Store", "__MACOSX")): 4.def zip_directory(directory, compressTrue, ex…...
计算机图形学【绘制立方体和正六边形】
工具介绍 OpenGL:一个跨语言的图形API,用于渲染2D和3D图形。它提供了绘制图形所需的底层功能。 GLUT:OpenGL的一个工具库,简化了窗口创建、输入处理和其他与图形环境相关的任务。 使用的函数 1. glClear(GL_COLOR_BUFFER_BIT |…...
基于django中医药数据可视化平台(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,中医药管理平台当然不能排除在外。中医药数据可视化平台是在实际应用和软件工程的开发原理之上,运用Python语言、ECharts技术、…...
kafka消费堆积问题探索
背景 我们的商城项目用PHP写的,原本写日志方案用的是PHP的方案,但是,这个方案导致资源消耗一直降不下来,使用了20个CPU。后面考虑使用通过kafka的方案写日志,商城中把产生的日志丢到kafka中,在以go写的项目…...
Vue.js 使用插槽(Slots)优化组件结构
Vue.js 使用插槽(Slots)优化组件结构 今天我们聊聊 Vue.js 的一个超实用功能——插槽(Slots)。插槽是 Vue 组件开发中的神器,用好它,你可以让组件变得更灵活、更可复用,还能写出优雅的代码结构…...
Broker如何进行定时心跳发送和故障感知
1.前言 此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》,我本人觉得这个作者还是不错,都是从场景来进行分析,感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔…...
网络安全设备主要有什么
网络安全设备指的肯定是硬件设备了,国内卖安全硬件的没几家,天融信,启明星辰,绿盟,深信服,就这四家卖的比较齐全吧,上它们官网看一下,就知道市面上主要的网络安全设备有哪些了。分类…...
Android Framework WMS全面概述和知识要点
一、概述 定义与作用 在 Android 系统中,WindowManagerService(WMS)就像是一个大管家,负责管理整个系统的窗口界面。它是 Android Framework 的核心组件之一,处于 system_server 进程内,在 Framework 层占…...
记一次某红蓝演练经历
在某天接到任务,对xxx进行一次红蓝演练,于是把自己渗透过程给记录下来,漏洞关键地方也会打码,希望各位大佬理解,菜鸡一枚,勿喷/(ㄒoㄒ)/~~ 概述 拿到目标域名第一件事就是信息收集,曾经一位大…...
一个运行在浏览器中的开源Web操作系统Puter本地部署与远程访问
文章目录 前言1.关于Puter2.本地部署Puter3.Puter简单使用4. 安装内网穿透5.配置puter公网地址6. 配置固定公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击跳转到网站…...
【零基础入门Go语言】struct 和 interface:Go语言是如何实现继承的?
提到面向对象编程中的继承,许多人脑海中可能会浮现出 Java、C 等语言中那一套熟悉的类继承体系。然而,Go 语言作为一门别具一格的编程语言,并没有遵循传统的继承模式。那么,在 Go 语言的世界里,它是怎样实现类似于继承…...
麦田物语学习笔记:实现拖拽物品交换数据和在地图上生成物品
基本流程 1.代码思路 (1)InventoryUI的PlayerSlots与PlayerBag里一一对应,所以想要实现交换数据实际上是,先拿到被拖拽的物体所对的Slot的序号和目标的Slot序号,然后将这两个序号对调一下 (2)物品交换的数据逻辑应该在InventoryManager里去调用,因为InventoryManager里管理了p…...
一些计算机零碎知识随写(25年1月)-1
我原以为世界上有技术的那批人不会那么闲,我错了,被脚本真实了。 今天正隔着画画呢,手机突然弹出几条安全告警通知。 急忙打开服务器,发现问题不简单,直接关服务器重装系统..... 首先,不要认为小网站&…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...
Linux入门(十五)安装java安装tomcat安装dotnet安装mysql
安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了,系统很多命…...
