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

Vue学习笔记:计算属性

计算属性

  • 入门
  • 进阶
  • 二次进阶
  • 三次进阶
  • 四次进阶
  • 结界
  • 五次进阶
  • 六次进阶
  • 七次进阶
  • 八次进阶
  • 九次进阶
  • 终章
  • 彩蛋

入门

Vue.js中,计算属性示例:

export default {data() {return {firstName: 'John',lastName: 'Doe'};},computed: {// 计算属性:全名fullName() {return this.firstName + ' ' + this.lastName;}}
}

在这个例子中,fullName是一个计算属性,它基于数据属性(data):firstNamelastName,进行计算。每当firstNamelastName发生变化时,Vue会自动重新计算并更新fullName的值。在模板中你只需引用{{fullName}}即可显示结果。

这个例子是最基础的计算属性实现,代码量最小且直观展示了计算属性的基本用法。

进阶

稍微进阶的示例:涉及更复杂的计算逻辑和条件判断

export default {data() {return {firstName: 'John',lastName: 'Doe',isFormal: false // 是否显示正式称呼};},computed: {// 计算属性:全名(根据是否正式展示不同的称呼)fullName() {if (this.isFormal) {return `${this.firstName.charAt(0).toUpperCase()}${this.firstName.slice(1)}. ${this.lastName.toUpperCase()}`;} else {return `${this.firstName} ${this.lastName}`;}}}
}

在这个例子中,fullName计算属性会根据isFormal数据属性的值来决定返回全名的不同格式。当isFormaltrue时,它将返回姓氏大写且名字仅显示首字母大写的正式称呼;否则,返回正常的全名。在模板中通过{{fullName}}引用该计算属性即可。

二次进阶

一个更进阶的Vue.js计算属性示例:涉及到对复杂对象或数组的处理,以及多个数据依赖项:

export default {data() {return {user: {firstName: 'John',lastName: 'Doe',addresses: [{ type: 'home', street: '123 Main St' },{ type: 'work', street: '456 Elm St' }]},currentAddressType: 'home'};},computed: {// 计算属性:当前地址全称currentAddress() {const selectedAddress = this.user.addresses.find(address => address.type === this.currentAddressType);if (selectedAddress) {return `${this.user.firstName} ${this.user.lastName}'s ${this.currentAddressType} Address: ${selectedAddress.street}`;} else {return 'No address found';}}}
}

在这个例子中,currentAddress计算属性基于user对象中的firstNamelastNameaddresses数组,以及currentAddressType数据属性进行计算。它会查找与currentAddressType匹配的地址,并返回包含用户姓名和所选地址类型的完整地址信息。当模板中引用{{currentAddress}}时,会根据这些数据的变化自动更新显示内容。

三次进阶

更进一步的计算属性示例:涉及嵌套对象的深度计算和条件过滤

export default {data() {return {users: [{ id: 1, name: 'John Doe', age: 30, roles: ['admin', 'user'] },{ id: 2, name: 'Jane Smith', age: 25, roles: ['user'] },// 更多用户...],searchName: '',roleFilter: ['admin']};},computed: {// 计算属性:过滤后的用户列表filteredUsers() {return this.users.filter(user => user.name.toLowerCase().includes(this.searchName.toLowerCase()) &&(this.roleFilter.length === 0 || this.roleFilter.some(role => user.roles.includes(role))));}}
}

在这个例子中,filteredUsers计算属性基于users数组、searchNameroleFilter数据属性进行计算。它首先通过filter()函数对用户列表进行过滤,满足以下两个条件的用户会被保留:

  1. 用户的名字包含搜索关键字(不区分大小写)。
  2. 如果roleFilter有值,则用户的角色列表需至少包含其中一个角色。

模板中引用{{filteredUsers}}时,会根据userssearchNameroleFilter的变化自动更新显示内容。

四次进阶

高阶的Vue.js计算属性示例:涉及到对异步数据处理,例如使用Promise或async/await

<template><div><!-- ... -->{{ formattedUser }}</div>
</template><script>
export default {data() {return {userId: null,user: {}};},computed: {// 计算属性:格式化用户信息(假设从API获取)async formattedUser() {try {if (!this.user.id && this.userId) {const response = await fetch(`/api/users/${this.userId}`);const userData = await response.json();this.$set(this.user, 'id', userData.id);this.$set(this.user, 'name', `${userData.firstName} ${userData.lastName}`);// 其他属性...}return `${this.user.name} (${this.user.id})`;} catch (error) {console.error('Error fetching user:', error);return '无法获取用户信息';}}},watch: {userId(newVal) {if (newVal) {// 当userId变化时,触发formattedUser的重新计算this.formattedUser;}}}
};
</script>

在这个例子中,formattedUser是一个异步计算属性,它会根据userId的变化去异步获取并格式化用户信息。这里使用了async/await和fetch API来模拟从服务器获取用户数据的过程。由于计算属性不支持直接返回Promise,所以我们需要在计算属性内部等待异步操作完成。

同时,通过在watch中监听userId的变化,并触发formattedUser的重新计算,确保当用户ID改变时能及时更新显示内容。注意,Vue并不会自动等待异步计算属性的结果,因此需要在模板中结合v-if等条件渲染或者在watch中进行处理以确保正确渲染结果。

结界

来到四阶的你,对于只负责处理前端,应该已经是够用了。接下来,就是精进的道路。如果还有兴趣,想要更加深入,欢迎继续下去。

五次进阶

涉及到更复杂的业务逻辑和数据处理,比如使用Vuex管理状态并根据多个store中的值进行计算:

import { mapState } from 'vuex';export default {computed: {...mapState(['user', 'settings']),// 计算属性:根据用户权限和应用设置决定是否显示特定功能showAdvancedFeatures() {return this.user.isAdmin && this.settings.showAdvancedOptions;},// 计算属性:处理复杂对象结构,并返回格式化后的数据formattedUserData() {if (this.user && this.user.data) {const { firstName, lastName, posts = [] } = this.user.data;const recentPost = posts.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))[0];return `${firstName} ${lastName}'s recent post: "${recentPost.title}"`;}return 'No user data available';}}
}

在这个例子中:

  1. 使用mapState帮助器从Vuex store获取usersettings状态。
  2. showAdvancedFeatures计算属性基于用户是否为管理员以及应用设置来确定是否显示高级功能。
  3. formattedUserData计算属性则处理嵌套的对象结构,提取用户的名字、最近一篇博客的标题(按创建时间排序),并返回格式化后的字符串。如果用户数据不存在,则返回提示信息。

这些计算属性会自动响应关联的Vuex store状态变化,确保视图内容始终是最新的。

六次进阶

使用计算属性进行性能优化,如利用缓存结果和依赖追踪:

export default {data() {return {largeList: [...], // 假设这是一个非常大的数组filterKeyword: ''};},computed: {// 使用getter和setter实现带有缓存功能的复杂过滤逻辑filteredLargeList: {get() {if (this._cachedFilteredList && this.filterKeyword === this._lastFilterKeyword) {return this._cachedFilteredList;}const keyword = this.filterKeyword.toLowerCase();this._cachedFilteredList = this.largeList.filter(item => item.title.toLowerCase().includes(keyword) ||item.description.toLowerCase().includes(keyword));this._lastFilterKeyword = this.filterKeyword;return this._cachedFilteredList;},set(newList) {// 这里假设你允许通过外部直接设置过滤后的列表,但通常不推荐这样做this._cachedFilteredList = newList;}}},created() {// 初始化缓存变量this._cachedFilteredList = [];this._lastFilterKeyword = '';}
}

在这个例子中:

  1. filteredLargeList是一个具有getter和setter方法的计算属性。
  2. getter方法首先检查是否存在缓存(_cachedFilteredList)并且当前的过滤关键词是否与上次相同(_lastFilterKeyword)。如果满足条件,则直接返回缓存的结果,避免了对大型数据集的重复过滤操作,从而提高性能。
  3. 如果过滤关键词发生变化,计算属性会重新过滤数据,并更新缓存和关键词记录。
  4. setter方法用于在特殊情况下允许外部直接设置过滤后的列表,但这通常不是计算属性的标准用法。在大多数场景下,我们只需关注getter部分即可。

这个计算属性结合了响应式依赖追踪、业务逻辑处理以及性能优化策略,展示了Vue.js计算属性在实际项目中的高级应用。

七次进阶

涉及利用计算属性进行深度监听和数据转换,同时结合使用Vuex:

<template><div><!-- ... -->{{ formattedAndFilteredItems }}</div>
</template><script>
import { mapState, mapGetters } from 'vuex';export default {computed: {// 使用mapState获取store中的原始items...mapState(['items']),// 使用mapGetters获取全局的filterKeyword和formattingOptions...mapGetters(['filterKeyword', 'formattingOptions']),// 计算属性:深度监听并过滤、格式化itemsformattedAndFilteredItems() {const filteredItems = this.items.filter(item => item.title.toLowerCase().includes(this.filterKeyword.toLowerCase()));return filteredItems.map(item => ({...item,title: this.applyFormatting(item.title),description: this.applyFormatting(item.description)}));},// 计算属性方法:根据formattingOptions对文本进行格式化applyFormatting(text) {if (!text || !this.formattingOptions) return text;let formattedText = text;// 根据不同的formattingOptions对文本进行处理if (this.formattingOptions.uppercase) formattedText = formattedText.toUpperCase();if (this.formattingOptions.lowercase) formattedText = formattedText.toLowerCase();if (this.formattingOptions.capitalize) formattedText = formattedText.replace(/\b\w/g, l => l.toUpperCase());return formattedText;}}
};
</script>

在这个例子中:

  1. 使用mapState从Vuex store获取items数组。
  2. 使用mapGetters从Vuex store获取全局的过滤关键词(filterKeyword)和格式化选项(formattingOptions)。
  3. formattedAndFilteredItems计算属性首先基于filterKeyword过滤items数组,并对过滤后的结果应用applyFormatting函数来格式化每个项目的标题和描述字段。
  4. applyFormatting是一个计算属性方法,它根据formattingOptions动态地将文本转换为大写、小写或首字母大写。

这个计算属性不仅实现了深度监听、过滤以及复杂的数据转换,还展示了如何在组件内部与Vuex状态管理器紧密协作。

八次进阶

涉及动态计算CSS样式、响应式布局以及与第三方库的交互:

<template><div :style="dynamicStyles"><!-- ... --></div>
</template><script>
import axios from 'axios';export default {data() {return {windowWidth: window.innerWidth,theme: null,customFontSize: 16,};},computed: {// 计算属性:根据窗口宽度和主题动态生成CSS样式dynamicStyles() {return {color: this.theme ? `var(--${this.theme}-text)` : '#333',fontSize: `${this.customFontSize}px`,width: `${this.windowWidth}px`,transform: `scale(${this.calculateScaleFactor()})`,};},// 计算属性:根据用户设置和窗口大小计算缩放因子calculateScaleFactor() {if (this.windowWidth > 1200) {return 1;} else if (this.windowWidth <= 600) {return 0.8;} else {return 0.95 + (this.windowWidth - 600) * 0.01 / 600;}},// 计算属性:从API获取并解析主题信息async currentTheme() {if (!this.theme) {try {const { data } = await axios.get('/api/current-theme');this.$set(this, 'theme', data.name);} catch (error) {console.error('Error fetching theme:', error);}}return this.theme;},},mounted() {// 监听窗口大小变化,实时更新windowWidthwindow.addEventListener('resize', () => {this.windowWidth = window.innerWidth;});},
};
</script>

在这个例子中:

  1. dynamicStyles计算属性根据窗口宽度、当前主题和用户自定义字体大小生成CSS样式对象。
  2. calculateScaleFactor计算属性基于窗口宽度返回一个动态缩放因子,用于响应式布局调整。
  3. currentTheme是一个异步计算属性,它会从API获取当前主题,并在获取成功后将其设置到组件的本地状态。由于计算属性不支持直接返回Promise,因此这里使用了 $set 方法来更新数据。

此外,还监听了窗口大小变化事件以确保windowWidth始终是最新的值,进而影响到依赖它的计算属性结果。这个示例展示了计算属性如何在实际项目中进行复杂的数据处理、样式计算和API交互。

九次进阶

涉及到高级组件设计、Vuex状态管理、自定义指令、高级路由和过渡动画等。以下是一个包含这些概念的示例:

<template><div id="app"><!-- 使用全局主题状态 --><div :class="themeClass" @click="toggleTheme">主题切换({{ theme }})</<div><!-- 动态加载子组件,使用动态路由与过渡动画 --><transition :name="transitionName"><router-view :key="$route.fullPath"></router-view></transition><!-- 使用自定义指令调整元素透明度 --><p v-fadeInOut>这个文本会淡入淡出</p></div>
</template><script>
import { mapState } from 'vuex';
import axios from 'axios';
import FadeInOut from '@/directives/FadeInOut';export default {directives: {// 注册自定义指令fadeInOut: FadeInOut,},computed: {...mapState(['currentTheme']), // 从Vuex中映射当前主题状态// 根据主题计算CSS类名themeClass() {return this.currentTheme === 'light' ? 'theme-light' : 'theme-dark';},// 根据路由变化设置过渡动画名称transitionName() {return this.$route.meta.transition || 'fade';},},methods: {async toggleTheme() {const newTheme = this.currentTheme === 'light' ? 'dark' : 'light';try {await axios.post('/api/theme', { theme: newTheme });this.$store.commit('UPDATE_THEME', newTheme);} catch (error) {console.error('Error toggling theme:', error);}},},
};
</script><style scoped>
.theme-light { background-color: #fff; color: #333; }
.theme-dark { background-color: #333; color: #fff; }/* 过渡动画样式 */
.fade-enter-active, .fade-leave-active {transition: opacity .5s;
}
.fade-enter, .fade-leave-to {opacity: 0;
}
</style>

在这个例子中:

  1. 我们引入了Vuex并使用mapState帮助器来获取存储在全局状态管理中的当前主题。
  2. 定义了一个计算属性themeClass,根据当前主题动态地为元素添加相应的CSS类名。
  3. transitionName计算属性根据路由元信息设置页面切换时的过渡动画效果。
  4. 自定义指令v-fadeInOut用于控制文本内容的淡入淡出效果。
  5. 在方法toggleTheme中,我们通过调用API更新服务器端的主题,并且同步修改 Vuex 中的状态。

此外,通过观察$route对象的变化来实现路由过渡动画,并在点击事件中处理主题切换逻辑,展示了如何将多个Vue.js进阶特性整合到一起以构建一个更复杂的应用程序结构。

终章

如果你能掌握到这里,就算是踏入了新世界的大门。

进一步进阶Vue.js开发,我们可以探讨更复杂的场景和最佳实践,包括:

  1. 模块化和项目架构优化

    • 使用Vue CLI 3或4创建并配置多页面应用(MPA)或单页面应用(SPA)。
    • 按功能拆分组件,并组织成合理的目录结构,如原子组件、分子组件和容器组件等。
    • 引入模块化工具如Webpack或Vite进行资源管理和打包。
  2. 异步数据处理与API调用

    • 利用Vue Router的导航守卫(Navigation Guards)在路由切换时处理异步数据加载。
    • 结合axios或其他HTTP库实现API请求封装,支持拦截器、错误处理和响应式数据绑定。
    • 使用async/await或Promise配合Vue生命周期钩子进行数据预取和懒加载。
  3. 高级状态管理

    • 在大型应用中深度使用Vuex,设计模块化的store结构,利用getters、mutations和actions来管理全局状态。
    • 集成中间件(middleware)来监控action调用过程,实现日志记录、权限校验等功能。
  4. 性能优化

    • 使用Vue的v-ifv-show控制条件渲染,避免不必要的DOM操作。
    • 对于大量数据列表,采用虚拟滚动技术提高性能。
    • 利用Vue的keep-alive缓存组件实例以避免重复渲染。
    • 开启代码分割和动态导入减少初始加载时间。
  5. 测试驱动开发

    • 使用Jest、Mocha等单元测试框架结合Vue Test Utils编写组件单元测试。
    • 配合Selenium等工具进行端到端(E2E)测试,确保应用整体流程的正确性。
  6. 国际化和本地化

    • 应用Vue I18n插件实现多语言支持,根据用户偏好动态更改界面文字内容。
  7. SSR(服务器端渲染)和静态生成

    • 针对SEO友好和首屏加载速度要求高的场景,可以采用Nuxt.js搭建Vue SSR应用或者Next.js实现静态站点生成。
  8. Web Workers和Service Worker

    • 使用Web Workers将CPU密集型任务迁移到后台线程以改善用户体验。
    • 实现PWA特性,利用Service Worker缓存关键资源,使应用具备离线访问能力。
  9. 可复用的设计模式和最佳实践

    • 使用Composition API(Vue 3引入)重构逻辑,提升代码可读性和复用性。
    • 探索组合式API中的依赖注入、自定义渲染函数以及Suspense用于异步组件加载。

这些进阶实践能够构建出更为复杂、高性能且易于维护的Vue.js应用程序。

彩蛋

进阶实践不仅限于上述内容,还可以深入到更专业的领域和技术栈整合中。以下是进一步的进阶主题:

  1. Vue 3特性深入

    • 熟悉并掌握Composition API(组合式API)以替代Options API进行逻辑组织和复用。
    • 使用Teleport实现跨组件定位DOM元素。
    • 利用Suspense实现异步组件的高级加载策略。
    • 学习如何使用自定义渲染器拓展Vue应用至WebGL、Canvas或其他非DOM环境。
  2. TypeScript集成

    • 将TypeScript与Vue.js结合,利用类型系统提高代码质量及开发效率,编写强类型组件。
    • 配置Vue项目的TS配置文件,如shims-vue.d.tstsconfig.json
  3. 状态管理库升级

    • 探索Pinia(Vue 3推荐的状态管理库),它基于Composition API设计,提供更简洁直观的API来管理复杂状态。
  4. UI框架深度定制

    • 对流行的UI库如Element UI(Vue 2)或Vuetify、Quasar、Ant Design Vue(针对Vue 3)进行深度定制和二次开发。
  5. 微前端架构

    • 在大型企业级项目中采用微前端技术,比如通过Single-Spa或Qiankun将多个Vue应用集成在一个主壳应用内。
  6. Serverless SSR

    • 结合云服务提供的Serverless函数服务,构建无服务器端渲染解决方案,降低运维成本和提升资源利用率。
  7. DevOps工具链整合

    • CI/CD流程自动化,包括Git Hooks、GitHub Actions或Jenkins等持续集成/部署工具,实现自动化测试、打包和发布。
  8. 错误监控与性能分析

    • 集成Sentry、Bugsnag等错误追踪工具,实时收集线上错误信息并优化问题修复流程。
    • 利用Lighthouse、Webpack Bundle Analyzer等工具分析和优化应用性能。
  9. 移动端开发与响应式设计

    • 掌握Vue在移动端项目中的最佳实践,结合Vue Touch、Hammer.js处理手势交互。
    • 设计和实施自适应布局,确保应用在不同屏幕尺寸和设备上具有良好的用户体验。
  10. GraphQL集成

    • 将Vue应用与GraphQL后端服务对接,使用Apollo Client等库处理GraphQL查询、订阅以及缓存机制。

这些更为复杂的进阶实践能够应对更多挑战,构建出更加现代化、可扩展且高效率的Vue.js应用程序。

相关文章:

Vue学习笔记:计算属性

计算属性 入门进阶二次进阶三次进阶四次进阶结界五次进阶六次进阶七次进阶八次进阶九次进阶终章彩蛋 入门 Vue.js中&#xff0c;计算属性示例&#xff1a; export default {data() {return {firstName: John,lastName: Doe};},computed: {// 计算属性&#xff1a;全名fullNam…...

深度学习本科课程 实验2 前馈神经网络

任务 3.3 课程实验要求 &#xff08;1&#xff09;手动实现前馈神经网络解决上述回归、二分类、多分类任务 l 从训练时间、预测精度、Loss变化等角度分析实验结果&#xff08;最好使用图表展示&#xff09; &#xff08;2&#xff09;利用torch.nn实现前馈神经网络解决上述回归…...

【python】python爱心代码【附源码】

一、实现效果&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、完整代码&#xff1a; import math import random import threading import time from math import sin, cos, pi, log from tkinter import * import re# 烟花相关设置 Fireworks [] m…...

Linux---信号

前言 到饭点了&#xff0c;我点了一份外卖&#xff0c;然后又开了一把网游&#xff0c;这个时候&#xff0c;我在打游戏的过程中&#xff0c;我始终记得外卖小哥会随时给我打电话&#xff0c;通知我我去取外卖&#xff0c;这个时候游戏还没有结束。我在打游戏的过程中需要把外…...

24种设计模式之行为型模式(下)-Java版

软件设计模式是前辈们代码设计经验的总结&#xff0c;可以反复使用。设计模式共分为3大类&#xff0c;创建者模式(6种)、结构型模式(7种)、行为型模式(11种)&#xff0c;一共24种设计模式&#xff0c;软件设计一般需要满足7大基本原则。下面通过5章的学习一起来看看设计模式的魅…...

基于微信小程序的校园水电费管理小程序的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

python二维高斯热力图绘制简单的思路代码

import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter import cv2# 生成一个示例图像 image_size 100 image np.zeros((image_size, image_size))# 在图像中心创建一个高亮区域 center_x, center_y image_size // 2, image_size …...

k8s 部署 nocas 同时部署mysql

使用 ygqygq2 的 helm 模板部署 官方地址&#xff1a;https://artifacthub.io/packages/helm/ygqygq2/nacos 添加 helm 仓库 helm repo add ygqygq2 https://ygqygq2.github.io/charts/下载 helm 安装文件 helm pull ygqygq2/nacos解压 tar -zxvf nacos-2.1.6.tgz执行 hel…...

GolangCI-Lint配置变更实践

GolangCI-Lint配置变更实践 Golang编程中&#xff0c;为了便于调试和代码质量和安全性检查。利用该方法可以在开发周期的早期捕获错误&#xff0c;并且检查团队编程风格&#xff0c;提高一致性。这对团队协作开发特别有用&#xff0c;可以提高开发的效率&#xff0c;保持代码质…...

UE中对象创建方法示例和类的理解

对象创建方法示例集 创建Actor示例 //创建一个护甲道具 AProp* armor GetWorld()->SpawnActor<AProp>(pos, rotator); 创建Component示例 UCapsuleComponent* CapsuleComponent CreateDefaultSubobject<UCapsuleComponent>(TEXT("CapsuleComponent&qu…...

ElementUI鼠标拖动没列宽度

其实 element ui 表格Table有提供给我们一个resizable属性 按官方文档上描述 它就是控制是否允许拖拽表格列大小的属性 而且 它的默认值就是 true 但是依旧很多人会反应拖拽不了 首先 表格要有边框 如果没有变宽 确实是拖拽不了 给 el-table加上 border属性 运行结果如下 但…...

Flutter canvas 画一条会动的波浪线 进度条

之前用 Flutter Canvas 画过一个三角三角形&#xff0c;html 的 Canvas 也画过一次类似的&#xff0c; 今天用 Flutter Canvas 试了下 感觉差不多&#xff1a; html 版本 大致效果如下&#xff1a; 思路和 html 实现的类似&#xff1a; 也就是找出点的位置&#xff0c;使用二阶…...

算法训练营day22, 回溯2

216. 组合总和 III func combinationSum3(k int, n int) [][]int { //存储全部集合 result : make([][]int, 0) //存储单次集合 path : make([]int, 0) var backtrace func(k int, n int, sum int, startIndex int) backtrace func(k int, n int, sum int, startIndex int) {…...

undefined symbol: avio_protocol_get_class, version LIBAVFORMAT_58

rv1126上进行编译和在虚拟机里面进行交叉编译ffmpeg都不行 解决办法查看 查看安装的ffmpeg链接的文件 ldd ./ffmpeg rootEASY-EAI-NANO:/home/nano/ffmpeg-4.3.6# ldd ffmpeg linux-vdso.so.1 (0xaeebd000)libavdevice.so.58 > /lib/arm-linux-gnueabihf/libavde…...

Android简单支持项目符号的EditText

一、背景及样式效果 因项目需要&#xff0c;需要文本编辑时&#xff0c;支持项目符号&#xff08;无序列表&#xff09;尝试了BulletSpan&#xff0c;但不是很理想&#xff0c;并且考虑到影响老版本回显等因素&#xff0c;最终决定自定义一个BulletEditText。 先看效果&…...

【axios报错异常】: Uncaught ReferenceError: axios is not defined

问题描述: 当前代码在vivo手机和小米手机运行是正常的,点击分享按钮调出相关弹框,发送接口进行分享,但是现在oppo手机出现了问题: 点击分享按钮没有反应. 问题解析: 安卓同事经过查询后,发现打印了错误: 但是不清楚这个问题是安卓端造成的还是前端造成的,大家都不清楚. 问题…...

Docker基础与持续集成

docker 基础知识&#xff1a; docker与虚拟机 !左边为虚拟机&#xff0c;右边为docker环境 – Server :物理机服务器Host OS &#xff1a;构建的操作系统Hypervisor &#xff1a;一种虚拟机软件&#xff0c;装了之后才能虚拟化操作系统Guest OS &#xff1a;虚拟化的操作系统…...

flutter开发实战-ijkplayer视频播放器功能

flutter开发实战-ijkplayer视频播放器功能 使用better_player播放器进行播放视频时候&#xff0c;在Android上会出现解码失败的问题&#xff0c;better_player使用的是video_player&#xff0c;video_player很多视频无法解码。最终采用ijkplayer播放器插件&#xff0c;在flutt…...

SpringFramework实战指南(五)

SpringFramework实战指南(五) 4.3 基于 注解 方式管理 Bean4.3.1 实验一: Bean注解标记和扫描 (IoC)4.3.2 实验二: 组件(Bean)作用域和周期方法注解4.3.3 实验三: Bean属性赋值:引用类型自动装配 (DI)4.3.4 实验四: Bean属性赋值:基本类型属性赋值 (DI)4.3.5 实验五:…...

力扣 121. 买卖股票的最佳时机

题目来源&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 好久没写代码了&#xff0c;啥啥都忘了 C题解1&#xff1a;贪心算法。&#xff08;来源代码随想录&#xff09; 因为股票就买卖一次&#xff0c;那么贪心的想法很自然就是取…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...