Vue 响应式监听 Watch 最佳实践

一. 前言
上一篇文章我们学习了 watch 的基础知识,了解了它的基本使用方法及注意事项,本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章:
详解 Vue 中 Watch 的使用方法及注意事项
https://blog.csdn.net/qq_24956515/article/details/142452530
通过了解,我们知道了 watch 是 Vue 中的是一个强大的功能,可以让我们监听数据的变化并在变化发生时执行相应的操作。在开发 Vue 应用过程中,watch可以帮助我们处理许多实际的应用场景,并实现最佳实践。
在本文中,我们将会深入探讨watch的实际使用场景,并总结最佳实践,以下的场景都是我在实际项目中能够总结的经常使用的,包括但不限于以下内容:
-
表单验证:用来监听表单输入框的变化,并对输入的内容进行验证。
-
异步操作:用于监听数据的变化,并触发相应的异步操作,比如网络请求等。
-
联动操作:监听数据的变化,并在变化时执行相应的联动操作。
-
计算属性与
watch的结合使用:比较watch和计算属性的区别,以及它们在不同场景下的应用和最佳实践。 -
同步多个
watch:处理多个watch同时触发的情况,并提供一些同步多个watch的最佳实践建议。 -
监听路由参数:使用
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来监听username和password字段的变化。当用户输入用户名时,会触发username字段的watch回调函数,并调用validateUsername方法进行验证。同理,当用户输入密码时,会触发password字段的watch回调函数,并调用validatePassword方法进行验证。通过设置usernameError和passwordError变量来控制错误提示的显示。
在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来监听selectedCategory和selectedItem两个数据的变化。当选择的类别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 毫秒的延迟将代码放入事件队列中从而实现异步执行。
注意:使用异步更新会使得代码的执行顺序发生变化,可能会导致一些意想不到的问题。确保在异步操作中正确处理所有依赖关系和数据同步,避免出现竞争条件或数据不一致的情况。
另外,对于复杂的异步操作,推荐使用Promise、async/await等异步编程的方式,以便更好地管理和处理异步逻辑。
总结:虽然watch默认是同步的,但可以通过$nextTick和setTimeout等方式实现异步更新。根据具体需求选择适合的方式来处理异步操作,确保代码的正确性和可维护性。
综上所述,合理使用 Vue 的 watch 选项可以方便地监听数据变化并执行相应的操作。但需要注意避免过度使用、处理循环引用和使用相应的选项来适应不同的需求。
通过遵循以上的最佳实践,可以更好地应用 Vue 的watch功能,提高代码的可读性、可维护性,同时避免潜在的性能问题。
四. 总结
在本篇文章中,我们详细探讨了 Vue 的watch功能的实际使用场景和最佳实践。了解和熟练运用 watch 可以帮助我们更好地处理数据变化和执行相应的操作,提高 Vue 应用的质量和效率。
在使用watch时,我们应该根据具体的需求和场景进行设计和实践,合理选择选项和处理方式。同时,我们了解到异步处理、与计算属性配合使用以及监听路由参数的方法和技巧。
通过遵循最佳实践,我们可以编写更具可读性、可维护性和性能的代码。在实际开发中,不断学习和掌握 watch 功能的用法,加深对 Vue 的理解,将有助于我们构建出更优雅、高效的 Vue 应用。

相关文章:
Vue 响应式监听 Watch 最佳实践
一. 前言 上一篇文章我们学习了 watch 的基础知识,了解了它的基本使用方法及注意事项,本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章: 详解 Vue 中 Watch 的使用方法及注意事项https://bl…...
md编辑器语法
这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右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…...
从准备面试八股文,感悟到技术的本质
工作前几年听说过,大学最重要的几门课其实是数据结构和算法、操作系统、计算机组成原理、计算机网络。 初听时不以为然,感觉没什么用。 近期准备面试八股文得到了一些感悟。这句话随着工作年限和对程序的理解越来越深入,含金量越来越高。 最…...
云手机的默认ip地址是什么
云手机(Cloud Phone)是一种基于云计算技术的虚拟手机,它可以在云端运行,使用户能够通过互联网访问手机应用和服务。云手机的IP地址通常取决于以下几个因素: 1. 云服务提供商 不同的云服务提供商(如AWS、G…...
对接阿里asr和Azure asr
1:对接阿里asr 1.1:pom <dependency><groupId>com.alibaba.nls</groupId><artifactId>nls-sdk-recognizer</artifactId><version>2.2.1</version> </dependency>1.2:生成token package c…...
未来数字世界相关技术、应用:AR/VR/MR;数字人、元宇宙、全息显示
一、AR/VR/MR 增强现实(AR)、虚拟现实(VR)和混合现实(MR)是三种不同的技术,它们都旨在增强用户对现实世界的感知和交互体验。以下是它们的详细介绍: 增强现实(AR) 增强现实(Augmented Reality, AR) 是一种将虚拟信息叠加到现实世界中的技术。通过AR技术,用户可…...
在 Java 中提供接口方法而不是实现接口
问题 我正在阅读有关Java中的接口的文章。其中提到我们必须实现compareTo方法才能在ArrayList容器上调用sort,例如Employee类应该实现 Comparable接口。 后面解释了为什么Employee类不能简单地提供compareTo方法而不实现Comparable接口?之所以需要接口…...
伪类选择器
一、基本概念 伪类选择器以冒号(:)开头,后面跟着伪类名。它不直接对应DOM中的任何元素,而是用于描述元素的特殊状态或位置。通过使用伪类选择器,可以在不修改HTML文档结构的情况下,为元素添加或修改样式。…...
亚信安全天穹5分钟勒索体检 免费试用今起上线
对于勒索攻击的认知 你是否还停留在“2.0时代”? 勒索攻击无疑是企业面临的最大威胁,2024年上半年,勒索组织数量同步增长超过50%,勒索攻击数量也持续攀升,平均勒索赎金突破520万美元。 当前,勒索攻击治理…...
高校竞赛管理系统的设计与实现
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统高校竞赛管理系统信息管理难度大,容错率低&am…...
物联网行业中通信断线重连现象介绍以及如何实现
01 概述 断线重连是指在计算机网络中,当网络连接遇到异常中断或者断开时,系统会自动尝试重新建立连接,以保证网络通信的连续性和稳定性。这是一种常见的网络通信技术,广泛应用于各种计算机网络场景,包括互联网、局域…...
新手上路:Anaconda虚拟环境创建和配置以使用PyTorch和DGL
文章目录 前言步骤 1: 安装 Anaconda步骤 2: 创建新的 Anaconda 环境步骤 3: 安装最新版本的 PyTorch步骤 4: 安装特定版本的 PyTorch步骤 5: 安装最新版本的 DGL步骤 6: 安装特定版本的 DGL步骤 7: Pycharm中使用虚拟环境解释器第一种情况:创建新项目第二种情况&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等待命令执行,安装完成&#…...
汽车总线之----J1939总线
instruction SAE J1939 是由美国汽车工程协会制定的一种总线通信协议标准,广泛应用于商用车,船舶,农林机械领域中,J1939协议是基于CAN的高层协议,我们来看一下两者之间的关系。在J1939 中,物理层和数据链路…...
基于skopt的贝叶斯优化基础实例学习实践
贝叶斯方法是非常基础且重要的方法,在前文中断断续续也有所介绍,感兴趣的话可以自行移步阅读即可: 《数学之美番外篇:平凡而又神奇的贝叶斯方法》 《贝叶斯深度学习——基于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仓库(如果尚未安装) sudo yum install epel-release导入REMI仓库的公钥: sudo rpm --import http://rpms.remirepo.net/RPM-GPG-KEY-remi启用REMI仓库(你可以选择PHP 7.0或者7.4,以下以7.0为例)&am…...
后端-对表格数据进行添加、删除和修改
一、添加 要求: 按下添加按钮出现一个板块输入添加的数据信息,点击板块的添加按钮,添加;点击取消,板块消失。 实现: 1.首先,设计页面输入框格式,表格首行 2.从数据库里调数据 3.添加…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
