Vue:Vue+TS学习笔记

文章目录

    • 前文
    • Vue 3
      • 学习 Vue3 的重要性
      • 变更内容
    • 底层逻辑
      • 选项式 API 和组合式 API
      • 体验组合式 API
      • 很多钩子
      • 组件通信
    • 和 TS 结合开发
      • 为什么要用 TS?
    • 正式上手 Vue+ts 开发
      • 给 ref 添加类型标记。
      • ref, reactive, computed 综合代码
      • 模板引用类型
      • 传值写法
    • 解决问题: 第三方包想要有类型约束怎么办?
    • Pinia
    • 附录
      • 莫名其妙的报错

前文

WEB 002 VUE-01

本教程相比上一个的 TS 教程成熟了很多, 优势在于

  1. 有一个大的 md 文件作为课件, 这样的话就避免了写代码浪费太多时间和讲的时候出现之前思路比较混乱的问题。
  2. 提高了录屏质量, 录屏卡顿现象有所减少, 看起来会更加直观舒服。
  3. 本机的配置, 之前的大写提示被关掉了, 所以不会因为大写提示导致大写字母没有办法被正常、快速地打出来
  4. 插件的变更, 这一次把彩虹屁插件关掉了
  5. Code 的变更, 这一次背景换成了 YOASOBI 的背景, 对比度会更高, 更加适合观看。

所以这一个教程的质量将会有提升, 同时依然满足了速成的要求。

录制视频不仅是传递知识和解法, 也是对于 Up 自身的一个挑战和知识的再加强, 所以如果有任何不懂的地方, 尤其是视频没有讲清楚的地方, 欢迎私信问 Up 主, Up 主会尽力给出一个可用的解法。然后 TypeScript 部分也是如此, 有任何觉得讲的不到位的地方, 欢迎私信, 会给出可用的解决方法。

Vue 3

首先, 我们会用一定时间了解一下 Vue3 的新内容和新特点, 帮助快速上手 Vue 3。

学习 Vue3 的重要性

一句话, Vue2 已经 EOL 了, 所以必须要学习 Vue3。

变更内容

具体变更内容: 组合式 API,新钩子setup(), 用reactiveref函数声明响应式变量。

剩余如watch监听器, computed计算属性写法都会有变化, 但是作用不变。

生命周期钩子也有一定的变化, 主要还是写法的变化。且有因为在大部分时候不需要用到this关键字, 所以模板引用也会有变化。

接下来就是组件间的传值语法也有一定变化。

templatestyle则没有太多变化, 不需要记忆太多。

配套的工程化工具亦进行了更新
如 Pinia。因此我们不会涉及到 Vuex, 反之, 会讨论 Pinia。
Pinia 作为一个状态管理工具, 更加高效精简, 更加易于维护。

此外, Vue2 是 Webpack 给项目进行一个打包, 而 Vue3 则会用 Vite。

  • Vue2 的 Vue-cli, 使用 vue-cli 时, 可以通过简单的命令(如 vue create project-name)来创建一个新的 Vue 项目。
    Vue-cli 内部集成了 webpack, 并且已经配置好了基本的 webpack 打包规则。这意味着当你使用 vue-cli 创建一个新的 Vue 项目时,你实际上也在使用 webpack 来构建和打包你的项目。
    而 Vite 是一个由原生 ESM 驱动的 Web 开发构建工具。 总之速度就是有一个很大的提高。

底层逻辑

底层 API 变化: Vue2 响应式实现依赖于object.defineProperty()。但是有相当的效率问题。例子:

data(){return{name: 'Inkka',age: 17}
}

时代局限: Vue2 创造时只有这一个方法可以劫持数据。

但是在 ES6 后 JS 新增了一个方法 Proxy(), 所以提高了性能。

语言支持: Vue2 底层源码使用 JavaScript 编写, 而 Vue3 则使用 TypeScript 编写, 理所应当地, Vue 3 增强了对于 TS 的支持。

Diff 算法: Vue3 的 diff 算法和 vue2 不一样的, 参考专门的专栏。

打包后更小的体积: 更好的 TreeShaking。

选项式 API 和组合式 API

选项式 API

<script>
data(){created(){}methods:{async method123(){...}}
}
</script>

先装一个插件, Vue VSCode Snippets, 这个插件将大大提高我们写代码的效率。

我们开始创建一个项目

vue2 命令

vue create ...

vue3 命令

npm init vue@latest

选项

Ok to proceed
Add TypeScript >> No
Add JSX Support >> No
Add Vue Router... >> No
Add Pinia... >> No
Add Vitest... >> No
Add Testing Solution... >> No
Add DevTools.. >> No

打开Package.json, 命令是npm run dev

然后我们npm i一下, 因为这个文件并没有 node_modules。

简单地看一看文件架构, 看看有什么变化?

Vue 2

import Vue from 'vue'
new Vue({render: h => h(App)
}).$mount('#app')//Or
new Vue({el: '#app'render: h => h(App)
})

Vue 3

import { createApp } from "vue";
createApp(App).mount("#app");

Vue 3 的代码布局:

<template><header></header><main></main>
</template>
<script></script>
<style></style>

体验组合式 API

首先我们用选项式 API 写一个计数器, 然后用组合式 API 再写一下。

<script></script>
<template><div class="box"><button class="my-button" @click="addCount">result {{ count }}</button></div>
</template><style scoped>
.box {display: flex;justify-content: center;align-items: center;height: 100vh;padding: 20px;
}.my-button {display: inline-block;text-align: center;vertical-align: middle;padding: 15px 32px;text-decoration: none;font-size: 16px;font-weight: 500;border-radius: 4px;border: none;cursor: pointer;background-color: #4caf50;color: white;transition: background-color 0.3s ease;&:hover {background-color: #45a049;}&:active {background-color: #388e3c;}
}
</style>

优势: 所有业务逻辑都写在一个地方, 不用在data,method内找了, 逻辑集中带来了极好的提升。

当然, beforeCreate()依然可以写在 Vue 3 内, 我们顺便看看setup的时机。

体验 Setup 语法糖

<script setup>
import { ref } from "vue";
const count = ref(0);
const printCount = () => {count.value++;
};
</script>

computed 语法变化

computed:{testExample(){return this.example * 114514}
}

新语法:

const homoCount = computed(() => {return objCount.value.count * 114514;
});

监视数据- Watch

watch(objCount, (newVal, oldVal) => {console.log(`值从${oldVal}变成了${newVal}`);
});

监听多个内容

const objCount = ref(0);
const age = ref(114);watch([objCount, age],(newVal, oldVal) => {console.log(`值从${oldVal}变成了${newVal}`);},{ immediate: true }
);

深度监听

import { ref, watch } from "vue";
const objCount = ref({count: 0,
});watch(objCount,(newVal, oldVal) => {console.log(oldVal);console.log(newVal);},{ deep: true }
);

用深度克隆解决问题(供参考)

import { ref, watch } from "vue";
const objCount = ref({count: 0,
});let oldState = JSON.parse(JSON.stringify(objCount.value));watch(objCount,(newVal) => {console.log(oldState);console.log(newVal);oldState = JSON.parse(JSON.stringify(newVal));},{ deep: true }
);

很多钩子

beforeMount = > onBeforeMount, mounted => onMounted, beforeUpdate => onBeforeUpdate,
updated => onUpdated, beforeDestroy => onBeforeUnmount, destroyed => onUnmounted

体验语法

<script setup>
import { ref, onMounted, onBeforeMount, onBeforeUpdate, onUpdated } from "vue";const count = ref(0);onBeforeMount(() => {console.log("onBeforeMount");
});
onMounted(() => {console.log("onMounted");
});
onBeforeUpdate(() => {console.log("onBeforeUpdate");
});
onUpdated(() => {console.log("onUpdated");
});
</script>

注意一点, 这个视频中未提及到:

生命周期钩子可以执行多次, 按照顺序执行。

<scirpt setup>
import { onMounted } from 'vue'onMounted(()=>{})onMounted(()=>{})
</script>

利点: 如果一个钩子内逻辑很复杂, 改起来很烦, 可以写一个新的。

组件通信

子组件例子:

<template><div class="component01">component01</div>
</template><script setup></script><style scoped>
.component01 {display: flex;flex-direction: column;align-items: center;justify-content: center;height: 200px;width: 300px;padding: 20px;border-radius: 10px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);background-color: #f8f9fa;color: rgb(0, 191, 255);text-align: center;font-size: 24px;font-weight: bold;position: relative;overflow: hidden;
}
</style>

vue2 写法

$emit('example','content')//父组件
@example="Method"//script
const Method = (val) =>{console.log(val)
}

案例代码(子组件内)

 <button @click="sendMsg">SendMsg</button>

成品代码(父组件给子组件传值)

父组件

<script setup>
import ComponentsTest01 from "./components/ComponentsTest01.vue";
import { ref } from "vue";
const msg = ref("父组件的数据");
</script><template><div class="box"><h2>父组件</h2><ComponentsTest01 :msg="msg"></ComponentsTest01></div>
</template>

子组件

<template><div class="component01">子组件<p>接受的内容:{{ msg }}</p></div>
</template><script setup>
defineProps({msg: {type: String,required: true,},
});
</script>

成品代码(子组件给父组件传值)

父组件:

<script setup>
import ComponentsTest01 from "./components/ComponentsTest01.vue";const getMsg = (val) => {console.log(val);
};
</script><template><div class="box"><h2>父组件</h2><ComponentsTest01 @send-msg="getMsg"></ComponentsTest01></div>
</template>

子组件:

<template><div class="component01">子组件<p>接受的内容:{{ msg }}</p><p>传值!</p><button @click="sendMsg">SendMsg</button></div>
</template><script setup>
defineProps({msg: {type: String,required: true,},
});const emit = defineEmits(["send-Msg"]);
const sendMsg = () => {emit("send-Msg", "新消息!");
};
</script>

ref 的写法

父组件

<script setup>
import {ref} from 'vue'
import ComponentsTest01 from './components/ComponentsTest01.vue';const test = ref(null)const getSonMethod = () =>{console.log(test.value.newMsg)test.value.logMsg()
}</script><template><div class="box"><h2>父组件</h2><ComponentsTest01 ref="test"></ComponentsTest01><button @click="getSonMethod">检查打印结果</button></div>
</template><style scoped>
</style>

子组件

<template><div class="component01">子组件<p>接受的内容:{{ msg }}</p><p>传值!</p><button @click="sendMsg">SendMsg</button></div>
</template><script setup>
import { ref } from "vue";defineProps({msg: {type: String,required: true,},
});const emit = defineEmits(["send-Msg"]);
const sendMsg = () => {emit("send-Msg", "新消息!");
};const newMsg = ref("Sehr Gut!");const logMsg = () => {console.log(newMsg.value);
};defineExpose({newMsg,logMsg,
});
</script>

注: 模板引用

通过ref标识获得真实的dom对象或者组件的实例对象。

案例: 实现聚焦
模板代码

<template><input ref="autoFocusInput" v-model="inputValue" placeholder="请输入内容" />
</template>

Provideinject实现组件之间传值

App.vue

<script setup></script><template><div class="box"><h2>祖先组件</h2></div>
</template><style scoped>
.box {display: flex;justify-content: center;align-items: center;height: 100vh;padding: 20px;
}
</style>

ComponentsTest02.vue [孙组件]

<script setup></script>
<template><div class="son"><h2>孙子组件</h2></div>
</template><style scoped>
.son {padding: 51px;border: 1px solid pink;
}
</style>

ComponentsTest03.vue [父组件]

<script setup>
</script><template><div class="father"><h2>父组件</h2></div>
</template><style scoped>
.father {padding: 114px;border: 1px solid greenyellow;
}
</style>

和 TS 结合开发

为什么要用 TS?

静态类型检查可以提前第发现代码错误, 加了类型只要不符合规范就会报错, 提前地发现错误。

我们用新的命令去创建 TS 项目。

npm create vite@latest 项目名 -- --template vanilla-ts

用最新的 vite 版本来创建一个以原生 TypeScript 为模板的项目。

我们简单地审视文件, 可以看到依然没有 node modules, 所以我们需要自己装一下

npm i

清空对应文件, 写一些测试代码

let test03: number = 114514;
console.log(test03);

让每个文件都是一个单独的模块

export {};

体验 TS 接口, 接口如何处理对象多个层级的情况。
例子:

const uta = {id: 1,producer: "harumakigohan",info: {title: "メルティランドナイトメア",lyrics: "Welcome to the MeltyLand",},
};

请用接口帮助完成类型的注解。

用断言帮助智能提示:

const TestId = document.getElementById("#test") as HTMLImageElement;

正式上手 Vue+ts 开发

npm create vite@latest 项目名 -- --template vue-ts

创建一个以 vue-ts 为模板的项目

接下来会让你 select 一个框架, 选择 vue 即可, 后面 variant 依然选 TypeScript。

给 ref 添加类型标记。

const year = ref<string | number>(1145)

ref, reactive, computed 综合代码

computed 不用手动添加类型, 会自动地推到出来。

处理复杂类型

[{ id: "001", name: "USD", rate: 1 },{ id: "002", name: "RUB", rate: 90 },{ id: "003", name: "KZT", rate: 440 },{ id: "004", name: "SGD", rate: 1.3 },
];

请筛选出大于 60 的。

const newList = computed(() => {return Currency.filter((el) => el.rate > 60);
});

触发事件时的类型

需求: 请输入文本同时在控制台输出输入的内容。

<input type="text" placeholder="文本测试" @change="inputChange">

需求: 当点击按钮时, 请输出按钮对应的内容=> 按钮内容

<button @click="Click">按钮内容</button>

模板引用类型

还是经典案例, 我们实现聚焦工作。
下文是原来的版本:

<template><input ref="autoFocusInput" v-model="inputValue" placeholder="请输入内容" />
</template><script setup>
import { ref, onMounted, nextTick } from "vue";const inputValue = ref("");const autoFocusInput = ref(null);onMounted(async () => {await nextTick();if (autoFocusInput.value) {autoFocusInput.value.focus();}
});
</script>

案例代码:

父组件

<template><div><ComponentsTest01></ComponentsTest01></div>
</template><script setup lang="ts">
import ComponentsTest01 from "./components/ComponentsTest01.vue";
</script>

子组件

<template><div><p>Message: {{ message }}</p><button @click="logMessage">Log It</button></div>
</template><script lang="ts" setup>
import { ref } from "vue";const message = ref("Hello from LogMsg");
const logMessage = () => {console.log(message.value);
};
</script>

父组件

<!-- ParentComponent.vue -->
<template><div><ComponentsTest01 ref="logMsgRef"> </ComponentsTest01><button @click="callLogMessage">Call Log Message from Parent</button></div>
</template><script lang="ts" setup>
</script>

提示: 空值处理(null), 一般地, 我们有很多处理方法, 一种就是用?可选链运算符,
还有就是用 if 语句, 如上文例子, 也就是逻辑判断

if (logMsgRef.value) {logMsgRef.value.logMessage();
}

当然, 也可以用非空断言运算符, 加一个!即可, 但是不建议。

传值写法

继续基于原来的代码

提示:
好处: 报错提前, 有智能提示

defineProps({msg: {type: String,required: true,},
});
type Props = {...
}

添加默认值

withDefaults即可。

withDefaults(第一个参数: defineProps 内容, 第二个参数: 默认值配置项)

const props = withDefaults(defineProps<Currency>(), {value: "200",
});

子传父例

提示:
好处: 报错提前, 有智能提示

type Emits = {(e: "msg", msg: string): void;
};
const Emit = defineEmits<Emits>();
const handleClick = () => {Emit("msg", "testVal");
};

解决问题: 第三方包想要有类型约束怎么办?

npm i --save-dev @types/jquery

自己写类型文件

export type Currency = {name: string;
};

Pinia

新变化: 更加符合直觉, 去掉了 mutation。提供组合式风格 API, 去掉了 Modules 的概念, 自动地分配模块。对于 TypeScript 更加友好

npm install pinia
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");

vuex 定义仓库

const store = createStore({//...
});

pinia

import { defineStore } from "pinia";
defineStore("counter", () => {});
import { defineStore } from "pinia";// 你可以任意命名 `defineStore()` 的返回值,但最好使用 store 的名字,同时以 `use` 开头且以 `Store` 结尾。
// (比如 `useUserStore`,`useCartStore`,`useProductStore`)
// 第一个参数是你的应用中 Store 的唯一 ID。
export const useAlertsStore = defineStore("alerts", {// 其他配置...
});

state 被定义为一个返回初始状态的函数

actions => methods

getters => computed函数模拟

const doubleCount = computed(() => {return count.value * 2;
});

附录

莫名其妙的报错

莫名其妙的报错指编辑器总是说找不到文件/对应的类型声明, 这个时候修改 tsconfig 就很重要了。然后重新启动(npm run dev)直接用下面的即可, 假如依然不行, 私信联系 UP 主即可, 因为还有几个对策, 但是没有写出来。

vue 文件的类型声明 shims-vue.d.ts

declare module "*.vue" {import { DefineComponent } from "vue";const component: DefineComponent<{}, {}, any>;export default component;
}
{"compilerOptions": {"target": "esnext","module": "esnext","strict": true,"jsx": "preserve","moduleResolution": "node","resolveJsonModule": true,"esModuleInterop": true,"skipLibCheck": true,"forceConsistentCasingInFileNames": true,"baseUrl": ".","paths": {"@/*": ["src/*"]},"types": ["vite/client"]},"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
}

接下来我们将做一个简单的项目, 来强化知识点。

项目实战我们因为时间关系, 所以做一个简单的小程序, 就是查汇率, 查看新闻的一个简单程序
这个项目其实是不够过关的, 所以建议之后学习如聊天 app, 还有传统的如人资后台, 外卖软件等等。
那么在 Up 主以后有需要做这样的项目时, Up主也会录出来 有可能是一个论坛+博客网站 但是后端肯定是基于 go 的。

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

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

相关文章

ACwing—01背包(暴力bfs+dp+递归+记忆化搜索算法)

问题 有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&#xff0c…

洛谷 P2801 教主的魔法 题解

之前学过 莫队 算法&#xff0c;其运用了分块思想&#xff1b;但是我居然是第一次写纯种的分块题目。 题意 给你一个长度为 n n n 的序列 a a a&#xff08;一开始 ∀ a i ∈ [ 1 , 1000 ] \forall a_i\in[1,1000] ∀ai​∈[1,1000]&#xff09;。要求执行 q q q 次操作&…

leetcode 75.颜色分类(荷兰国旗问题)

题目描述 题目分析 本题是经典的「荷兰国旗问题」&#xff0c;由计算机科学家 Edsger W. Dijkstra 首先提出。 要想单独解决这道题本身还是很简单的&#xff0c;统计0、1、2的数量然后按顺序赋值&#xff0c;或者手写一个冒泡排序&#xff0c;whatever。 但是在这一题中我们主…

rc4算法简单介绍及实现

0. 介绍 RC4是一种流密码&#xff0c;但因为安全性问题已经被弃用。 1. 算法描述 1.1 初始化 Key为生成的随机密钥&#xff1a;1-256B S为一数组&#xff1a;256B T为辅助数组&#xff1a;keylenB for (int i 0;i < 256;i) {S[i] i;T[i] S[i % keylen]; }1.2 初始化…

OpenEuler20.3 安装 Elasticsearch7.17

1、下载elasticsearch wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.17-linux-x86_64.tar.gz wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.17-linux-x86_64.tar.gz.sha512 shasum -a 512 -c elasticsea…

单元测试知识总结

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是单元测试&#xff1f; 单元测试是指&#xff0c;对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&#xff0c;这里的…

python爬虫笔记(一)

文章目录 html基础标签和下划线无序列表和有序列表表格加边框 html的属性a标签&#xff08;网站&#xff09;target属性换行线和水平分割线 图片设置宽高width&#xff0c;height html区块——块元素与行内元素块元素与行内元素块元素举例行内元素举例 表单from标签type属性pla…

【mysql】centOS7安装mysql详细操作步骤!—通过tar包方式

【mysql】centOS7安装mysql详细操作步骤&#xff01; linux系统安装mysql版本 需要 root 权限&#xff0c;使用 root 用户进行命令操作。使用tar文件包&#xff0c;安装&#xff0c;gz包也可以但是还需要配置用户&#xff0c;tar包虽然大&#xff0c;但是全啊&#xff01; 1. …

[新能源]新能源汽车快充与慢充说明

接口示意图 慢充接口为交流充电口&#xff08;七孔&#xff09;&#xff0c;快充接口为直流充电口&#xff08;九孔&#xff09;。 引脚说明 上图给的是充电口的引脚图&#xff0c;充电枪的为镜像的。 慢充接口引脚说明 快充接口引脚说明 充电流程 慢充示意图 慢充&…

Android第二次面试总结(项目拷打理论篇)

&#xff08;一&#xff09;理论基础 LiveData 和 ViewModel 是 Android 架构组件中的重要部分&#xff0c;它们在构建响应式、生命周期感知的 Android 应用程序中发挥着关键作用。下面分别介绍它们的原理。 LiveData 原理 1. 概述 LiveData 是一种可观察的数据持有者类&…

MyBatis SqlSessionFactory 是如何创建的?

SqlSessionFactory 是 MyBatis 的核心接口之一&#xff0c;它是创建 SqlSession 实例的工厂。 SqlSession 实例是 MyBatis 与数据库交互的主要接口&#xff0c;负责执行 SQL 语句、管理事务等。 SqlSessionFactory 的创建过程主要由 SqlSessionFactoryBuilder 类负责。 SqlSes…

玩转python:通俗易懂掌握高级数据结构-collections模块之Counter

引言 Counter是Python中collections模块提供的一个强大工具&#xff0c;用于统计可哈希对象的出现次数。它非常适合用于频率统计、词频分析、数据聚合等场景。本文将详细介绍Counter的关键用法和特性&#xff0c;并通过8个丰富的案例帮助读者掌握其应用。 关键用法和特性表格 …

DeepSeek面试——分词算法

DeepSeek-V3 分词算法 一、核心算法&#xff1a;字节级BPE&#xff08;Byte-level BPE&#xff0c;BBPE&#xff09; DeepSeek-V3 采用 字节级BPE&#xff08;BBPE&#xff09; 作为核心分词算法&#xff0c;这是对传统 BPE&#xff08;Byte Pair Encoding&#xff09;算法的…

机器学习——正则化、欠拟合、过拟合、学习曲线

过拟合&#xff08;overfitting&#xff09;:模型只能拟合训练数据的状态。即过度训练。 避免过拟合的几种方法&#xff1a; ①增加全部训练数据的数量&#xff08;最为有效的方式&#xff09; ②使用简单的模型&#xff08;简单的模型学不够&#xff0c;复杂的模型学的太多&am…

Python:函数(一)

python函数相关的知识点 1. 函数定义与调用 定义&#xff1a;使用 def 关键字&#xff0c;后接函数名和参数列表。 def greet(name):"""打印问候语&#xff08;文档字符串&#xff09;"""print(f"Hello, {name}!") 调用&#xff1a…

关于Flutter中两种Widget的生命周期详解

目录 一、StatelessWidget 生命周期 二、StatefulWidget 生命周期 1. 创建阶段 2. State初始化阶段 3. 构建阶段 4. 更新阶段 5. 销毁阶段 三、核心对比与常见陷阱 四、面试回答技巧 以下是Flutter中两种核心Widget(StatelessWidget和StatefulWidget)生命周…

Linux 》》Ubuntu 18 LTS 之后的版本 修改IP地址 主机名

进入目录 /etc/netplan 修改 50-cloud-init.yaml 》保存文件后&#xff0c;执行以下命令应用更改&#xff1a; sudo netplan apply 》》 DHCP模式 修改主机名 hostnamectl set-hostname xxxx 修改cloud.cfg 防止重启主机名还原 但测试下来 不修改&#xff0c; 重启 也不会还…

C++基础 [三] - 面向对象三

初始化列表 首先&#xff0c;初始化列表是我们的祖师爷本贾尼博士为了解决在某些成员变量在定义时必须初始化的情况。这个初始化列表其实发生在构造函数之前&#xff0c;也就是实例化整个对象时先对所有的成员都进行了初始化 初始化的概念区分 在之前的博客学习中&#xff…

55年免费用!RevoUninstaller Pro专业版限时领取

今天&#xff0c;我要给大家介绍一款超给力的卸载工具——RevoUninstaller Pro。这是一款由保加利亚团队精心打造的专业级卸载软件&#xff0c;堪称软件卸载界的“神器”。 RevoUninstaller分为免费版和专业版。专业版功能更为强大&#xff0c;但通常需要付费才能解锁全部功能。…

目前人工智能的发展,判断10年、20年后的人工智能发展的主要方向,或者带动的主要产业

根据2025年的最新行业研究和技术演进趋势&#xff0c;结合历史发展轨迹&#xff0c;未来10-20年人工智能发展的主要方向及带动的产业将呈现以下六大核心趋势&#xff1a; 一、算力革命与底层架构优化 核心地位&#xff1a;算力将成为类似“新能源电池”的基础设施&#xff0c;…