uniapp小程序系列-07单个商品列表开发

Vue开发实践:构建商品列表与样式设计
本文介绍了使用Vue进行项目开发的步骤,包括新建Vue文件,引入商品列表数据,放置图片资源,编辑文本内容以及设计界面样式。

1.新建目录

2.简单一写

3.引入

4.再创一个vue文件

5.引入商品列表

6.放图片到文件夹

7.编辑文本

8.设计样式

在复制一份文本,看看效果:

<think> 我们正在开发一个基于UniApp的微信小程序,需要实现一个可多选的列表功能。根据用户需求,这个列表需要支持以下功能: 1. 多选(包括单个项目的选中和取消) 2. 全选和反选(一键选中所有项目或取消所有选中) 3. 数据回显(当页面加载时,能够根据初始数据设置某些项目为选中状态) 4. 类似Tag标签的胶囊状多选样式(可选,但用户提到了类似样式) 参考引用资料: - 引用[1]提到微信小程序实现自定义多选列表,支持回显、全选/反选,并且可以高亮显示选中的项,样式为胶囊状多选复选框。 - 引用[2]是uniapp全栈开发中的内容,提到了微信小程序框架的一些限制,比如不支持某些表格多选方法(如`toggleRowSelection`、`clearSelection`、`toggleAllSelection`)。因此,我们需要使用其他方法实现。 - 引用[3]展示了一个微信小程序中实现多选的例子,通过循环检查每个项目的状态来实现全选判断和提示。 实现思路: 1. 数据驱动:使用一个数组(如`list`)来存储列表数据,每个数据项包含一个`checked`属性表示是否选中。 2. 全选状态:使用一个变量(如`allChecked`)来记录全选状态。 3. 点击事件:每个列表项点击时切换自身的`checked`状态,并更新全选状态。 4. 全选/反选按钮:点击时遍历所有项,设置它们的`checked`状态为全选状态,同时更新全选状态变量。 5. 数据回显:在页面初始化时,根据传入的初始选中数据设置对应项的`checked`为`true`。 步骤: ### 1. 数据结构 定义列表数据,每个对象包含内容和一个`checked`属性(布尔值)。 ```javascript data() { return { list: [ { id: 1, name: '选项1', checked: false }, { id: 2, name: '选项2', checked: false }, // ... 其他选项 ], allChecked: false // 全选状态 } } ``` ### 2. 单选切换 为每个列表项绑定点击事件,切换当前项的选中状态,并检查全选状态。 ```javascript methods: { // 切换单个选项 toggleItem(index) { this.list[index].checked = !this.list[index].checked; this.checkAllState(); // 每次切换后检查全选状态 }, // 检查全选状态 checkAllState() { // 如果每一项都被选中,则全选状态为true,否则为false this.allChecked = this.list.length > 0 && this.list.every(item => item.checked); } } ``` ### 3. 全选/反选 ```javascript methods: { // 全选/反选 toggleAll() { // 如果当前是全选状态,则取消全选;否则全选 const targetState = !this.allChecked; this.list.forEach(item => { item.checked = targetState; }); this.allChecked = targetState; } } ``` ### 4. 数据回显(初始化选中状态) 假设在页面加载时,我们需要设置某些项为选中状态(例如,传入一个初始选中的id数组)。可以在`onLoad`生命周期中处理: ```javascript onLoad() { // 假设初始选中的id数组为 [1, 3] const selectedIds = [1, 3]; this.list.forEach(item => { if (selectedIds.includes(item.id)) { item.checked = true; } }); // 初始化全选状态 this.checkAllState(); } ``` ### 5. 模板渲染 使用`v-for`渲染列表,根据`checked`状态动态绑定样式(例如高亮或胶囊样式)。 ```html <template> <view> <!-- 全选按钮 --> <view class="select-all" @click="toggleAll"> <text>{{ allChecked ? '取消全选' : '全选' }}</text> </view> <!-- 列表--> <view v-for="(item, index) in list" :key="item.id" @click="toggleItem(index)" :class="['item', item.checked ? 'active' : '']"> <text>{{ item.name }}</text> </view> <!-- 提交按钮(示例) --> <button @click="submit">提交</button> </view> </template> ``` ### 6. 样式设计(胶囊样式) 在`<style>`部分定义胶囊样式,例如: ```css .item { display: inline-block; margin: 10rpx; padding: 16rpx 32rpx; border-radius: 50rpx; border: 1rpx solid #ccc; background-color: #ffffff; } .active { background-color: #007aff; color: #ffffff; border: 1rpx solid #007aff; } .select-all { padding: 20rpx; border-bottom: 1rpx solid #eee; } ``` ### 7. 获取选中数据 当需要提交时,我们可以获取所有选中的项: ```javascript methods: { submit() { const selectedItems = this.list.filter(item => item.checked); const selectedIds = selectedItems.map(item => item.id); console.log('选中的ID:', selectedIds); // 这里可以调用接口提交数据或跳转页面 } } ``` ### 注意事项 - 由于引用[2]提到微信小程序框架不支持某些表格方法,所以我们采用普通数组操作来实现多选逻辑。 - 引用[3]中提到的“全不选就出提示勾选”的功能,可以在提交按钮的点击事件中判断: ```javascript submit() { if (this.list.every(item => !item.checked)) { uni.showToast({ title: '请至少选择一个选项', icon: 'none' }); return; } // 否则继续提交 } ``` ### 完整示例代码 ```vue <template> <view> <view class="select-all" @click="toggleAll"> <text>{{ allChecked ? '取消全选' : '全选' }}</text> </view> <view class="list-container"> <view v-for="(item, index) in list" :key="item.id" class="item" :class="{'active': item.checked}" @click="toggleItem(index)"> <text>{{ item.name }}</text> </view> </view> <button type="primary" @click="submit">提交</button> </view> </template> <script> export default { data() { return { list: [ { id: 1, name: '选项1', checked: false }, { id: 2, name: '选项2', checked: false }, { id: 3, name: '选项3', checked: false }, { id: 4, name: '选项4', checked: false } ], allChecked: false } }, onLoad() { // 模拟初始选中的id [1,3] const selectedIds = [1, 3]; this.list = this.list.map(item => { return { ...item, checked: selectedIds.includes(item.id) }; }); this.checkAllState(); }, methods: { toggleItem(index) { this.list[index].checked = !this.list[index].checked; this.checkAllState(); }, toggleAll() { this.allChecked = !this.allChecked; this.list.forEach(item => { item.checked = this.allChecked; }); }, checkAllState() { this.allChecked = this.list.length > 0 && this.list.every(item => item.checked); }, submit() { if (this.list.every(item => !item.checked)) { uni.showToast({ title: '请至少选择一个选项', icon: 'none' }); return; } const selectedIds = this.list.filter(item => item.checked).map(item => item.id); console.log(selectedIds); // 提交逻辑 uni.showToast({ title: `已选择:${selectedIds.join(',')}`, icon: 'none' }); } } } </script> <style> .list-container { display: flex; flex-wrap: wrap; padding: 20rpx; } .item { padding: 16rpx 32rpx; border-radius: 50rpx; border: 1rpx solid #ddd; margin: 10rpx; background-color: #fff; } .active { background-color: #007aff; color: #fff; border: 1rpx solid #007aff; } .select-all { padding: 20rpx; border-bottom: 1rpx solid #eee; } </style> ``` ### 总结 通过以上步骤,我们实现了在UniApp开发的微信小程序中一个可多选的列表,支持单选、全选/反选、数据回显以及胶囊样式。用户可以根据需要调整样式和功能。 §§相关问题§§ 1. 如何在UniApp中实现类似电商平台的商品规格多选功能? 2. 微信小程序如何实现多级联动选择(如省市区选择)? 3. UniApp中如何优化长列表的渲染性能? </think> 以下是在 UniApp开发微信小程序实现可多选列表的完整解决方案,结合引用资料中提到的关键功能(多选、全选/反选、数据回显等): ### 一、核心实现方案 #### 1. 数据结构和状态管理 ```javascript export default { data() { return { dataList: [ { id: 1, name: '选项1', checked: false }, { id: 2, name: '选项2', checked: false }, // ...更多选项 ], allChecked: false // 全选状态 } } } ``` #### 2. 选择功能实现 ```javascript methods: { // 切换单个选项 toggleItem(index) { this.dataList[index].checked = !this.dataList[index].checked this.updateAllCheckedState() }, // 全选/反选 toggleAll() { this.allChecked = !this.allChecked this.dataList.forEach(item => { item.checked = this.allChecked }) }, // 更新全选状态 updateAllCheckedState() { this.allChecked = this.dataList.length > 0 && this.dataList.every(item => item.checked) }, // 提交选择 (如引用[3]的实现) submit() { const selectedItems = this.dataList.filter(item => item.checked) if (selectedItems.length === 0) { uni.showToast({ title: '请至少选择一个选项', icon: 'none' }) return } // 提交选中的ID数组 const selectedIds = selectedItems.map(item => item.id) console.log('已选择:', selectedIds) // ...后续提交逻辑 } } ``` #### 3. 数据回显实现(关键功能) ```javascript onLoad() { // 模拟从后端获取的初始选中数据 const initialSelectedIds = [1, 3] // 设置回显选中状态 this.dataList = this.dataList.map(item => { return { ...item, checked: initialSelectedIds.includes(item.id) } }) // 更新全选状态 this.updateAllCheckedState() } ``` ### 二、UI 模板实现(胶囊样式) ```html <template> <view class="container"> <!-- 全选控制 --> <view class="select-all" @click="toggleAll"> <checkbox :checked="allChecked" /> <text>{{ allChecked ? '取消全选' : '全选' }}</text> </view> <!-- 多选列表 --> <view class="list-container"> <view v-for="(item, index) in dataList" :key="item.id" class="capsule-item" :class="{ active: item.checked }" @click="toggleItem(index)" > <text>{{ item.name }}</text> </view> </view> <button @click="submit">提交选择</button> </view> </template> ``` #### 胶囊样式 CSS ```css .capsule-item { display: inline-block; margin: 10rpx; padding: 16rpx 32rpx; border-radius: 50rpx; border: 1rpx solid #e0e0e0; background-color: #ffffff; transition: all 0.3s; } .capsule-item.active { background-color: #007aff; color: white; border-color: #007aff; } .select-all { padding: 20rpx; border-bottom: 1rpx solid #eee; display: flex; align-items: center; } .list-container { padding: 20rpx; display: flex; flex-wrap: wrap; } ``` ### 三、关键功能说明(引用资料关联) 1. **数据回显功能** 如引用[1]所述,初始化时根据预设数据自动选中选项: ```javascript // 设置回显选中状态 this.dataList = this.dataList.map(item => ({ ...item, checked: initialSelectedIds.includes(item.id) })) ``` 2. **全选/反选逻辑** 如引用[2]所述,使用简单的遍历实现: ```javascript toggleAll() { this.allChecked = !this.allChecked this.dataList.forEach(item => { item.checked = this.allChecked }) } ``` 3. **验证逻辑** 如引用[3]的实现,在提交时验证选择状态: ```javascript if (selectedItems.length === 0) { uni.showToast({ title: '请至少选择一个选项', icon: 'none' }) return } ``` ### 四、高级功能扩展 1. **带搜索的多选列表** ```javascript computed: { filteredList() { return this.dataList.filter(item => item.name.includes(this.searchKeyword) ) } } ``` 2. **分类分组选择** ```javascript data() { return { categories: [ { name: '分类1', items: [ { id: 1, name: '选项1', checked: false }, // ... ] }, // ... ] } } ``` 3. **选中项计数显示** ```html <view class="counter"> 已选择: {{ selectedCount }} 项 </view> ``` ```javascript computed: { selectedCount() { return this.dataList.filter(item => item.checked).length } } ``` ### 五、最佳实践建议 1. **性能优化**: - 对于长列表使用 `virtual-list` 组件 - 使用 `computed` 计算选中状态避免重复计算 2. **数据持久化**: ```javascript // 保存选中状态 onUnload() { uni.setStorageSync('selectedItems', this.selectedIds) } ``` 3. **无障碍支持**: - 为每个选项添加 `aria-checked` 属性 - 使用语义化的 HTML 标签 > **💡 调试提示**:在微信开发者工具中,可通过 AppData 面板实时查看数据状态变化。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值