_computed _destinations() 为什么模板不写()
_computed _destinations() 为什么模板不写()
在 Vue 模板中使用计算属性时,不需要在属性名称后面加上括号 ()
。计算属性本质上是一个 getter 函数,但 Vue 会将其转换为一个响应式的属性。Vue 会自动调用这些计算属性并将其结果作为属性值使用。
计算属性的工作原理
-
属性而非方法: 在 Vue 中,计算属性被定义为属性,而不是方法。这意味着你在模板中使用它们时,就像使用普通的对象属性一样,而不是调用函数。
-
自动计算和缓存: Vue 会自动计算计算属性的值,并在其依赖项发生变化时重新计算。计算属性的结果会被缓存,直到其依赖项发生变化。这使得计算属性在性能上比方法更高效,尤其是在涉及到复杂计算时。
示例
假设你在组件中定义了一个计算属性 destinations
:
computed: {...mapGetters('destination', ['getAllDestinations']),// 计算属性本质上是一个 getter 函数,但 Vue 会将其转换为一个响应式的属性并缓存// 定义时是函数 destinations() {return this.getAllDestinations}
}
在模板中,你可以直接使用 destinations
,而不需要加括号:
<template><div class="destinations-grid"><el-cardv-for="destination in destinations" // 在模板中,你可以直接使用 `destinations`,而不需要加括号// computed 本质上是一个 getter 函数,但 Vue 会将其转换为一个响应式的属性。Vue 会自动调用这些计算属性并将其结果作为属性值使用。computed 的结果会缓存,直到其依赖项发生变化。// v-for="destination in destinations()" 如果写成方法调用,每次渲染都会重新执行:key="destination.id"class="destination-card"@click="viewDestination(destination)":body-style="{ padding: '0px' }"><img :src="destination.imageUrl" alt="" class="destination-image" /><div class="destination-info"><h3>{{ destination.name }}</h3><p>{{ destination.shortDescription }}</p></div></el-card></div>
</template>
原因解释
- Vue 的处理机制:
- Vue 在内部会将计算属性的函数转换为 getter/setter
- 当访问这个属性时,Vue 自动调用 getter 函数
- 结果会被缓存,直到依赖项改变
- 性能优势:
- 计算属性会缓存结果
- 只有当依赖的响应式数据变化时才会重新计算
- 如果写成方法调用,每次渲染都会重新执行
- 代码可读性:
- 不使用括号使得模板更简洁
- 更符合"属性"的概念
- 与普通的数据属性使用方式保持一致
这就是为什么在模板中我们直接使用 destinations
而不是 destinations()
。
总结
- 不需要括号: 在模板中使用计算属性时,不需要加括号,因为它们被视为属性。
- 自动更新: 计算属性会根据其依赖项的变化自动更新,并且结果会被缓存以提高性能。
这种设计使得 Vue 的模板语法更加简洁和直观,同时也提高了应用的性能。
getters 访问 Vuex 中的数据 为什么不直接state
让我用一个具体的例子来说明为什么使用 getters 比直接访问 state 更好:
1. 数据处理和转换
// store/index.js
export default new Vuex.Store({state: {destinations: [{ id: 1, name: '北京', isActive: true },{ id: 2, name: '上海', isActive: false },{ id: 3, name: '广州', isActive: true }]},getters: {// 获取激活的目的地activeDestinations: state => {return state.destinations.filter(dest => dest.isActive);}}
});
2. 使用对比
// 使用 getters(推荐)
export default {computed: {...mapGetters(['activeDestinations'])}
}// 直接使用 state(不推荐)
export default {computed: {activeDestinations() {return this.$store.state.destinations.filter(dest => dest.isActive);}}
}
使用 getters 的优势
-
逻辑复用
- 如果多个组件都需要筛选激活的目的地,使用 getters 可以避免重复编写过滤逻辑
- 一旦筛选逻辑需要修改,只需要改动 getter 中的一处代码
-
数据缓存
- getters 的结果会被缓存,只有当依赖的 state 改变时才会重新计算
- 直接在组件中过滤 state 会在每次访问时重新计算
-
维护性
- 如果将来数据结构发生变化(比如
isActive
改名为active
),只需要修改 getter 中的一处代码 - 直接访问 state 的话,需要修改所有使用这个数据的组件
- 如果将来数据结构发生变化(比如
-
集中管理
- 所有数据处理逻辑都在 store 中,便于管理和调试
- 避免在不同组件中散布相同的数据处理逻辑
实际应用示例
// store/modules/destination.js
export default {state: {destinations: []},getters: {// 获取所有目的地getAllDestinations: state => state.destinations,// 获取激活的目的地getActiveDestinations: state => {return state.destinations.filter(dest => dest.isActive);},// 按名称搜索目的地getDestinationsByName: state => name => {return state.destinations.filter(dest => dest.name.toLowerCase().includes(name.toLowerCase()));}}
};// 组件中使用
export default {computed: {...mapGetters(['getAllDestinations','getActiveDestinations'])},methods: {searchDestinations(name) {// 使用带参数的 getterreturn this.$store.getters.getDestinationsByName(name);}}
}
这样的设计让代码:
- 更容易维护
- 更好复用
- 更有效率
- 更容易测试
- 更容易调试
当你的应用变得复杂时,这些优势会变得更加明显。
在 Vuex 中使用 getters 而不是直接访问 state 有几个好处:
-
抽象层次:
Getters 提供了一个抽象层次,使得组件不需要直接依赖于 state 的具体结构。如果 state 的结构发生变化,只需要修改 getters,而不需要修改所有使用该 state 的组件。 -
复用性:
Getters 可以在多个组件中复用,尤其是当需要对 state 进行一些计算或转换时。这样可以避免在多个组件中重复相同的逻辑。 -
缓存:
Getters 是基于 Vue 的响应式系统的,它们会根据依赖的变化自动更新,并且在依赖不变的情况下会缓存结果,从而提高性能。 -
可测试性:
Getters 可以单独进行测试,因为它们是纯函数,不依赖于组件的具体实现。
尽管在简单的场景下,直接访问 state 可能看起来更直接,但在复杂应用中,使用 getters 可以带来更好的可维护性和可扩展性。
如果你的应用很简单,或者你确定 state 的结构不会改变,直接访问 state 也是可以接受的。但在大多数情况下,使用 getters 是一种更好的实践。
computed 的方法 为什么不放到 methods: {
在 Vue 中,computed
和 methods
都可以用来定义组件的逻辑,但它们的用途和行为是不同的,因此不能随意互换。以下是为什么 computed
的方法不能放到 methods
中的原因,以及两者的区别和适用场景。
1. computed
和 methods
的核心区别
1.1 computed
是基于依赖的 缓存属性
-
基于依赖进行缓存
-
只有当依赖项发生变化时才会重新计算
-
返回值会被缓存,多次访问不会重复计算
-
适合需要依赖其他数据计算得到结果的场景
-
特点:
computed
是基于依赖的响应式属性,只有当依赖的数据发生变化时,computed
的值才会重新计算。- 如果依赖的数据没有变化,
computed
会直接返回之前缓存的值,而不会重新执行计算逻辑。
-
适用场景:
- 当需要基于现有数据计算出一个派生值,并且这个值会被多次使用时,使用
computed
可以提高性能。 - 例如:格式化数据、过滤列表、计算总和等。
- 当需要基于现有数据计算出一个派生值,并且这个值会被多次使用时,使用
1.2 methods
是普通的函数调用
-
每次调用都会执行
-
不会缓存结果
-
适合处理事件或执行操作的场景
-
特点:
methods
是普通的函数,每次调用都会重新执行逻辑。- 它不会缓存结果,也不会自动响应依赖的变化。
-
适用场景:
- 当需要执行某些操作或逻辑,而不是返回一个值时,使用
methods
。 - 例如:事件处理、触发异步请求、手动更新数据等。
- 当需要执行某些操作或逻辑,而不是返回一个值时,使用
2. 为什么 computed
的方法不能放到 methods
中?
2.1 computed
的缓存机制
- 如果将一个需要缓存的逻辑放到
methods
中,每次调用都会重新执行计算逻辑,浪费性能。 - 而
computed
会根据依赖的数据变化自动更新,并且在依赖未变化时直接返回缓存的值。
示例:
export default {data() {return {firstName: 'John',lastName: 'Doe'};},computed: {fullName() {console.log('Computed fullName is called');return `${this.firstName} ${this.lastName}`;}},methods: {getFullName() {console.log('Method getFullName is called');return `${this.firstName} ${this.lastName}`;}}
};
模板:
<template><div><p>Computed: {{ fullName }}</p><p>Method: {{ getFullName() }}</p></div>
</template>
结果:
computed
:fullName
只会在firstName
或lastName
发生变化时重新计算。- 如果多次访问
fullName
,只会触发一次计算,后续直接返回缓存值。
methods
:- 每次调用
getFullName()
都会重新执行逻辑,即使firstName
和lastName
没有变化。
- 每次调用
2.2 响应式特性
computed
是响应式的,依赖的数据变化时会自动触发重新计算。methods
不具备响应式特性,必须手动调用才能执行逻辑。
示例:
export default {data() {return {count: 0};},computed: {doubleCount() {return this.count * 2;}},methods: {getDoubleCount() {return this.count * 2;}}
};
模板:
<template><div><p>Computed: {{ doubleCount }}</p><p>Method: {{ getDoubleCount() }}</p><button @click="count++">Increment</button></div>
</template>
结果:
computed
:- 当点击按钮时,
count
的值发生变化,doubleCount
会自动更新。
- 当点击按钮时,
methods
:getDoubleCount()
不会自动更新,必须手动调用才能获取最新的值。
3. 什么时候用 computed
,什么时候用 methods
?
3.1 使用 computed
的场景
- 需要基于现有数据计算派生值,并且这个值会被多次使用。
- 需要缓存结果,避免重复计算。
- 需要响应式更新,当依赖的数据变化时,自动更新计算结果。
示例:
computed: {fullName() {return `${this.firstName} ${this.lastName}`;},filteredItems() {return this.items.filter(item => item.active);}
}
export default { data() { return { price: 100, quantity: 2, discount: 0.8 } }, computed: { // 1. 基础计算 totalPrice() { return this.price * this.quantity * this.discount; }, // 2. 格式化显示 formattedPrice() { return `¥${this.totalPrice.toFixed(2)}`; }, // 3. 数据过滤 activeUsers() { return this.users.filter(user => user.isActive); }, // 4. 状态计算 isValid() { return this.name.length > 0 && this.email.includes('@'); } }
}
3.2 使用 methods
的场景
- 不需要缓存,每次调用都需要重新执行逻辑。
- 不需要响应式更新,只在特定事件或操作中手动调用。
- 执行操作或触发事件,而不是返回一个值。
示例:
methods: {fetchData() {// 触发异步请求axios.get('/api/data').then(response => {this.items = response.data;});},handleClick() {console.log('Button clicked');}
}
export default { methods: { // 1. 事件处理 handleClick() { // 处理点击事件 this.count++; }, // 2. 异步操作 async fetchData() { const response = await api.getData(); this.data = response.data; }, // 3. 有副作用的操作 saveToLocalStorage() { localStorage.setItem('data', JSON.stringify(this.data)); }, // 4. 需要参数的方法 calculateTotal(tax) { return this.price * this.quantity * (1 + tax); } }
}
4. 总结对比
特性 | computed | methods |
---|---|---|
是否缓存 | 是,依赖未变化时返回缓存值 | 否,每次调用都会重新执行逻辑 |
是否响应式 | 是,依赖的数据变化时会自动更新 | 否,必须手动调用 |
适用场景 | 计算派生值,依赖数据变化时自动更新 | 执行操作、事件处理、逻辑不需要缓存 |
性能 | 更高效,避免重复计算 | 每次调用都重新计算,性能较低 |
5. 实际开发中的建议
-
优先使用
computed
处理派生值- 如果逻辑是基于现有数据计算出的值,并且需要响应式更新,优先使用
computed
。 - 例如:格式化日期、计算总和、过滤列表等。
- 如果逻辑是基于现有数据计算出的值,并且需要响应式更新,优先使用
-
使用
methods
处理操作逻辑- 如果逻辑是执行某些操作(如事件处理、异步请求),或者不需要缓存和响应式更新,使用
methods
。 - 例如:按钮点击事件、表单提交、数据请求等。
- 如果逻辑是执行某些操作(如事件处理、异步请求),或者不需要缓存和响应式更新,使用
-
避免滥用
methods
- 如果逻辑是基于数据计算出的值,但放在
methods
中,会导致性能浪费和代码不清晰。 - 例如:将
computed
的逻辑放到methods
中,每次调用都会重新计算,浪费性能。
- 如果逻辑是基于数据计算出的值,但放在
computed 的高级用法
export default {computed: {// 1. getter 和 setterfullName: {get() {return `${this.firstName} ${this.lastName}`;},set(newValue) {[this.firstName, this.lastName] = newValue.split(' ');}},// 2. 多个依赖项的复杂计算orderSummary() {const subtotal = this.items.reduce((sum, item) => {return sum + (item.price * item.quantity);}, 0);const tax = subtotal * this.taxRate;const shipping = this.calculateShipping();return {subtotal,tax,shipping,total: subtotal + tax + shipping};},// 3. 带条件的计算displayStatus() {if (!this.isLoggedIn) return '请登录';if (this.isLoading) return '加载中...';if (this.error) return `错误: ${this.error}`;return '正常';}}
}
性能对比示例
export default {data() {return {items: [{ id: 1, price: 100, quantity: 2 },{ id: 2, price: 200, quantity: 1 }// ... 更多商品]}},computed: {// 计算属性:结果被缓存total() {console.log('计算总价'); // 只在依赖变化时执行return this.items.reduce((sum, item) => {return sum + (item.price * item.quantity);}, 0);}},methods: {// 方法:每次调用都会重新计算calculateTotal() {console.log('计算总价'); // 每次调用都执行return this.items.reduce((sum, item) => {return sum + (item.price * item.quantity);}, 0);}}
}
实际应用场景
export default {data() {return {products: [],searchQuery: '',selectedCategory: '',sortOrder: 'asc'}},computed: {// 1. 过滤和排序商品列表filteredProducts() {return this.products// 先过滤.filter(product => {const matchesSearch = product.name.toLowerCase().includes(this.searchQuery.toLowerCase());const matchesCategory = !this.selectedCategory || product.category === this.selectedCategory;return matchesSearch && matchesCategory;})// 再排序.sort((a, b) => {return this.sortOrder === 'asc' ? a.price - b.price : b.price - a.price;});},// 2. 统计信息statistics() {const total = this.filteredProducts.length;const inStock = this.filteredProducts.filter(p => p.stock > 0).length;const outOfStock = total - inStock;return {total,inStock,outOfStock,inStockPercentage: ((inStock / total) * 100).toFixed(1)};},// 3. 表单验证状态formValidation() {return {isValid: this.validateAll(),errors: this.getValidationErrors()};}}
}
最佳实践
export default {computed: {// 1. 保持计算属性简单,专注于一个功能isFormValid() {return this.validateName && this.validateEmail && this.validatePassword;},// 2. 使用多个小的计算属性而不是一个大的validateName() {return this.name.length >= 3;},validateEmail() {return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(this.email);},validatePassword() {return this.password.length >= 6;},// 3. 合理使用 getter 和 setteruserProfile: {get() {return {name: this.name,email: this.email,avatar: this.avatar};},set(profile) {this.name = profile.name;this.email = profile.email;this.avatar = profile.avatar;}}}
}
注意事项
- 避免在计算属性中进行异步操作
// ❌ 错误示例
computed: {async userInfo() {const response = await fetch('/api/user');return response.json();}
}// ✅ 正确做法:使用 methods 或 watch
methods: {async fetchUserInfo() {const response = await fetch('/api/user');this.userInfo = await response.json();}
}
- 避免直接修改依赖项
// ❌ 错误示例
computed: {fullName() {this.firstName = this.firstName.trim(); // 不要在计算属性中修改数据return `${this.firstName} ${this.lastName}`;}
}// ✅ 正确做法:使用 getter/setter 或 methods
computed: {fullName: {get() {return `${this.firstName.trim()} ${this.lastName}`;},set(value) {[this.firstName, this.lastName] = value.split(' ');}}
}
- 避免过度使用计算属性
// ❌ 不必要的计算属性
computed: {userName() {return this.user.name; // 简单属性访问不需要计算属性}
}// ✅ 直接使用数据属性
template: `<div>{{ user.name }}</div>`
使用 computed
还是 methods
主要取决于:
- 是否需要缓存结果
- 是否依赖于其他数据
- 是否需要参数
- 是否包含副作用
选择合适的方式可以提高应用性能并使代码更易维护。
相关文章:
_computed _destinations() 为什么模板不写()
_computed _destinations() 为什么模板不写() 在 Vue 模板中使用计算属性时,不需要在属性名称后面加上括号 ()。计算属性本质上是一个 getter 函数,但 Vue 会将其转换为一个响应式的属性。Vue 会自动调用这些计算属性并将其结果作为属性值使用。 计算属…...
接口上传视频和oss直传视频到阿里云组件
接口视频上传 <template><div class"component-upload-video"><el-uploadclass"avatar-uploader":action"uploadImgUrl":on-progress"uploadVideoProcess":on-success"handleUploadSuccess":limit"lim…...
SimbaSchema在数据云平台中的可观测性实践与应用
建立可观测性体系是很多数据部门的理想。从Logs、Metrics、Traces和Meta抓取系统状态,到建立数据模型和指标体系,全流程均通过数据来支持运维。建立可观测性体系具备其行业标准,即所有数据平台类基础设施理论上都应提供Infomation Schema可观…...
VB、VBS、VBA的区别及作用
VB、VBS 和 VBA 是三种与微软 Visual Basic 相关的编程语言或环境,它们在功能和用途上有所不同: # Visual Basic (VB) Visual Basic 是一种面向对象的编程语言,最初由微软公司开发。它是一种高级编程语言,旨在简化开发过程&…...
elasticsearch的文档管理
2 json数据入门 json数据类型 基础数据类型 字符串,只要用双引号包裹的都是字符串类型。“嘻嘻”,“文勇”,“2024” 数字型,2024,3.1415926 布尔型,true 和 false 空值,null 高级数据类…...
Java基础-I/O流
(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 字节流 定义 说明 InputStream与OutputStream示意图 说明 InputStream的常用方法 说明 OutputStrea…...
【CVE-2024-9413】SCP-Firmware漏洞:安全通告
安全之安全(security)博客目录导读 目录 一、概述 二、修订历史 三、CVE根因分析 四、问题修复解决 一、概述 在SCP固件中发现了一个漏洞,如果利用该漏洞,可能会允许应用处理器(AP)在系统控制处理器(SCP)固件中导致缓冲区溢出。 CVE IDCVE-2024-9413受影响的产品SC…...
【iOS】知乎日报总结
知乎日报总结 前言详情页评论区tableView的自适应高度评论区的展开与收缩 收藏中心FMDB数据库数据库的使用 总结 前言 前五个礼拜完成了知乎日报的仿写,新学习了几个第三方库以及解决了一些网络异步的问题,本篇博客是对这个仿写项目的一些总结。两周前进…...
Python 使用 OpenCV 将 MP4 转换为 GIF图
以下是使用 Python 和 OpenCV 将 MP4 转换为 GIF 的示例代码: python import cv2 import imageiodef mp4_to_gif(mp4_path, gif_path, fps10, start_timeNone, end_timeNone):"""将MP4视频转换为GIF动图。:param mp4_path: 输入MP4视频的路径。:pa…...
学习路之phpstudy--安装mysql5.7后在my.ini文件中无法修改sql_mode
windows环境下使用phpstudy安装mysql5.7后需要修改mysql中的sql_mode配置,但是在phpstudy中打开mysql配置文件my.ini后, 通过查找找不到sql_mode或sql-mode, 此时无法在my.ini文件中直接进行修改,可以使用mysql命令进行修改&#…...
MySQL-学习笔记
基础篇 sql字段 1. date 类型 date类型用于存储日期值,格式为’YYYY-MM-DD’,显示范围是从’1000-01-01’到’9999-12-31’。它只包含日期部分,不包含时间部分。 2.datetime 类型 datetime类型用于存储日期和时间值,格式为’Y…...
HarmonyOS4+NEXT星河版入门与项目实战(19)------状态管理 @Prop@Link@Provide@Consume
文章目录 1、@Prop@Link@Provide@Consume装饰器图解2、案例演示1、模块划分2、模块封装1、任务统计模块2、列表管理模块3、主界面4、完整代码3、父组件是对象@Prop可以是对象属性1、案例改造2、完整代码4、@Provide@Consume案例1、案例改造2、完整代码3、总结1、@Prop@Link@Pro…...
企业OA管理系统:Spring Boot技术实现与案例研究
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足,创建了一个计算机管理企业OA管理系统的方案。文章介绍了企业OA管理系统的系统分析部…...
react
proTable manualRequest:实现初次进入不查询调用接口,当点击搜索调价查询才调用接口 form{{ ignoreRules: false }} 在搜索条件上增加必选项 formItemProps: { rules: [{required: true,message: 请选择结束时间}] },需要在proTable中增加form{{ ignoreRules: false }}才生效…...
【VTK】MFC中使用VTK9.3
MFC中如果使用VTK 碎碎念一、vtk环境配置二、具体实现1、新建类2. 自定义控件3、跑个栗子 总结 碎碎念 如果不是老程序用的MFC,我才不想用MFC去使用VTK呢。 一、vtk环境配置 关于环境配置你可以看这篇文章,在这里不过多赘述。需要注意要选择支持MFC&a…...
mysql系列1—mysql架构和协议介绍
背景: 本文开始整理mysql相关的文章,用于收集数据库相关内容;包括mysql架构和存储方式、索引结构和查询优化、数据库锁等内容。思考如何根据具体的业务给出最优的分表规划和表设计、字段选择和索引设计、优化的SQL语句,以及数据库…...
美创科技入选2024数字政府解决方案提供商TOP100!
11月19日,国内专业咨询机构DBC德本咨询发布“2024数字政府解决方案提供商TOP100”榜单。美创科技凭借在政府数据安全领域多年的项目经验、技术优势与创新能力,入选收录。 作为专业数据安全产品与服务提供商,美创科技一直致力于为政府、金融、…...
Vue——响应式数据,v-on,v-bind,v-if,v-for(内含项目实战)
目录 响应式数据 ref reactive 事件绑定指令 v-on v-on 鼠标监听事件 v-on 键盘监听事件 v-on 简写形式 属性动态化指令 v-bind iuput标签动态属性绑定 img标签动态属性绑定 b标签动态属性绑定 v-bind 简写形式 条件渲染指令 v-if 遍历指令 v-for 遍历对象的值 遍历…...
Vue实训---1-创建Vue3项目
0-在VSCode中的终端中运行npm -v查看版本号 如果出现——“npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。……”的错误,则需要在 vscode 终端执行 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned 命令即可。…...
设计模式之观察者模式
背景 假如我们现在有这样一个场景:市场上的股票价格不定时变化,而后台监控者和广告想要实时获取股票信息,我们应该怎么做? 显然在这个场景里,我们有这样一个设计 一个股票类不时更新股票价格另外有两个类Monitor和Bi…...
Vue.js 学习总结(13)—— Vue3 version 计数介绍
前言 Vue3.5 提出了两个重要概念:version计数和双向链表,作为在内存和计算方面性能提升的最大功臣。既然都重要,那就单挑 version 计数来介绍,它在依赖追踪过程中,起到快速判断依赖项有没有更新的作用,所以…...
数据结构 ——— 直接选择排序算法的实现
目录 直接选择排序算法的思想 优化直接选择排序算法的思想 代码实现(默认升序) 直接选择排序算法的思想 直接选择排序算法的思想类似与直接插入排序 区别在于从大到小选择最小的元素或者最大的元素直接放在元素应该停留的位置每次从待排序的元素中选…...
初始Python篇(5)—— 集合
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: Python 目录 集合 相关概念 集合的创建与删除 集合的操作符 集合的相关操作方法 集合的遍历 集合生成式 列表、元组、字典、集合的…...
基于Qt/C++/Opencv实现的一个视频中二维码解析软件
本文详细讲解了如何利用 Qt 和 OpenCV 实现一个可从视频和图片中检测二维码的软件。代码实现了视频解码、多线程处理和界面更新等功能,是一个典型的跨线程图像处理项目。以下分模块对代码进行解析。 一、项目的整体结构 项目分为以下几部分: 主窗口 (M…...
图片生成视频-右进
右侧进入 ffmpeg -loop 1 -i image.jpg -f lavfi -i colorcblack:s1280x720:d20 -filter_complex "[1:v]formatrgba[bg];[0:v]formatrgba,scale1280:720[img];[bg][img]overlayxif(lt(t,3),W,if(lt(t,8),W-(t-3)*W/5,0)):y(H-h)/2:enablegte(t,3)" -c:v libx264 -t 2…...
Golang的语言特性与鸭子类型
Golang的语言特性与鸭子类型 前言 什么是鸭子类型? Suppose you see a bird walking around in a farm yard. This bird has no label that says ‘duck’. But the bird certainly looks like a duck. Also, he goes to the pond and you notice that he swims l…...
Spring Boot 3.x + OAuth 2.0:构建认证授权服务与资源服务器
Spring Boot 3.x OAuth 2.0:构建认证授权服务与资源服务器 前言 随着Spring Boot 3的发布,我们迎来了许多新特性和改进,其中包括对Spring Security和OAuth 2.0的更好支持。本文将详细介绍如何在Spring Boot 3.x版本中集成OAuth 2.0…...
Centos-stream 9,10 add repo
Centos-stream repo前言 Centos-stream 9,10更换在线阿里云创建一键更换repo 自动化脚本 华为centos-stream 源 , 阿里云centos-stream 源 华为epel 源 , 阿里云epel 源vim /centos9_10_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.h...
手机发展史介绍
手机,这个曾经在电影和科幻小说中出现的高科技产品,如今已经渗透进了我们生活的每个角落。从单纯的通讯工具到如今集成了通讯、娱乐、工作、社交等多种功能的智能终端,手机的发展史也是人类科技进步的缩影。本文将从手机的发展历程、技术革新…...
七天掌握SQL--->第五天:数据库安全与权限管理
1.1 用户权限管理 用户权限管理是指控制用户对数据库的访问和操作权限。在MySQL中,可以使用GRANT和REVOKE命令来管理用户权限。 GRANT命令用于授予用户权限。语法如下: GRANT privileges ON database.table TO userhost IDENTIFIED BY password;其中&…...
Oracle-表空间/用户的创建与使用
-- 对象 -- 需要create的都是对象 已学的对象:表 table -- 普通用户 只能查询user开头的数据字典 select tablespace_name from user_tablespaces; -- dba用户才能够查询 select tablespace_name from dba_tablespaces; -- 创建表空间(需要管理员…...
生成对抗网络模拟缺失数据,辅助PAMAP2数据集仿真实验
PAMAP2数据集是一个包含丰富身体活动信息的数据集,它为我们提供了一个理想的平台来开发和测试HAR模型。本文将从数据集的基本介绍开始,逐步引导大家通过数据分割、预处理、模型训练,到最终的性能评估,在接下来的章节中,…...
表格数据处理中大语言模型的微调优化策略研究
论文地址 Research on Fine-Tuning Optimization Strategies for Large Language Models in Tabular Data Processing 论文主要内容 这篇论文的主要内容是研究大型语言模型(LLMs)在处理表格数据时的微调优化策略。具体来说,论文探讨了以下…...
卡达掐发展史
自行车是一种简单而又伟大的交通工具。自从19世纪诞生以来,它不仅改变了人们的出行方式,也深刻地影响了我们的生活方式、城市布局以及健康观念。作为一种绿色、经济的出行工具,自行车至今仍在全球范围内被广泛使用。本文将从自行车的历史、结…...
初学 flutter 问题记录
windows搭建flutter运行环境 一、运行 flutter doctor遇到的问题 Xcmdline-tools component is missingRun path/to/sdkmanager --install "cmdline-tools;latest"See https://developer.android.com/studio/command-line for more details.1)cmdline-to…...
大数据实验4-HBase
一、实验目的 阐述HBase在Hadoop体系结构中的角色;能够掌握HBase的安装和配置方法熟练使用HBase操作常用的Shell命令; 二、实验要求 学习HBase的安装步骤,并掌握HBase的基本操作命令的使用; 三、实验平台 操作系统࿱…...
CentOS:A服务器主动给B服务器推送(上传),B服务器下载A服务器文件(下载)
Linux:常识(bash: ip command not found )_bash: ip: command not found-CSDN博客 rsync 中断后先判断程序是否自动重连:ps aux | grep rsync 查看目录/文件是否被使用(查询线程占用):lsof /usr/local/bin/mongodump/.B_database1.6uRCTp 场景:MongoDB中集合非常大需要…...
如何选择服务器
如何选择服务器 选择服务器时应考虑以下几个关键因素: 性能需求。根据网站的预期流量和负载情况,选择合适的处理器、内存和存储容量。考虑网站是否需要处理大量动态内容或高分辨率媒体文件。 可扩展性。选择一个可以轻松扩展的服务器架构,以便…...
el-table最大高度无法滚动
解决el-table同时使用fixed和计算的最大高度时固定右边的列无法跟随滚动的问题 原因:el-table组件会根据传入的 max-height 计算表格内容部分 和 fixed部分的最大高度,以此来生成滚动条和产生滚动效果,当传入的 max-height 为一个计算的高度…...
YOLO-FaceV2: A Scale and Occlusion Aware Face Detector
《YOLO-FaceV2:一种尺度与遮挡感知的人脸检测器》 1.引言2.相关工作3.YOLO-FaceV23.1网络结构3.2尺度感知RFE模型3.3遮挡感知排斥损失3.4遮挡感知注意力网络3.5样本加权函数3.6Anchor设计策略3.7 归一化高斯Wasserstein距离 4.实验4.1 数据集4.2 训练4.3 消融实验4.3.1 SEAM块4…...
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
目录 一、准备工作 二、理解文本数据格式 三、开发文本数据转换为Excel工具 读取CSV文件 将DataFrame写入Excel文件 处理其他格式的文本数据 读取纯文本文件: 读取TSV文件: 四、完整代码与工具封装 五、使用工具 六、总结 在数据分析和处理的日常工作中,我们经常…...
全卷积网络(Fully Convolutional Networks, FCN)
全卷积网络(Fully Convolutional Networks, FCN) 什么是 FCN? 全卷积网络(Fully Convolutional Networks, FCN)是一种用于图像语义分割的深度学习模型。与传统的卷积神经网络(CNN)不同&#x…...
【计算机网络】HTTP协议
一、网址 1.URL URL就是我们平时说的网址 2.urlencode/urldecode 像 / ? : 等这样的字符,已经被url当做特殊意义理解了。因此这些字符不能随意出现 如果某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义 -> urlencode 服务器收到url…...
IT服务团队建设与管理
在 IT 服务团队中,需要明确各种角色。例如系统管理员负责服务器和网络设备的维护与管理;软件工程师专注于软件的开发、测试和维护;运维工程师则保障系统的稳定运行,包括监控、故障排除等。通过清晰地定义每个角色的职责࿰…...
STM32总体架构简单介绍
目录 一、引言 二、STM32的总体架构 1、三个被动单元 (1)内部SRAM (2)内部闪存存储器 (3)AHB到APB的桥(AHB to APBx) 2、四个主动(驱动)单元 &#x…...
C++自动化测试:GTest 与 GitLab CI/CD 的完美融合
在现代软件开发中,自动化测试是保证代码质量和稳定性的关键手段。对于C项目而言,自动化测试尤为重要,它能有效捕捉代码中的潜在缺陷,提高代码的可维护性和可靠性。本文将重点介绍如何在C项目中结合使用Google Test(GTe…...
Python 虚拟环境使用指南
Python 虚拟环境使用指南 博客 一、创建虚拟环境 在开始使用Python虚拟环境之前,我们需要先创建一个新的虚拟环境。 1. 基础创建流程 首先,进入您的项目目录: cd path\to\your\project然后使用以下命令创建虚拟环境: pytho…...
MySQL面试-1
InnoDB中ACID的实现 先说一下原子性是怎么实现的。 事务要么失败,要么成功,不能做一半。聪明的InnoDB,在干活儿之前,先将要做的事情记录到一个叫undo log的日志文件中,如果失败了或者主动rollback,就可以通…...
Harbor2.11.1生成自签证和配置HTTPS访问
文章目录 HTTPS的工作流程部署Harbor可参考上一篇文章生成自签证书1.修改/etc/hosts文件2.生成证书a.创建存放证书路径b.创建ca.key密钥c.创建ca.crtd.创建给Harbor服务器使用密钥 yunzhidong.harbor.com.keye.创建给Harbor服务器使用证书签名请求文件 yunzhidong.harbor.com.c…...
鸿蒙开发Hvigor插件动态生成代码
Hvigor允许开发者实现自己的插件,开发者可以定义自己的构建逻辑,并与他人共享。Hvigor主要提供了两种方式来实现插件:基于hvigorfile脚本开发插件、基于typescript项目开发。下面以基于hvigorfile脚本开发插件进行介绍。 基于hvigorfile脚本…...