cc-product-waterfall仿天猫、淘宝购物车店铺商品列表组件

cc-product-waterfall仿天猫、淘宝购物车店铺商品列表组件

引言

在电商应用中,购物车体验的优化对于提升用户满意度和转化率至关重要。在本文中,我们将深入探讨如何使用cc-product-waterfall组件,结合uni-number-box和xg-widget,来构建一个仿天猫、淘宝的购物车店铺商品列表。同时,我们将详细解析相关的事件处理函数,以实现如商品过滤、店铺勾选、商品勾选、数量改变以及全选等功能。

组件介绍

cc-product-waterfall

cc-product-waterfall是一个强大的商品列表组件,支持瀑布流布局,非常适合用于展示大量商品。

uni-number-box

uni-number-box是一个数字输入框组件,用户可以通过它方便地修改商品数量。

xg-widget

xg-widget是一套通用的UI组件库,可以帮助我们快速构建出复杂且交互性强的用户界面。

购物车店铺商品列表实现

步骤1:引入必要的组件

首先,确保你的项目中已经引入了cc-product-waterfall、uni-number-box和xg-widget等组件。具体的引入方法可能会根据你使用的框架或库有所不同。

步骤2:构建基本布局

使用cc-product-waterfall构建商品列表,uni-number-box用于商品数量的输入,xg-widget中的checkbox组件用于实现店铺和商品的勾选功能。

步骤3:添加交互功能

通过事件处理函数来实现各种交互功能,包括商品过滤、店铺勾选、商品勾选、数量改变以及全选等。

事件处理详解

过滤选择的商品和未选择的商品

filterCheckedProductfilterUncheckedProduct方法分别用于过滤出已选择和未选择的商品。这两个方法都接受一个商品列表作为参数,然后使用数组的filter方法根据商品的checked属性进行过滤。

示例代码:
使用方法
 
引入uni-number-box xg-widget组件事件处理如下:
// 过滤选择的商品
filterCheckedProduct(products) {
return products.filter(item => item.checked);
},
// 过滤未选择的商品
filterUncheckedProduct(products) {
return products.filter(item => !item.checked);
},
// 店铺勾选
onShopCheckboxTap(shop) {
shop.checked = !shop.checked;shop.products.forEach(product => {
product.checked = shop.checked;
});
},
// 商品勾选
onProductCheckboxTap(product) {
product.checked = !product.checked
},
// 数量改变
onNumberBoxChange(product, e) {
product.count = e;
},
// 全选
onCheckAllTap() {
const checked = !this.allChecked;
this.shops.forEach(shop => {
shop.products.forEach(product => {
product.checked = checked;
})
})
}
HTML代码实现部分

<template><view><!-- 空购物车 --><view v-if="isEmptyCart"class="bg-color-white border-bottom-left-radius-xl border-bottom-right-radius-xl padding-lg"><view class="row-center-center"><image class="img-size-xl" src="/static/cart/empty-cart.png" mode="aspectFit"></image><text class="font-size-lg text-color-greyblack">购物车是空的</text></view><view class="row-center-center"><text class="empty-button">逛逛秒杀</text><text class="empty-button">看看关注</text></view></view><!-- 非空购物车 --><view v-if="!isEmptyCart"><view v-for="(shop, shopIndex) of cartShops" :key="shopIndex"class="padding-lg margin-bottom-lg bg-color-white border-radius-xl"><!-- 店铺购物车商品 --><!-- 店铺标题 --><view class="" @tap="onShopCheckboxTap(shop)"><label class="row-between-center"><view class="row-center-center"><checkbox class="shop-checkbox" :checked="shop.checked" /><image class="img-size-base border-radius-circle" :src="shop.logo" mode="aspectFit"></image><text class="font-size-lg">{{shop.name}}</text></view><!-- <view class=""></view> --></label></view><!-- 店铺产品列表 --><view class="row-between-start margin-top-base" v-for="(product, productIndex) of shop.products":key="productIndex"><view class="product-checkbox" @tap="onProductCheckboxTap(product)"><checkbox :checked="product.checked" /></view><image class="border-radius-lg product-image" :src="product.image" mode=""></image><view class="flex-1 column-center-stretch padding-left-lg"><text class="lines-2 font-size-base">{{product.title}}</text><view class="row-start-center margin-v-side-base"><viewclass="row-center-center bg-color-grey border-radius-rect-circle padding-side-base padding-v-side-xs"><text v-for="(property, propertyIndex) of product.sku" :key="propertyIndex"class="font-size-sm">{{property}},</text></view></view><view class="row-between-center"><xg-money camel :size="UNI_FONT_SIZE_XL" :money="product.price"></xg-money><view class="number-box"><uni-number-box :min="1" :value="product.count"@change="onNumberBoxChange(product, $event)"></uni-number-box></view></view></view></view></view></view><view class="order-amount-placeholder"></view><view class="row-between-center bg-color-white padding-side-lg order-amount"><view class="row-center-center"><view class="product-checkbox" @tap="onCheckAllTap"><checkbox :checked="allChecked" /></view><text class="font-size-base">全选</text><text class="font-size-lg margin-left-lg">合计:</text><text class="font-size-lg font-weight-bold">¥{{totalAmount.toFixed(2)}}</text></view><view class="bg-color-red border-radius-rect-circle padding-side-lg padding-v-side-base"><text class="font-size-lg text-color-white">去结算({{totalCount}})</text></view></view></view>
</template><script>// 获取购物车数据来源import data from '@/data/cart/cart';import mixin from '@/common/mixin';const customData = {page: 0}export default {mixins: [mixin],data() {return {isEmptyCart: false,loadMoreStatus: 'more',shops: [],};},computed: {// 全选事件allChecked() {return this.cartShops.filter(item => item.checked).length === this.cartShops.length;},// 购物车店铺数据cartShops() {this.shops.forEach(shop => {const uncheckedProducts = this.filterUncheckedProduct(shop.products);shop.checked = (uncheckedProducts.length === 0);})return this.shops;},// 计算数量totalCount() {let count = 0;this.cartShops.forEach(shop => {this.filterCheckedProduct(shop.products).forEach(product => {count += parseInt(product.count);})})return count;},// 计算金额totalAmount() {let amount = 0;this.cartShops.forEach(shop => {this.filterCheckedProduct(shop.products).forEach(product => {amount += Number(product.price * product.count)})})return amount;}},async created() {this.loadMoreStatus = 'loading';// 获取商铺数据const shopPromise = data.shops();this.shops = await shopPromise;},methods: {// 过滤选择的商品filterCheckedProduct(products) {return products.filter(item => item.checked);},// 过滤未选择的商品filterUncheckedProduct(products) {return products.filter(item => !item.checked);},// 店铺勾选onShopCheckboxTap(shop) {shop.checked = !shop.checked;shop.products.forEach(product => {product.checked = shop.checked;});},// 商品勾选onProductCheckboxTap(product) {product.checked = !product.checked},// 数量改变onNumberBoxChange(product, e) {product.count = e;},// 全选onCheckAllTap() {const checked = !this.allChecked;this.shops.forEach(shop => {shop.products.forEach(product => {product.checked = checked;})})}},}
</script><style lang="scss" scoped>.empty-button {@include border(1px solid);font-size: $uni-font-size-lg;border-radius: $uni-border-radius-rect-circle;margin: 0 $uni-spacing-col-xl;padding: $uni-spacing-row-sm $uni-spacing-col-xl;}$order-amount-height: 100rpx;.product-list {/* #ifdef APP-NVUE */@include position(fixed, 0 0 $order-amount-height 0);/* #endif */// width: 500rpx;}.shop-checkbox {transform: scale(0.8);}.product-checkbox {transform: scale(0.75);}.product-image {width: 200rpx;height: 200rpx;}.number-box {transform-origin: 100% 50%;transform: scale(0.75);}.order-amount-placeholder {height: $order-amount-height;}.order-amount {/* #ifndef APP-NVUE */@include position(fixed, none 0 var(--window-bottom) 0);/* #endif *//* #ifdef APP-NVUE */@include position(fixed, none 0 0 0);/* #endif */height: $order-amount-height;/* #ifndef APP-NVUE */z-index: 10000;/* #endif */}
</style>

店铺勾选和商品勾选功能实现

当用户点击店铺或商品的勾选框时,我们需要更新对应的checked状态。onShopCheckboxTap方法用于处理店铺的勾选事件,它会更新店铺及其所有商品的checked状态。onProductCheckboxTap方法用于处理商品的勾选事件,只会更新当前商品的checked状态。这两个方法都使用了JavaScript的逻辑非操作符来实现checked状态的切换。当用户点击全选按钮时,onCheckAllTap方法将会被调用。这个方法会检查当前的全选状态,然后遍历所有的店铺和商品,将它们的checked状态设置为相反的值。这样就可以实现一键全选或全不选的功能

 阅读全文下载完整组件代码请关注微信公众号: 前端组件开发

d848d5658a07453c843277846948c608.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软著项目推荐 深度学习手势识别算法实现 - opencv python

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习手势识别算法实现 - opencv python 该项目较为新颖…

计算机网络 | 物理层下 传输媒介、信道复用技术,带宽接入技术

文章目录 3. 物理层下面的传输媒介3.1 导引型传输媒介3.2 非导引型传输媒介 4 信道复用技术5 数字传输系统5.1 旧的数字系统5.2 新数字系统 6 带宽接入技术6.1 DSL&#xff08;数字用户线&#xff09;6.2HFC 光纤同轴混合网6.2.1 接入 6.3 FTTx技术 3. 物理层下面的传输媒介 传…

FL Studio 21.2.1.3859中文破解激活版2024免费下载安装图文教程

FL Studio 21.2.1.3859中文破解激活版是我见过更新迭代最快的宿主软件&#xff0c;没有之一。FL Studio12、FL Studio20、FL Studio21等等。有时甚至我刚刚下载好了最新版本&#xff0c;熟悉了新版本一些好用的操作&#xff0c;Fl Studio就又推出了更新的版本&#xff0c;而且F…

WebGL笔记:矩阵平移的数学原理和实现

矩阵平移的数学原理 让向量OA位移 x方向&#xff0c;txy方向&#xff0c;tyz方向&#xff0c;tz 最终得到向量OB 矩阵平移的应用 再比如我要让顶点的x移动0.1&#xff0c;y移动0.2&#xff0c;z移动0.3 1 &#xff09;顶点着色器核心代码 <script id"vertexShader&…

面试官:说说Vue中Proxy与Object.defineProperty的用法与区别

前言 面试时&#xff0c;我们说完Vue响应式原理&#xff0c;或者Vue2和Vue3的区别时&#xff0c;通常会引出Vue3使用了Proxy来优化响应式&#xff0c;而面试官会继续深挖&#xff1a;说说Proxy与Object.defineProperty的区别。 我们不能只说Proxy直接代理一个对象&#xff0c…

带头双向循环链表:一种高效的数据结构

&#x1f493; 博客主页&#xff1a;江池俊的博客⏩ 收录专栏&#xff1a;数据结构探索&#x1f449;专栏推荐&#xff1a;✅cpolar ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f525;编译环境&#xff1a;Visual Studio 2022&#x1f389;欢迎大…

基于maobox-gl 纯前端绘制全球色斑图

基于maobox-gl.js、turf.js 绘制全球色斑图绘制 1、准备全球的某一类的点位数据&#xff0c;可以使用turf.js 随机生成点&#xff0c;并点数据赋properties属性 let points turf.randomPoint(30, { bbox: [-180, -90, 180, 90]}); let interpolateOptions {gridType: "…

Linux下Python调用C语言

一&#xff1a;Python调用C语言场景 1&#xff0c;已经写好的C语言代码&#xff0c;不容易用Python实现&#xff0c;想直接通过Python调用写好的C语言代码 2&#xff0c;C比Python快&#xff08;只是从语言层面&#xff0c;不能绝对说C程序就是比Python快&#xff09; 3&…

遥感方向期刊总结

开眼看期刊~ 期刊分区信息搜索网址中国科学院文献情报中心期刊分区表升级版科研通期刊查询&#xff1a; 遥感领域常见期刊Nature CommunicationsRemote Sensing of EnvironmentProceedings of the National Academy of Sciences &#xff08;PNAS&#xff09;ISPRS Journal of …

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。

yolov5 7.0版本部署手机端。通过pnnx导出ncnn。 流程配置ncnn android yolov5导出自己模型的ncnn修改yolo.py文件导出TorchScript文件pnnx转torchscript为ncnn 安卓运行权重路径输入输出anchors 大小类别名generate_proposals方法修改 结果 流程 网络yolov5 的部署已经有很多了…

最新最全的Postman接口测试: postman实现参数化

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数…

2023第二届全国大学生数据分析大赛AB题代码

看大家需求量比较大&#xff0c;所以更新了一下A、B题的示例代码&#xff0c;部分截图如下 A题部分截图 B题部分截图 免费获取代码 关注威信公众号 Python风控模型与数据分析&#xff0c;回复 23年数据分析大赛代码 文末查看如何免费获取代码&#xff1b;编写不易&#xff0c;…

【数据结构】AOV网与拓扑排序

一.AOV网的概念&#xff08;Activity On Vertex Network&#xff09; 在一个表示工程的有向图中&#xff0c;用顶点表示活动&#xff0c;用弧表示活动之间的优先关系。这样的有向图为顶点表示活动的网&#xff0c;我们称为AOV网&#xff08;Activity On Vertex Network&#xf…

scikit-learn线性回归法进行利润预测

大家好&#xff0c;生成式人工智能无疑是一个改变游戏规则的技术&#xff0c;但对于大多数商业问题来说&#xff0c;回归和分类等传统的机器学习模型仍然是首选。 私募股权或风险投资这样的投资者利用机器学习&#xff0c;首先必须了解关注的数据以及它是如何被使用的。投资公…

k8s安装学习环境

目录 环境准备 配置hosts 关闭防火墙 关闭交换分区 调整swappiness参数 关闭setlinux Ipv4转发 时钟同步 安装Docker 配置Yum源 安装 配置 启动 日志 安装k8s 配置Yum源 Master节点 安装 初始化 配置kubectl 部署CNI网络插件 Node节点 检查 环境准备 准…

同步代码,异步代码-微任务 宏任务 事件循环(输出题)

1.知识点 事件循环&#xff1a; 由浏览器Web API管理的异步代码&#xff0c;如果有结果后&#xff0c;会根据这个异步代码的类型&#xff0c;被放入对应的微任务或宏任务当中。当执行栈的任务&#xff08;同步代码&#xff09;全部执行完毕后&#xff0c;再执行完所有微任务的…

Flutter 控件查阅清单

为了方便记录和使用Flutter中的各种控件&#xff0c;特写此博客以记之&#xff0c;好记性不如烂笔头嘛&#xff1a;&#xff09; 通过控件的首字母进行查找&#xff0c;本文会持续更新 控件目录 AAppBar BCContainerColumn &#xff08;列&#xff09; DDivider (分割线) EElev…

oj赛氪练习题,

区间内的真素数 import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int M scanner.nextInt();int N scanner.nextInt();scanner.close();ArrayList<Integer>…

吴恩达《机器学习》11-1-11-2:首先要做什么、误差分析

一、首先要做什么 选择特征向量的关键决策 以垃圾邮件分类器算法为例&#xff0c;首先需要决定如何选择和表达特征向量 &#x1d465;。视频提到的一个示例是构建一个由 100 个最常出现在垃圾邮件中的词构成的列表&#xff0c;根据这些词是否在邮件中出现来创建特征向量&…

Docker下安装可视化工具Portainer

目录 Portainer简介 Portainer安装 Portainer简介 Portainer是一款开源的容器管理平台&#xff0c;支持多种容器技术&#xff0c;如Docker、Kubernetes和Swarm等。它提供了一个易于使用的Web UI界面&#xff0c;可用于管理和监控容器和集群。Portainer旨在使容器管理更加简单…