鸿蒙OSUniApp制作多选框与单选框组件#三方框架 #Uniapp
使用UniApp制作多选框与单选框组件
前言
在移动端应用开发中,表单元素是用户交互的重要组成部分。尤其是多选框(Checkbox)和单选框(Radio),它们几乎存在于每一个需要用户做出选择的场景中。虽然UniApp提供了基础的表单组件,但在实际项目中,我们往往需要根据UI设计稿来定制这些组件的样式和交互效果。
本文将分享如何使用UniApp框架自定义多选框和单选框组件,让它们不仅功能完善,还能适应各种设计风格。通过这篇文章,你将学习到组件封装的思路和技巧,这对提升你的UniApp开发能力会有很大帮助。
为什么要自定义表单组件?
你可能会问,UniApp不是已经提供了<checkbox>
和<radio>
组件吗?为什么还要自定义呢?原因主要有以下几点:
- 样式限制:原生组件的样式修改有限,难以满足设计师的"奇思妙想"
- 跨端一致性:原生组件在不同平台的表现可能不一致
- 交互体验:自定义组件可以加入更丰富的交互效果
- 功能扩展:可以根据业务需求添加更多功能
多选框组件实现
基本思路
多选框本质上是一个可切换状态的组件,我们可以用一个布尔值来表示选中状态,然后根据状态显示不同的样式。具体实现步骤如下:
- 定义组件的props和事件
- 设计选中和未选中的样式
- 处理点击事件和状态切换
- 处理禁用状态
代码实现
首先,创建components/my-checkbox/my-checkbox.vue
文件:
<template><view class="my-checkbox" :class="[disabled ? 'my-checkbox-disabled' : '', modelValue ? 'my-checkbox-checked' : '']"@click="handleClick"><view class="checkbox-box"><view v-if="modelValue" class="checkbox-icon"><text class="iconfont icon-check"></text></view></view><text v-if="label" class="checkbox-label">{{ label }}</text></view>
</template><script>
export default {name: 'MyCheckbox',props: {modelValue: {type: Boolean,default: false},label: {type: String,default: ''},disabled: {type: Boolean,default: false}},emits: ['update:modelValue', 'change'],methods: {handleClick() {if (this.disabled) return;const newValue = !this.modelValue;this.$emit('update:modelValue', newValue);this.$emit('change', newValue);}}
}
</script><style scoped>
.my-checkbox {display: flex;align-items: center;padding: 6rpx 0;
}.checkbox-box {width: 40rpx;height: 40rpx;border: 2rpx solid #dcdfe6;border-radius: 4rpx;display: flex;justify-content: center;align-items: center;box-sizing: border-box;transition: border-color 0.3s;
}.my-checkbox-checked .checkbox-box {background-color: #2979ff;border-color: #2979ff;
}.checkbox-icon {color: #fff;font-size: 28rpx;line-height: 1;
}.checkbox-label {margin-left: 10rpx;font-size: 28rpx;color: #333;
}.my-checkbox-disabled {opacity: 0.5;cursor: not-allowed;
}/* 引入字体图标(需要自行添加) */
/* @font-face {font-family: 'iconfont';src: url('~@/static/iconfont.ttf');
} */.icon-check:before {content: '\e645';
}
</style>
注意,这里使用了字体图标作为选中状态的标识。你需要在项目中引入相应的字体文件,或者使用其他图标方案。
如何使用
在页面中使用该组件:
<template><view class="container"><my-checkbox v-model="checked1" label="选项1"></my-checkbox><my-checkbox v-model="checked2" label="选项2"></my-checkbox><my-checkbox v-model="checked3" label="禁用选项" disabled></my-checkbox></view>
</template><script>
import MyCheckbox from '@/components/my-checkbox/my-checkbox';export default {components: {MyCheckbox},data() {return {checked1: false,checked2: true,checked3: false}}
}
</script>
多选框组(CheckboxGroup)实现
在实际应用中,多选框通常是成组出现的。下面我们来实现一个多选框组组件,用于管理多个选项:
<template><view class="checkbox-group"><my-checkbox v-for="(item, index) in options" :key="index":model-value="isChecked(item.value)":label="item.label":disabled="item.disabled"@change="(val) => handleChange(item.value, val)"></my-checkbox></view>
</template><script>
import MyCheckbox from '../my-checkbox/my-checkbox';export default {name: 'CheckboxGroup',components: {MyCheckbox},props: {modelValue: {type: Array,default: () => []},options: {type: Array,default: () => []}},emits: ['update:modelValue', 'change'],methods: {isChecked(value) {return this.modelValue.includes(value);},handleChange(value, checked) {let newValue = [...this.modelValue];if (checked) {// 如果选中且不在数组中,则添加if (!newValue.includes(value)) {newValue.push(value);}} else {// 如果取消选中且在数组中,则移除const index = newValue.indexOf(value);if (index !== -1) {newValue.splice(index, 1);}}this.$emit('update:modelValue', newValue);this.$emit('change', newValue);}}
}
</script><style scoped>
.checkbox-group {display: flex;flex-direction: column;
}
.checkbox-group :deep(.my-checkbox) {margin-bottom: 20rpx;
}
</style>
使用多选框组:
<template><view class="container"><checkbox-group v-model="selectedFruits" :options="fruitOptions"></checkbox-group><view class="result">已选择: {{ selectedFruits.join(', ') }}</view></view>
</template><script>
import CheckboxGroup from '@/components/checkbox-group/checkbox-group';export default {components: {CheckboxGroup},data() {return {selectedFruits: ['apple'],fruitOptions: [{ label: '苹果', value: 'apple' },{ label: '香蕉', value: 'banana' },{ label: '橙子', value: 'orange' },{ label: '葡萄', value: 'grape', disabled: true }]}}
}
</script>
单选框组件实现
单选框与多选框类似,但它通常是成组出现的,并且一个组内只能选中一个选项。
<template><view class="radio-group"><view v-for="(item, index) in options" :key="index"class="my-radio":class="[item.disabled ? 'my-radio-disabled' : '', modelValue === item.value ? 'my-radio-checked' : '']"@click="handleClick(item)"><view class="radio-box"><view v-if="modelValue === item.value" class="radio-inner"></view></view><text class="radio-label">{{ item.label }}</text></view></view>
</template><script>
export default {name: 'RadioGroup',props: {modelValue: {type: [String, Number, Boolean],default: ''},options: {type: Array,default: () => []}},emits: ['update:modelValue', 'change'],methods: {handleClick(item) {if (item.disabled) return;if (this.modelValue !== item.value) {this.$emit('update:modelValue', item.value);this.$emit('change', item.value);}}}
}
</script><style scoped>
.radio-group {display: flex;flex-direction: column;
}.my-radio {display: flex;align-items: center;margin-bottom: 20rpx;
}.radio-box {width: 40rpx;height: 40rpx;border: 2rpx solid #dcdfe6;border-radius: 50%;display: flex;justify-content: center;align-items: center;box-sizing: border-box;transition: all 0.3s;
}.my-radio-checked .radio-box {border-color: #2979ff;
}.radio-inner {width: 20rpx;height: 20rpx;border-radius: 50%;background-color: #2979ff;transition: all 0.3s;
}.radio-label {margin-left: 10rpx;font-size: 28rpx;color: #333;
}.my-radio-disabled {opacity: 0.5;cursor: not-allowed;
}
</style>
使用单选框组:
<template><view class="container"><radio-group v-model="gender" :options="genderOptions"></radio-group><view class="result">性别: {{ getGenderLabel() }}</view></view>
</template><script>
import RadioGroup from '@/components/radio-group/radio-group';export default {components: {RadioGroup},data() {return {gender: 'male',genderOptions: [{ label: '男', value: 'male' },{ label: '女', value: 'female' },{ label: '保密', value: 'secret', disabled: true }]}},methods: {getGenderLabel() {const option = this.genderOptions.find(item => item.value === this.gender);return option ? option.label : '';}}
}
</script>
实际案例:问卷调查表单
下面是一个结合多选框和单选框的问卷调查表单案例:
<template><view class="survey-form"><view class="form-title">满意度调查问卷</view><view class="form-item"><view class="item-title">1. 您的年龄段:</view><radio-group v-model="survey.age" :options="ageOptions"></radio-group></view><view class="form-item"><view class="item-title">2. 您对我们的产品满意吗?</view><radio-group v-model="survey.satisfaction" :options="satisfactionOptions"></radio-group></view><view class="form-item"><view class="item-title">3. 您希望我们改进哪些方面?(可多选)</view><checkbox-group v-model="survey.improvements" :options="improvementOptions"></checkbox-group></view><button class="submit-btn" type="primary" @click="submitSurvey">提交问卷</button></view>
</template><script>
import RadioGroup from '@/components/radio-group/radio-group';
import CheckboxGroup from '@/components/checkbox-group/checkbox-group';export default {components: {RadioGroup,CheckboxGroup},data() {return {survey: {age: '',satisfaction: '',improvements: []},ageOptions: [{ label: '18岁以下', value: 'under18' },{ label: '18-25岁', value: '18-25' },{ label: '26-35岁', value: '26-35' },{ label: '36-45岁', value: '36-45' },{ label: '45岁以上', value: 'above45' }],satisfactionOptions: [{ label: '非常满意', value: 'very-satisfied' },{ label: '满意', value: 'satisfied' },{ label: '一般', value: 'neutral' },{ label: '不满意', value: 'unsatisfied' },{ label: '非常不满意', value: 'very-unsatisfied' }],improvementOptions: [{ label: '产品功能', value: 'feature' },{ label: '用户界面', value: 'ui' },{ label: '性能速度', value: 'performance' },{ label: '售后服务', value: 'service' },{ label: '价格', value: 'price' }]}},methods: {submitSurvey() {// 表单验证if (!this.survey.age) {uni.showToast({title: '请选择您的年龄段',icon: 'none'});return;}if (!this.survey.satisfaction) {uni.showToast({title: '请选择产品满意度',icon: 'none'});return;}if (this.survey.improvements.length === 0) {uni.showToast({title: '请至少选择一项需要改进的方面',icon: 'none'});return;}// 提交数据console.log('提交的问卷数据:', this.survey);uni.showLoading({title: '提交中...'});// 模拟提交setTimeout(() => {uni.hideLoading();uni.showToast({title: '提交成功',icon: 'success'});}, 1500);}}
}
</script><style scoped>
.survey-form {padding: 30rpx;
}.form-title {font-size: 40rpx;font-weight: bold;text-align: center;margin-bottom: 50rpx;
}.form-item {margin-bottom: 40rpx;
}.item-title {font-size: 32rpx;margin-bottom: 20rpx;
}.submit-btn {margin-top: 50rpx;
}
</style>
总结与思考
通过自定义多选框和单选框组件,我们不仅解决了原生组件样式定制的限制,还提升了组件的可复用性和扩展性。这种组件封装的思路,其实可以应用到各种UI组件的开发中。
在实现过程中,有几点值得注意:
- 组件通信:使用
v-model
结合update:modelValue
事件实现双向绑定,这是Vue3推荐的做法 - 样式隔离:使用scoped样式避免样式污染,对于需要修改子组件样式的情况,可以使用
:deep()
- 状态管理:清晰地定义组件状态,并通过props传递给子组件
- 交互优化:添加过渡效果提升用户体验
希望这篇文章对你在UniApp中自定义表单组件有所帮助。记住,组件开发的核心是复用和抽象,好的组件设计可以大大提高开发效率和代码质量。
进阶提示
如果你想进一步完善这些组件,可以考虑:
- 添加表单验证功能
- 实现不同风格的主题
- 支持更多的配置选项,如自定义图标
- 添加无障碍访问支持
- 优化移动端的触摸体验
最后,别忘了测试你的组件在不同平台的表现,确保它们在各种环境下都能正常工作。
相关文章:
鸿蒙OSUniApp制作多选框与单选框组件#三方框架 #Uniapp
使用UniApp制作多选框与单选框组件 前言 在移动端应用开发中,表单元素是用户交互的重要组成部分。尤其是多选框(Checkbox)和单选框(Radio),它们几乎存在于每一个需要用户做出选择的场景中。虽然UniApp提供…...
和为target问题汇总
文章目录 习题题型1377.组合总和 IV 题型2494.目标和 和为target的问题,可以有很多种问题的形式的考察,当然,及时的总结与回顾有利于我们熟练掌握这些知识! 题型1 爬楼梯问题,是对于转移步伐有规定,在不同…...
Ubuntu使用Docker搭建SonarQube企业版(含破解方法)
目录 Ubuntu使用Docker搭建SonarQube企业版(含破解方法)SonarQube介绍安装Docker安装PostgreSQL容器Docker安装SonarQube容器SonarQube汉化插件安装 破解生成license配置agent 使用 Ubuntu使用Docker搭建SonarQube企业版(含破解方法ÿ…...
牛客网 NC22167: 多组数据a+b
牛客网 NC22167: 多组数据ab 题目分析 这道题目来自牛客网(题号:NC22167),要求我们计算两个整数a和b的和。乍看简单,但有以下特殊点需要注意: 输入包含多组测试数据每组输入两个整数当两个整数都为0时表示…...
EdgeShard:通过协作边缘计算实现高效的 LLM 推理
(2024-05-23) EdgeShard: Efficient LLM Inference via Collaborative Edge Computing (EdgeShard:通过协作边缘计算实现高效的 LLM 推理) 作者: Mingjin Zhang; Jiannong Cao; Xiaoming Shen; Zeyang Cui;期刊: (发表日期: 2024-05-23)期刊分区:本地链接: Zhang 等 - 2024 …...
π0: A Vision-Language-Action Flow Model for General Robot Control
TL;DR 2024 年 Physical Intelligence 发布的 VLA 模型 π0,基于 transformer 流匹配(flow matching)架构,当前开源领域最强的 VLA 模型之一。 Paper name π0: A Vision-Language-Action Flow Model for General Robot Contr…...
RabbitMQ高级篇-MQ的可靠性
目录 MQ的可靠性 1.如何设置数据持久化 1.1.交换机持久化 1.2.队列持久化 1.3.消息持久化 2.消息持久化 队列持久化: 消息持久化: 3.非消息持久化 非持久化队列: 非持久化消息: 4.消息的存储机制 4.1持久化消息&…...
4、前后端联调文生文、文生图事件
4、前后端联调文生文、文生图事件 原文地址 1、底部【发送按钮】事件触发调用后端AI程序逻辑 <!-- 前端模板如下: --> <!DOCTYPE html> <html><head><meta charset"utf-8"><title>小薛博客LLM大模型实战</title><me…...
深度学习中的提示词优化:梯度下降全解析
深度学习中的提示词优化:梯度下降全解析 在您的代码中,提示词的更新方向是通过梯度下降算法确定的,这是深度学习中最基本的优化方法。 一、梯度下降与更新方向 1. 核心公式 对于可训练参数 θ \theta θ(这里是提示词嵌入向量),梯度下降的更新公式为:...
Midjourney 最佳创作思路与实战技巧深度解析【附提示词与学习资料包下载】
引言 在人工智能图像生成领域,Midjourney 凭借其强大的艺术表现力和灵活的创作模式,已成为设计师、艺术家和创意工作者的核心工具。作为 CSDN 博主 “小正太浩二”,我将结合多年实战经验,系统分享 Midjourney 的创作方法论&#x…...
【数字图像处理】半开卷复习提纲
1:要求 2张A4纸以内,正反面均可写 (不过博主由于墨水浸到背面了,采用了把2张单面通过双面胶粘起来的方法,结果考前半个小时都在用这个难用的双面胶。。。) 2:提纲内容 3:提示 考的…...
交通运输与能源融合发展——光储充在交通上的应用完整解决方案
在全球积极应对气候变化、推动可持续发展的大背景下,交通运输与能源领域的融合发展成为关键趋势。近日,交通运输部等十部门联合发布的《关于推动交通运输与能源融合发展的指导意见》,为这两个重要行业的协同前行指明了清晰的方向,…...
API 接口开放平台 Crabc 3.2 发布
2025 年 5 月 15 日,API 接口开放平台 Crabc 3.2 发布。 Crabc 是一款 API 接口开发平台、企业级接口管理和 SQL2API 平台。它支持动态数据源、动态 SQL 和标签,能接入多种 SQL 或 NoSQL 数据源,包括 MySQL、Oracle、达梦、TiDB、Hive、ES 和…...
基于智能推荐的就业平台的设计与实现(招聘系统)(SpringBoot Thymeleaf)+文档
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
【web应用】配置Java JDK与maven3的环境变量
文章目录 一、控制面板 - 系统 - 高级系统设置-环境变量二、用户变量和系统变量的配置方法一样:三、查看是否配置成功 maven有两种安装方式: 1、IDEA捆绑安装,一般是maven3【这里配置的环境变量是捆绑安装这种方式】 2、手动下载安装插件 一、…...
编程日志5.7
二叉树的功能代码 #include<iostream> using namespace std; //二叉树结点定义 template<typename T> struct TreeNode { T val;//定义了一个类型为T的成员变量val,用于存储树节点的值 TreeNode* left;//定义了一个指向TreeNode类型的指针成员变量left,…...
室内定位:热门研究方向与未解难题深度解析
I. 引言:对普适性室内定位的持续探索 A. 室内定位在现代应用中的重要性 室内定位系统(IPS)正迅速成为众多应用领域的基石技术,其重要性源于现代社会人们约70%至90%的时间在室内度过的事实 1。这些应用横跨多个行业,包括应急响应 1、智能建筑与智慧城市 6、医疗健康(如病…...
图片通过滑块小图切换大图放大镜效果显示
图片通过滑块小图切换大图放大镜效果显示 实现目标: 显示一组图片列表,鼠标进入小图记录当下小图下标,通过小图下标在数组中对应图片显示到大图位置; 鼠标进入大图位置时,带动滑块移动,并将放大两倍的大图…...
[250515] 腾讯推出 AI 编程助手 CodeBuddy,对标 Cursor
目录 腾讯推出 AI 编程助手 CodeBuddy 腾讯推出 AI 编程助手 CodeBuddy 腾讯发布 CodeBuddy,一款 AI 编程助手,旨在提升开发者效率。 主要亮点: CodeBuddy: 全新英文品牌,面向全球开发者。Craft 模式: A…...
OpenCV光流估计:原理、实现与应用
一、什么是光流? 光流(Optical Flow)是计算机视觉中描述图像序列中像素运动模式的重要概念。它表示图像中物体在连续帧之间的表观运动,是由物体或相机的运动引起的。 光流的基本假设 亮度恒常性:同一物体点在连续帧中的亮度保持不变时间持…...
使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据(申请key教程)
使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据 目录 使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据📌 简介🛠 插件安装方法🌍 下载 DEM 数据步骤🔑 注册 OpenTopography 账号(如使用 Cope…...
PHP基础知识
【学习资料】 视频: https://www.bilibili.com/video/BV1Xh411S7G1?spm_id_from333.788.videopod.episodes&vd_sourcebe26b82da70367069ab00d6db4f4ffc0 文档:https://www.runoob.com/php/php-tutorial.html 目录 1,PHP是什么2ÿ…...
Kotlin 和 Java 混合开发时需要注意哪些问题
1 空安全(Null Safety) Kotlin 有严格的空安全机制(如非空类型的 String 和可空类型 String?),但是 Java 没有: Kotlin 代码调用 Java 代码:Java 中的所有引用类型默认都是可空的,…...
乘法口诀练习神器
请你利用python语言开发一个“乘法口诀练习神器”,主要辅助小学生练习乘法口诀,主要功能如下: 1. 能够随机循环出10道题,可以是乘法或者是除法。如果是乘法,确保两个因数都是1-9之间的整数;如果是除法&…...
How to configure Linux mint desktop
Backgrounds apt install mint-backgrounds-*Theme...
【golang】DNS 资源记录(RR)接口
Go 中 miekg/dns 包对 DNS 资源记录(RR)接口 的定义: type RR interface {Header() *RR_HeaderString() stringcopy() RRlen(off int, compression map[string]struct{}) intpack(...)unpack(...)parse(...)isDuplicate(r2 RR) bool }这个接…...
Vue中的自定义指令适用于哪些场景
自定义指令在 Vue 中非常灵活且功能强大,它们可以在多种场景中使用,以实现特定的 DOM 操作或行为 自定义样式和类 自定义指令可以用来动态地添加或修改元素的样式和类。这在需要根据数据动态调整样式时非常有用。 <div id"app"><d…...
边缘计算平台
本文来源 : 腾讯元宝 边缘计算平台是一种在靠近数据源头的网络边缘侧部署的分布式计算架构,通过融合网络、计算、存储和应用核心能力,就近提供实时、低延迟的智能服务。以下是其核心要点: 1. 定义与特点 定义&a…...
2025年5月H12-831新增题库带解析
组播基础 以下关于PIM-SM(SSM)的描述,错误的是哪一项? PIM-SM(SSM)无需维护RPPIM-SM(SSM)模型形成的组播分发树会一直存在,不会因为没有组播流量而消失PIM-SM(SSM)可以在成员端DR上基于组播源地址直接反向建立SPT在PIM-SM(SSM)中依日需要注册组播源 答…...
JavaScript - 运算符之逗号操作符与逗号分隔符(逗号操作符概述、逗号操作符用法、逗号分隔符、逗号分隔符用法)
一、逗号操作符概述 【表达式 1】, 【表达式 2】, 【表达式 3】, ..., 【表达式 N】逗号操作符(,)允许在一个语句中从左到右执行多个表达式,并返回最后一个表达式的值 二、逗号操作符用法 for 循环中的多变量控制 for (let i 0, j 10; i…...
AM1.5G太阳光模拟器参数
AM1.5G太阳光模拟器的参数通常包括光谱匹配度、空间均匀性、时间稳定性等关键指标,这些参数对于太阳能电池的测试和校准至关重要。以下是AM1.5G太阳光模拟器的主要参数: 光谱匹配度 AM1.5G光谱是指大气质量为1.5时,太阳光在地球表面的光谱分…...
YOLO11解决方案之距离计算探索
概述 Ultralytics提供了一系列的解决方案,利用YOLO11解决现实世界的问题,包括物体计数、模糊处理、热力图、安防系统、速度估计、物体追踪等多个方面的应用。 测量两个物体之间的间距被称为特定空间内的距离计算,YOLO11使用两个边界框的中心…...
OkHttp用法-Java调用http服务
特点:高性能,支持异步请求,连接池优化 官方文档:提供快速入门指南和高级功能(如拦截器、连接池)的详细说明,GitHub仓库包含丰富示例。 社区资源:中文教程丰富,GitHub高…...
c/c++中程序内存区域的划分
c/c程序内存分配的几个区域: 1.栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内存分配运算内置于处理器的指令集中,效率很高但是分配的内存容量有…...
JMeter聚合报告中的任务数和并发数区别
JMeter聚合报告中的任务数和并发数有本质的区别。 任务数(样本数) 任务数或样本数是指在性能测试中发出的请求数量。例如,如果模拟20个用户,每个用户发送100次请求,那么总的任务数或样本数就是2000次请求 并发…...
70、微服务保姆教程(十三)Docker容器详细讲义
一、关于Docker 1.1为什么要用docker? 随着开发的项目越来越复杂,软件越来越多,服务器越来越多,我们在开发和部署的时候会遇到很多问题,比如: 1.不同的应用程序可能会有不同的应用环境,比如Java开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都…...
2025年5月-信息系统项目管理师高级-软考高项-成本计算题
成本计算题挣值分析、成本计算题如何学?1、PV,EV,AC需要理解,根据题目给出的一些个条件需要求得这些值;2、CV,SV,CPI,SPI公式必须记住,需要根据求得的值判断项目的进度和成本的执行情况&#x…...
【BotSharp详细介绍——一步步实现MCP+LLM的聊天问答实例】
BotSharp详细介绍——一步步实现MCPLLM的聊天问答实例 一、MCP原理介绍二、创建BotSharp的项目,实现LLM推理机器人1、新建一个 解决方案,结构如下:2、先看下 MyWeatherPlugin3、创建MyWeatherMcpAPI 三、创建 MCP Server1、添加引用2、添加工…...
[Linux性能优化] 线程卡顿优化。Linux加入USB(HID)热插拔线程占用CPU优化。Linux中CPU使用率过高优化
文章目录 [Linux性能优化] 线程卡顿优化。一、问题定位:CPU 资源分析二、线程卡顿现场复现线程优化前图片线程优化后图片 [Linux性能优化] 线程卡顿优化。 一、问题定位:CPU 资源分析 线程卡顿通常与 CPU 资源竞争、线程调度异常相关,第一步…...
鸿蒙OSUniApp 开发的文件上传与下载功能#三方框架 #Uniapp
使用 UniApp 开发的文件上传与下载功能 前言 在移动应用开发中,文件上传与下载是非常常见且重要的功能需求。无论是上传用户头像、提交表单附件,还是下载资源文件、缓存图片,这些需求几乎存在于每一个成熟的应用中。UniApp 作为一个跨平台开…...
【MySQL】基础知识
MySQL(一)基础知识 MySQL 一、结构 1.客户端 2.服务器 分布式系统 二、存储 1.空间 1.1内存 1.1.1速度 1.1.2稳定性 1.1.3大小 1.1.4使用 1.2硬盘 1.2.1速度 1.2.2稳定性 1.2.3大小 1.2.4【Java学习】反射-CSDN博客 2.体系 表-数据库-服务器 3.特点 3.1…...
产品销量数据爬虫通用模板
最近遇到各行各业的需要爬取销售数据,每次写一个教程相对麻烦,所以思前考后我还是觉得写一个通用模板更适合。所以模板需要足够的灵活性,让用户能够自定义选择器。比如,产品标题、价格、销量的CSS选择器可能因网站而异,…...
一文讲透 Vue3 + Three.js 材质属性之皮革篇【扫盲篇】
文章目录 前言一、Three.js材质系统基础1.1 为什么选择PBR材质?1.2 关键参数解析 二、不同类型皮革的材质配置2.1 牛皮材质实现2.2 羊皮材质实现2.3 仿皮材质实现 三、高级贴图技术3.1 贴图制作流程3.2 组合贴图实战 四、性能优化策略4.1 贴图压缩技术4.2 材质共享4…...
mysql读写分离
一、读写分离原理 客户端连接代理层,代理层(中间件)来实现读操作给从服务器,写操作给主服务器。 二、示例 mycat实现读写分离 读写分离在主从复制的基础上 1客户机1代理1主2从1、网络主 192.168.10.101从1 192.168.10.102从2 …...
Java集合框架
集合 概念:对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能 和数组的区别 数组长度固定,集合长度不固定 数组可以存储基本类型和引用类型,集合只能存储引用类型 位置:java.util.* Collection体…...
salesforce如何导出所有字段
在 Salesforce 中,导出所有字段信息(包括字段名、API 名、字段类型、是否可报表、是否可搜索等)通常不是一个“一键完成”的操作,但可以通过几种方法实现。以下是常用的几种方法: ✅ 方法一:使用 Salesforc…...
一招解决Tailwindcss4.x与其他库样式冲突问题
当项目中引入tailwindcss,并与其他UI库混用时,可能会出现样式冲突问题,因为tailwindcss重置了一些基础样式,例如:引入tailwindcss后,原生button按钮没有了默认的样式。 在老版本中解决这个问题,…...
[Harmony]封装一个可视化的数据持久化工具
1.添加权限 在module.json5文件中添加权限 // 声明应用需要请求的权限列表 "requestPermissions": [{"name": "ohos.permission.DISTRIBUTED_DATASYNC", // 权限名称:分布式数据同步权限"reason": "$string:distrib…...
关于AI人工智能的知识图谱简介
人工智能是计算机科学的一个重要领域,旨在理解和构建智能行为。人工智能可以被划分为多个子领域或分支,包括机器学习、深度学习、自然语言处理(Natural Language Processing,NLP)、计算机视觉(Computer Vis…...
uniapp,小程序中实现文本“展开/收起“功能的最佳实践
文章目录 示例需求分析实现思路代码实现1. HTML结构2. 数据管理3. 展开/收起逻辑4. CSS样式 优化技巧1. 性能优化2. 防止事件冒泡3. 列表更新处理 实际效果总结 在移动端应用开发中,文本内容的"展开/收起"功能是提升用户体验的常见设计。当列表项中包含大…...