当前位置: 首页 > news >正文

Vue 响应式监听 Watch 最佳实践

image.png

一. 前言

上一篇文章我们学习了 watch 的基础知识,了解了它的基本使用方法及注意事项,本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章:

详解 Vue 中 Watch 的使用方法及注意事项icon-default.png?t=O83Ahttps://blog.csdn.net/qq_24956515/article/details/142452530

通过了解,我们知道了 watch 是 Vue 中的是一个强大的功能,可以让我们监听数据的变化并在变化发生时执行相应的操作。在开发 Vue 应用过程中,watch可以帮助我们处理许多实际的应用场景,并实现最佳实践。

在本文中,我们将会深入探讨watch的实际使用场景,并总结最佳实践,以下的场景都是我在实际项目中能够总结的经常使用的,包括但不限于以下内容:

  1. 表单验证:用来监听表单输入框的变化,并对输入的内容进行验证。

  2. 异步操作:用于监听数据的变化,并触发相应的异步操作,比如网络请求等。

  3. 联动操作:监听数据的变化,并在变化时执行相应的联动操作。

  4. 计算属性与watch的结合使用:比较watch和计算属性的区别,以及它们在不同场景下的应用和最佳实践。

  5. 同步多个watch:处理多个watch同时触发的情况,并提供一些同步多个watch的最佳实践建议。

  6. 监听路由参数:使用watch来监听 Vue 路由参数的变化,并根据参数的变化来更新组件的状态或执行相应的操作。

通过详细了解实际使用场景和最佳实践,可以帮助我们更好地理解和运用 Vue 的watch功能,从而提高 Vue 应用的编码灵活性。

二. watch 的实际应用场景

1. 表单验证

Vue 的watch选项在表单验证中有广泛的应用。通过监听表单字段的变化,可以实时检查用户的输入并进行验证。下面是一个简单的示例,展示了如何使用watch实现表单验证:

<template><div><input v-model="username" placeholder="请输入用户名" /><p v-if="usernameError" class="error">用户名不能为空</p><input v-model="password" type="password" placeholder="请输入密码" /><p v-if="passwordError" class="error">密码不能为空</p><button @click="submitForm" :disabled="isInvalid">提交</button></div>
</template><script>
export default {data() {return {username: "",password: "",usernameError: false,passwordError: false,};},watch: {username(value) {this.validateUsername(value);},password(value) {this.validatePassword(value);},},methods: {validateUsername(username) {this.usernameError = username.length === 0;},validatePassword(password) {this.passwordError = password.length === 0;},submitForm() {if (!this.isInvalid) {// 验证通过,提交表单// ...}},},computed: {isInvalid() {return this.usernameError || this.passwordError;},},
};
</script><style>
.error {color: red;
}
</style>

在上述示例中,我们使用了两个watch来监听usernamepassword字段的变化。当用户输入用户名时,会触发username字段的watch回调函数,并调用validateUsername方法进行验证。同理,当用户输入密码时,会触发password字段的watch回调函数,并调用validatePassword方法进行验证。通过设置usernameErrorpasswordError变量来控制错误提示的显示。

submitForm方法中,我们通过isInvalid计算属性来判断表单是否通过验证。只有当isInvalid的值为false时,才允许提交表单。

这样,每当用户输入用户名或密码时,watch会自动调用相应的验证方法,实时检查用户的输入。当用户名或密码为空时,会显示相应的错误提示,如果表单通过了验证,提交按钮就可以点击。

这个示例只是表单验证中的一种简单情况,实际应用中可能会涉及更复杂的验证逻辑。通过使用watch选项,我们可以根据具体需求来构建强大的表单验证功能。

2. 异步操作

Vue 的watch属性可以用于监听数据的变化,并触发相应的异步操作。以下是一个简单的 Vue 异步操作的代码示例:

<template><div><input v-model="inputValue" placeholder="请输入内容" /><div v-if="loading">加载中...</div><div v-else>{{ result }}</div></div>
</template><script>export default {data() {return {inputValue: "",loading: false,result: "",};},watch: {inputValue(newInputValue) {this.loading = true;// 模拟异步操作,比如发送请求setTimeout(() => {// 异步操作完成后更新数据this.loading = false;this.result = this.processData(newInputValue);}, 2000);},},methods: {processData(input) {// 这里可以进行对输入数据的处理return "处理后的结果: " + input;},},};
</script>

在上述代码示例中,我们使用v-model指令将输入框的值与 Vue 实例的inputValue属性进行绑定。然后,通过watch属性监听inputValue的变化,并在变化时触发异步操作。

watch的回调函数中,我们首先将loading设置为true以显示加载中的提示信息。然后,我们模拟了一个异步操作,比如发送请求。在异步操作完成后,我们将loading设置为false,并更新result的值,这个值会根据异步操作的结果而改变。

在这个示例中,我们模拟了一个 2 秒钟的异步操作,处理了输入的数据,并将处理后的结果赋给result。在异步操作进行中,用户会看到"加载中..."的提示信息,当异步操作完成后,会显示处理后的结果。

通过以上的代码示例,我们可以看到 Vue 的watch属性在异步操作中的实际应用。它可以方便我们监听数据的变化,并在变化发生后执行异步操作,从而实现了异步操作的控制与处理。

3. 联动操作

Vue 的watch属性可以用于监听数据的变化,并在变化时执行相应的联动操作。以下是一个简单的 Vue 联动操作的代码示例:

<template><div><input v-model="inputValue" placeholder="请输入内容" /><div><h3>输入内容的长度:</h3><p>{{ inputLength }}</p></div></div>
</template><script>export default {data() {return {inputValue: "",inputLength: 0,};},watch: {inputValue(newInputValue) {// 在输入值变化时更新输入内容的长度this.inputLength = newInputValue.length;},},};
</script>

在这个代码示例中,我们使用v-model指令将输入框的值与 Vue 实例的inputValue属性进行双向绑定。然后,通过watch属性监听inputValue的变化,在变化时更新inputLength的值。

watch的回调函数中,我们将输入值的新值作为参数(newInputValue)传入,并根据新值的长度更新inputLength的值。

在这个示例中,每当用户在输入框中输入内容时,watch会监听到inputValue的变化,并更新inputLength的值,以反映输入内容的长度。

通过以上的代码示例,我们可以看到 Vue 的watch属性在联动操作中的实际应用。它可以方便地监听数据的变化,并执行相应的操作,用于实现多个数据之间的联动效果。例如,在这个示例中,我们实现了输入内容长度与输入值之间的联动,保持了它们的同步更新。

4. 同步多个监听

在 Vue 中,可以使用watch来监听多个数据的变化并进行相应的处理。这种情况下,我们通常称之为同步多个watch

有一个常见场景是表单联动,当表单中的多个字段之间存在关联关系时,可以使用多个watch来实现表单的联动效果。例如,当选择某个选项时,其他选项的可选项列表会相应改变。

<template><div><select-model="selectedCategory"><option value="fruit">水果</option><option value="vegetable">蔬菜</option></select><select v-model="selectedItem"><option v-for="item in items" :key="item.id">{{ item.name }}</option></select></div>
</template><script>
export default {data() {return {selectedCategory: null,selectedItem: null,items: []};},watch: {selectedCategory(newCategory) {// 根据选定的类别获取对应的选项列表this.items = this.fetchItemsByCategory(newCategory);// 重置选中的选项this.selectedItem = null;},selectedItem(newItem) {// 处理选中的选项this.handleSelectedItem(newItem);}},methods: {fetchItemsByCategory(category) {// 根据类别获取对应的选项列表// 在实际项目中,请替换为真正的异步请求// 返回选项列表return [];},handleSelectedItem(item) {// 处理选中的选项// ...}}
};
</script>

在上述示例中,我们使用了两个watch来监听selectedCategoryselectedItem两个数据的变化。当选择的类别Category改变时,第一个watch会重新获取对应类别的选项列表,并重置selectedItem为 null。而当选中的选项selectedItem改变时,第二个watch会执行相应的逻辑处理。

5. 动态路由的处理

Vue 的watch属性在处理动态路由方面也有实际应用场景。比如:路由发生变化时,watch会监听到$route的变化,并执行相应的操作,主要用于处理新的路由信息。以下是一个简单的 Vue 动态路由处理的代码示例:

<template><div><router-view></router-view></div>
</template><script>export default {watch: {$route(newRoute, oldRoute) {// 在路由变化时执行相应的操作console.log("路由变化:", newRoute, oldRoute);// 根据新的路由信息执行其他逻辑this.handleRouteChange(newRoute);},},methods: {handleRouteChange(route) {// 根据路由信息进行处理// 此处仅打印新的路由路径作为示例console.log("新的路由路径:", route.path);},},};
</script>

在这个代码示例中,我们有一个基本的 Vue 组件,使用了 Vue Router 进行路由管理。我们通过<router-view>标签来渲染当前的路由组件。

通过watch属性,我们可以监听 Vue Router 中的$route对象,它包含了当前路由的信息。在$route对象发生变化时,watch回调函数会被触发。

在这个示例中,我们监听了$route,并在路由变化时执行相应的操作。在回调函数中,我们可以获取到新的路由信息(newRoute)和旧的路由信息(oldRoute),并可以根据路由信息执行其他逻辑。

handleRouteChange方法中,我们根据路由信息进行处理。在这个示例中,我们简单地使用console.log来打印新的路由路径。

每当路由发生变化时,watch会监听到$route的变化,并执行相应的操作,比如处理新的路由信息。

通过以上的代码示例,我们可以看到 Vue 的watch属性在动态路由处理方面的实际应用。它可以方便地监听路由的变化,并执行相应的操作,用于处理动态路由相关的逻辑。

三. watch 的最佳实践

Vue 的watch是一个非常有用的功能,它提供了对 Vue 实例的属性或者表达式的侦听器。这个侦听器会在属性或者表达式的值发生变化时触发相应的回调函数。

以下是一些 Vue 中使用watch的最佳实践:

1. 减少回调函数中的复杂逻辑

回调函数应该尽量简洁,遵循单一责任原则。如果需要处理复杂的逻辑,可以将逻辑拆分为单独的方法,然后在回调函数中调用这些方法。

2. 合理使用深度监听

默认情况下,watch是浅监听的,只能监听到对象的引用变化。如果需要监听对象内部的属性变化,可以通过deep选项进行深度监听。

watch: {obj: {handler(newVal, oldVal) {// 对象内部属性的变化},deep: true}
}

watch选项虽然提供了深度监听的功能,可以跟踪嵌套对象或数组的变化。但在使用深度监听时,需要注意以下几点:

  • 性能问题:深度监听会在对象或数组的每个级别都进行递归遍历,因此在嵌套层级较深、数据量较大的情况下,可能会带来性能问题。

  • 深度监听和计算属性:深度监听和计算属性之间存在一些互相影响的问题。由于深度监听会触发对象或数组的所有变化,可能导致计算属性的计算次数过多,从而影响性能。在使用深度监听时,要特别关注计算属性的计算逻辑,以避免不必要的计算。

  • 对象和数组的变化检测:Vue 的响应式系统可以检测到对象或数组的变化,并触发相应的更新。但对于某些特定情况,如直接使用通过索引直接修改数组元素、直接用下标设置对象属性等,Vue 可能无法检测到变化。

  • 引用类型数据的变化:深度监听只能监听引用类型的变化,无法检测到引用类型数据内部属性的变化。例如,对于对象的属性值的变化,Vue 会自动进行侦测和响应。但如果仅修改了属性值,而未修改整个对象的引用,深度监听将无法触发。

深度监听是一种强大的功能,可以用于监听嵌套对象或数组的变化,但在使用时需要注意性能、计算属性、变化检测和引用类型数据的影响。根据具体的场景和需求,灵活地选择使用深度监听或其他替代方案。

3. 避免循环依赖

watch中的依赖关系是自动解析的,但是要注意避免出现循环依赖的情况。当在 watch 选项中监听属性时,如果在回调函数中修改了被监听的属性,可能会导致循环引用的问题。为了避免这种问题,可以在修改属性前检查新旧值是否相等,或者使用 Vue 的this.$nextTick()来推迟执行。

4. 使用immediate选项

immediate选项可以在组件加载时立即执行回调函数一次。这常用于初始化数据或者处理一些需要立即执行的操作。

watch: {foo: {handler(newVal, oldVal) {// 回调函数},immediate: true}
}

5. 使用 watch 配合 computed

computed属性可以根据数据的变化自动更新计算结果,而watch可以用于监听数据的变化并执行相应的副作用操作。可以结合使用这两个功能来实现更复杂的逻辑。

watch: {fullName: {handler(newVal, oldVal) {// 监听computed属性fullName的变化},immediate: true}
},
computed: {fullName() {return this.firstName + ' ' + this.lastName;}
}

6. 合理使用watch

watch 选项可以用于在数据变化时执行一些复杂的逻辑操作,但过度使用 watch 可能会导致性能问题。在不必要的情况下,可以尝试使用计算属性来替代 watch。只在需要监听特定数据变化时使用 watch

因此,虽然 watch虽然是一个强大的功能,但是在不必要的情况下,应该尽量避免过多的使用。因为每个watch都需要消耗一些性能,当watch过多或者逻辑复杂时,可能会导致性能下降。优先考虑使用computed属性来处理需求。

7. 注意异步更新的情况

在 Vue 中,watch选项默认是同步的,即在侦听到数据变化后立即触发回调函数。但有时候我们需要在watch中进行异步操作,例如发送网络请求或执行定时任务等。下面介两种实现异步更新的方法:

  • 使用nextTick方法:可以在watch回调函数中使用$nextTick方法,将操作放入下一次 DOM 更新循环中执行,从而实现异步更新。

watch: {username(newValue) {this.$nextTick(() => {// 异步操作// ...});}
}

this.$nextTick方法接受一个回调函数作为参数,并在下一次 DOM 更新循环中执行该回调函数。这样就可以将需要异步执行的操作放在回调函数内部。

  • 使用setTimeout方法:可以在watch调函数中使用setTimeout方法来延迟执行代码,实现异步更新。

watch: {username(newValue) {setTimeout(() => {// 异步操作// ...}, 0);}
}

通过将代码放入setTimeout回调函数内部,可以以 0 毫秒的延迟将代码放入事件队列中从而实现异步执行。

注意:使用异步更新会使得代码的执行顺序发生变化,可能会导致一些意想不到的问题。确保在异步操作中正确处理所有依赖关系和数据同步,避免出现竞争条件或数据不一致的情况。

另外,对于复杂的异步操作,推荐使用Promiseasync/await等异步编程的方式,以便更好地管理和处理异步逻辑。

总结:虽然watch默认是同步的,但可以通过$nextTicksetTimeout等方式实现异步更新。根据具体需求选择适合的方式来处理异步操作,确保代码的正确性和可维护性。

综上所述,合理使用 Vue 的 watch 选项可以方便地监听数据变化并执行相应的操作。但需要注意避免过度使用、处理循环引用和使用相应的选项来适应不同的需求。

通过遵循以上的最佳实践,可以更好地应用 Vue 的watch功能,提高代码的可读性、可维护性,同时避免潜在的性能问题。

四. 总结

在本篇文章中,我们详细探讨了 Vue 的watch功能的实际使用场景和最佳实践。了解和熟练运用 watch 可以帮助我们更好地处理数据变化和执行相应的操作,提高 Vue 应用的质量和效率。

在使用watch时,我们应该根据具体的需求和场景进行设计和实践,合理选择选项和处理方式。同时,我们了解到异步处理、与计算属性配合使用以及监听路由参数的方法和技巧。

通过遵循最佳实践,我们可以编写更具可读性、可维护性和性能的代码。在实际开发中,不断学习和掌握 watch 功能的用法,加深对 Vue 的理解,将有助于我们构建出更优雅、高效的 Vue 应用。

相关文章:

Vue 响应式监听 Watch 最佳实践

一. 前言 上一篇文章我们学习了 watch 的基础知识&#xff0c;了解了它的基本使用方法及注意事项&#xff0c;本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章&#xff1a; 详解 Vue 中 Watch 的使用方法及注意事项https://bl…...

md编辑器语法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

RabbitMQ常用管理命令及管理后台

RabbitMQ管理命令 1、用户管理1.1、新增一个用户1.2、查看当前用户列表1.3、设置用户角色1.4、设置用户权限1.5、查看用户权限 2、RabbitMQ的web管理后台2.1、查看rabbitmq 的插件列表2.2、启用插件2.3、禁用插件2.4、访问RabbitMQ的web后台2.4、通过web页面新建虚拟主机 ./rab…...

从准备面试八股文,感悟到技术的本质

工作前几年听说过&#xff0c;大学最重要的几门课其实是数据结构和算法、操作系统、计算机组成原理、计算机网络。 初听时不以为然&#xff0c;感觉没什么用。 近期准备面试八股文得到了一些感悟。这句话随着工作年限和对程序的理解越来越深入&#xff0c;含金量越来越高。 最…...

云手机的默认ip地址是什么

云手机&#xff08;Cloud Phone&#xff09;是一种基于云计算技术的虚拟手机&#xff0c;它可以在云端运行&#xff0c;使用户能够通过互联网访问手机应用和服务。云手机的IP地址通常取决于以下几个因素&#xff1a; 1. 云服务提供商 不同的云服务提供商&#xff08;如AWS、G…...

对接阿里asr和Azure asr

1&#xff1a;对接阿里asr 1.1&#xff1a;pom <dependency><groupId>com.alibaba.nls</groupId><artifactId>nls-sdk-recognizer</artifactId><version>2.2.1</version> </dependency>1.2&#xff1a;生成token package c…...

未来数字世界相关技术、应用:AR/VR/MR;数字人、元宇宙、全息显示

一、AR/VR/MR 增强现实(AR)、虚拟现实(VR)和混合现实(MR)是三种不同的技术,它们都旨在增强用户对现实世界的感知和交互体验。以下是它们的详细介绍: 增强现实(AR) 增强现实(Augmented Reality, AR) 是一种将虚拟信息叠加到现实世界中的技术。通过AR技术,用户可…...

在 Java 中提供接口方法而不是实现接口

问题 我正在阅读有关Java中的接口的文章。其中提到我们必须实现compareTo方法才能在ArrayList容器上调用sort&#xff0c;例如Employee类应该实现 Comparable接口。 后面解释了为什么Employee类不能简单地提供compareTo方法而不实现Comparable接口&#xff1f;之所以需要接口…...

伪类选择器

一、基本概念 伪类选择器以冒号&#xff08;:&#xff09;开头&#xff0c;后面跟着伪类名。它不直接对应DOM中的任何元素&#xff0c;而是用于描述元素的特殊状态或位置。通过使用伪类选择器&#xff0c;可以在不修改HTML文档结构的情况下&#xff0c;为元素添加或修改样式。…...

亚信安全天穹5分钟勒索体检 免费试用今起上线

对于勒索攻击的认知 你是否还停留在“2.0时代”&#xff1f; 勒索攻击无疑是企业面临的最大威胁&#xff0c;2024年上半年&#xff0c;勒索组织数量同步增长超过50%&#xff0c;勒索攻击数量也持续攀升&#xff0c;平均勒索赎金突破520万美元。 当前&#xff0c;勒索攻击治理…...

高校竞赛管理系统的设计与实现

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统高校竞赛管理系统信息管理难度大&#xff0c;容错率低&am…...

物联网行业中通信断线重连现象介绍以及如何实现

01 概述 断线重连是指在计算机网络中&#xff0c;当网络连接遇到异常中断或者断开时&#xff0c;系统会自动尝试重新建立连接&#xff0c;以保证网络通信的连续性和稳定性。这是一种常见的网络通信技术&#xff0c;广泛应用于各种计算机网络场景&#xff0c;包括互联网、局域…...

新手上路:Anaconda虚拟环境创建和配置以使用PyTorch和DGL

文章目录 前言步骤 1: 安装 Anaconda步骤 2: 创建新的 Anaconda 环境步骤 3: 安装最新版本的 PyTorch步骤 4: 安装特定版本的 PyTorch步骤 5: 安装最新版本的 DGL步骤 6: 安装特定版本的 DGL步骤 7: Pycharm中使用虚拟环境解释器第一种情况&#xff1a;创建新项目第二种情况&am…...

centos7系统安装宝塔面板

1、开始安装 适用系统 Centos/OpenCloud/Alibaba 稳定版9.0.0 urlhttps://download.bt.cn/install/install_lts.sh;if [ -f /usr/bin/curl ];then curl -sSO $url;else wget -O install_lts.sh $url;fi;bash install_lts.sh ed8484bec等待命令执行&#xff0c;安装完成&#…...

汽车总线之----J1939总线

instruction SAE J1939 是由美国汽车工程协会制定的一种总线通信协议标准&#xff0c;广泛应用于商用车&#xff0c;船舶&#xff0c;农林机械领域中&#xff0c;J1939协议是基于CAN的高层协议&#xff0c;我们来看一下两者之间的关系。在J1939 中&#xff0c;物理层和数据链路…...

基于skopt的贝叶斯优化基础实例学习实践

贝叶斯方法是非常基础且重要的方法&#xff0c;在前文中断断续续也有所介绍&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《数学之美番外篇&#xff1a;平凡而又神奇的贝叶斯方法》 《贝叶斯深度学习——基于PyMC3的变分推理》 《模型优化调参利器贝叶斯优化bay…...

OJ在线评测系统 后端 用策略模式优化判题机架构

判题机架构优化(策略模式) 思考 我们的判题策略可能会有很多种 比如 我们的代码沙箱本身执行程序需要消耗时间 这个时间可能不同的编程语言是不同的 比如沙箱执行Java要额外花费2秒 我们可以采用策略模式 针对不同的情况 定义不同独立的策略 而不是把所有情况全部放在一个i…...

element ui 精确控制日期控件 date-picker

https://github.com/element-plus/element-plus/discussions/17378 -- 某组件 xxx.vue ... <el-date-pickerv-model"timeRange"type"daterange"range-separator"-"start-placeholder"开始日期"end-placeholder"结束日期"…...

centos7安装指定版本php及扩展

安装EPEL仓库&#xff08;如果尚未安装&#xff09; sudo yum install epel-release导入REMI仓库的公钥&#xff1a; sudo rpm --import http://rpms.remirepo.net/RPM-GPG-KEY-remi启用REMI仓库&#xff08;你可以选择PHP 7.0或者7.4&#xff0c;以下以7.0为例&#xff09;&am…...

后端-对表格数据进行添加、删除和修改

一、添加 要求&#xff1a; 按下添加按钮出现一个板块输入添加的数据信息&#xff0c;点击板块的添加按钮&#xff0c;添加&#xff1b;点击取消&#xff0c;板块消失。 实现&#xff1a; 1.首先&#xff0c;设计页面输入框格式&#xff0c;表格首行 2.从数据库里调数据 3.添加…...

【学习笔记】手写 Tomcat 七

目录 一、优化 Dao 1. 设置 UserDaoImpl 为单例模式 2. 创建 Dao 工厂 3. 在 Service 层获取 UserDao 的实例 二、优化 Service 1. 设置 UserServiceImpl 为单例模式 2. 创建 Service 工厂 3. 在 Servlet 层获取 Service 实现类的对象 三、优化 Servlet 1. 使用配置…...

QT开发:详解 Qt 多线程编程核心类 QThread:基本概念与使用方法

1. 引言 在现代应用程序开发中&#xff0c;多线程编程是一个关键技术&#xff0c;能够显著提高程序的效率和响应速度。Qt 是一个跨平台的 C 框架&#xff0c;其中 QThread 类是实现多线程编程的核心类。本文将深入详解 QThread 的基本概念、使用方法及其在实际应用中的重要性。…...

【芋道源码】gitee很火的开源项目pig——后台管理快速开发框架使用笔记(微服务版之本地开发环境篇)

后台管理快速开发框架使用笔记&#xff08;微服务版之本地开发环境篇&#xff09; 后台管理快速开发框架使用笔记&#xff08;微服务版之本地开发环境篇&#xff09; 后台管理快速开发框架使用笔记&#xff08;微服务版之本地开发环境篇&#xff09;前言一、如何获取项目&#…...

设计模式、系统设计 record part01

技术路线&#xff1a; 工程师》设计师》分析师》架构师 管理路线&#xff1a; 项目经理》技术经理 工程师&#xff1a; 编程技术、测试技术 设计师&#xff1a; 工程师设计技术 分析师&#xff1a; 设计师分析技术 架构师&#xff1a; 分析师架构技术 项目经理&#xff1a; 时间…...

服务器与普通电脑的区别是什么?

服务器作为企业进行线上业务所使用的网络设备&#xff0c;大多数的用户对于服务器都有一定的了解&#xff0c;而普通的电脑则是人们在进行日常娱乐活动中经常会用到的设备&#xff0c;本文就来探讨一下服务器与普通电脑之间的区别是什么吧&#xff01; 普通的电脑就是我们通常所…...

Vue3学习(六)Vue3 + ts几种写法

前言 官网提到组合式api和选项式api 选项式api其实就是vue2的写法&#xff0c;组合式api是vue3的新写法&#xff08;组合式api可以在script中使用setup&#xff08;&#xff09;也可以使用<script setup>&#xff0c;<script setup>是setup&#xff08;&#xff…...

【前端】ES6:Proxy代理和Reflect对象

文章目录 1 Proxy代理1.1 get方法1.2 set方法1.3 has方法1.4 this问题 2 Reflect对象2.1 代替Object的某些方法2.2 修改某些Object方法返回结果2.3 命令式变为函数行为2.4 配合Proxy 1 Proxy代理 Proxy如其名&#xff0c;它的作用是在对象和和对象的属性值之间设置一个代理&am…...

基于微信开发助手企鹅音乐微信小程序的设计与实现(源码+文档+讲解)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

学习Spring Boot,应该从哪里开始学起

文章目录 前言1. Java基础2. Spring框架基础3. Spring Boot入门4. 搭建Spring Boot项目5. 编写RESTful API6. 数据库操作7. 安全性和测试8. 部署和运维9. 实践和项目总结前言 学习Spring Boot,应该从哪里开始学起 学习Spring Boot,你可以从以下几个步骤开始学起: 1. Java基…...

【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题

前言&#xff1a; &#x1f308;上期博客&#xff1a;【后端开发】JavaEE初阶—线程安全问题与加锁原理&#xff08;超详解&#xff09;-CSDN博客 &#x1f525;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 ⭐️小编会在后端开发的学习中不断更新~~~ &#…...