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,一经查实,立即删除!

相关文章

【Linux】统计文件数量:ls -l | grep ^- | wc -l

统计文件数量&#xff1a;ls -l | grep ^- | wc -l ✅ 查看某文件夹下 文件 的个数&#xff08;不包含子目录中的文件&#xff09;&#xff08;因为目录的权限首字母为 d&#xff1a;代表文件夹&#xff09; ls -l | grep ^- | wc -lls -l&#xff1a;列出当前目录下所有文件&…

frida - 4.hook结合python调用

使用Python注入Frida主要有以下几种模式: Spawn 模式:在目标设备上启动一个新的应用程序进程,并在该进程中运行Frida脚本。这种模式 非常适用于对未安装的应用程序进行注入。 Attach 模式:在目标设备上附加到已经运行的应用程序进程,并在该进程中运行Frida脚本。这种 模式非常…

C++-如何避免内存泄漏

目录 一.内存泄漏 1.什么是内存泄漏&#xff0c;内存泄漏的危害 2.内存泄漏分类 3.如何检测内存泄漏 4.如何避免内存泄漏 一.内存泄漏 1.什么是内存泄漏&#xff0c;内存泄漏的危害 什么是内存泄漏&#xff1a;内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存…

速速收藏!纯C实现的MD5哈希校验算法~!

速速收藏&#xff01;纯C实现的MD5哈希校验算法~&#xff01; 只有一个函数&#xff1a; void MD5(const void* buf, unsigned int len, unsigned char output[16]); 在线验证网站&#xff1a;https://www.sojson.com/md5/ 头文件 /*** \file md5.h** \brief MD5 message dig…

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

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

【数据库设计和SQL基础语法】--SQL语言概述--SQL的基本结构和语法规则(二)

一、数据控制语言&#xff08;DCL&#xff09; 1.1 授权&#xff08;GRANT&#xff09; 数据控制语言&#xff08;DCL&#xff09;是SQL的一个子集&#xff0c;用于控制数据库中的数据访问和权限。GRANT语句是DCL中的一种&#xff0c;用于向用户或角色授予特定的数据库操作权…

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

文章目录 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. 物理层下面的传输媒介 传…

层规范化(Layer Normalization)和正则化(Regularization)

层规范化&#xff08;Layer Normalization&#xff09;和正则化&#xff08;Regularization&#xff09;是两个不同的概念&#xff0c;尽管它们都在机器学习和深度学习中非常重要&#xff0c;但它们的目的和应用方式有所不同。 层规范化&#xff08;Layer Normalization&#x…

KALI LINUX攻击与渗透测试

预计更新 第一章 入门 1.1 什么是Kali Linux&#xff1f; 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 …

嵌入式软件开发常用的关键字和运算符

目录 1、volatile关键字 2、const关键字 3、static关键字 4、struct与union 5、预定义标识符 6、#与## 7、void 与 void*关键字 8、weak关键字 1、volatile关键字 volatile是一个特征修饰符&#xff0c;提醒编译器它后面所定义的变量随时都有可能改变&#xff0c;因此…

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&…

CentOS服务器网页版Rstudio-server及R包批量安装最佳实践

CentOS服务器安装网页版Rstudio-server及R包批量安装 以下为CentOS 7/8的Rstudio-server安装、配置和R包安装操作 1. 软件包安装 Centos 7安装 # 下载安装包,大小115.14 MB wget -c https://download2.rstudio.org/server/centos7/x86_64/rstudio-server-rhel-2023.09.1-…

聊聊logback的ThrowableProxyConverter

序 本文主要研究一下logback的ThrowableProxyConverter ThrowableHandlingConverter ch/qos/logback/classic/pattern/ThrowableHandlingConverter.java /*** Converter which handle throwables should be derived from this class.**/ public abstract class ThrowableHa…

面试官:说说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&…

某音订单接口在电商行业中的重要性及实践应用

一、引言 随着移动互联网的快速发展&#xff0c;短视频平台抖音已经成为人们日常生活中不可或缺的一部分。越来越多的商家开始利用抖音平台推广和销售商品&#xff0c;从而实现商业变现。在这个过程中&#xff0c;抖音订单接口起到了至关重要的作用。本文将详细探讨抖音订单接…

希尔排序(Java)

目录 希尔排序的步骤&#xff1a; Java实现希尔排序&#xff1a; 希尔排序&#xff08;Shell Sort&#xff09;是一种插入排序的改进算法&#xff0c;它通过比较距离较远的元素交换位置&#xff0c;从而实现数据局部的较小规模排序&#xff0c;逐渐减小元素之间的间隔&#x…