微信小程序 uniapp 电商项目使用scroll-view实现左右菜单联动,点击菜单子分类联动对应商品

这篇具有很好参考价值的文章主要介绍了微信小程序 uniapp 电商项目使用scroll-view实现左右菜单联动,点击菜单子分类联动对应商品。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近写了个微信小程序项目,一开始不理解scroll-view用法,用的另外一种方法写的,虽然实现了效果,但是代码层面来说,不大合理,后来又通过努力,用scroll-view实现了效果。现写个文章做个记录,方便自己和大家学习记录。

效果图请看第一张。布局:左右布局,右边又分为上下布局。

左侧是一级菜单,即为商品大类。

右上方二级菜单,是每个商品大类对应的子类,当点击左侧大类的时候,右上的子类是对应的变化。

右下方是商品数据,即每个二级菜单对应的商品数据。右下方粉色加粗的部分是每个商品所属的子类标题。

不会弄动图,我就叙述一下完整的效果是:点击左侧第二个大类,展示对应的子类,默认是高亮第一个子类,如果点击右上方对应的子类有黑色高亮效果,并且右侧下方的商品滚动到该子类对应商品的位置。如果滚动右侧下方的商品数据,右侧上方的对应子类会高亮,对应的大类也会高亮。

为了避免点击右上方二级分类的时候反复调接口的操作,所以后台将所有的数据一次性返回给我。该页面初始化加载数据只调用一次接口。然后前端自己将数据处理之后使用。

uniapp二级菜单,微信小程序uniapp,微信小程序,uni-app,小程序,vue.js

数据格式大致如下所示: 

classifyData: [{
						id:11,
						groupName: "大类1",
						children: [
							{
								id:1,
								groupName:'子类1-1',
								goodsSalesList:[
									{salesId: "101",salesName:'订单1-1'},
									{salesId: "102",salesName:'订单1-2'},
								]
							},
							{
								id:2,
								groupName:'子类1-2',
								goodsSalesList:[
									{salesId: "201",salesName:'订单2-1'},
									{salesId: "202",salesName:'订单2-2'},
								]
							}
						],
					},{
						id:22,
						groupName: "大类2",
						children: [
							{
								id:3,
								groupName:'子类2-1',
								goodsSalesList:[
									{salesId: "301",salesName:'订单3-1'},
									{salesId: "302",salesName:'订单3-2'},
								]
							},
							{
								id:4,
								groupName:'子类2-2',
								goodsSalesList:[
									{salesId: "401",salesName:'订单4-1'},
									{salesId: "402",salesName:'订单4-2'},
								]
							}
						],
					},{
						id:33,
						groupName: "大类3",
						children: [
							{
								id:5,
								groupName:'子类3-1',
								goodsSalesList:[
									{salesId: "501",salesName:'订单5-1'},
									{salesId: "502",salesName:'订单5-2'},
								]
							},
							{
								id:4,
								groupName:'子类2-2',
								goodsSalesList:[]
							}
						],
					},
				],

 页面template代码如下:

<template>
	<view class="content">
		<view class="ld">
			<view class="left">
				<view v-for="(item,index) in classifyData" :key="index" @click="setid(index)"
					:class="classifyDataIndex==index?'active':'activeDefault'">
					{{item.groupName}}
				</view>
			</view>
			<view class="right">
				<view class="stickyBox">
					<view class="beforeActive" style="display: flex;justify-content: center;">
						<template v-for="(items,index) in classifyData[classifyDataIndex].children" :key="index">
							<view class="categoryName" @click="classifyActive(index,$event,items,classifyDataIndex)"
								:class="activeClassify == index ? 'activeClass':'categoryName'" style="margin: 0 10px ;">{{items.groupName}}
							</view>
						</template>
					</view>
				</view>
				<scroll-view :scroll-y="true" style="white-space: nowrap;height: 200px;" :scroll-into-view="clickId"
					:scroll-with-animation="true" @scroll="scroll" @scrolltolower="scrolltolower ">
					<template  v-for="(classifyDataModel,classifyDataIndex) in classifyData" :key="classifyDataIndex">
							<view class="" v-for="(item,index) in classifyDataModel.children" :key='index' :class="classifyData.length==classifyDataIndex+1&&classifyDataModel.children.length==index+1?'classifyDataMinHeght':''">
								<view class="title"  :id="'Index_'+classifyDataIndex+'_'+index">
									<view class="">- {{item.groupName}} -</view>
								</view>
								<template v-if="item.goodsSalesList.length!=0">
									<view class="" v-for="(dd,ee) in item.goodsSalesList" :key='ee' style="padding:30px 0;">
										{{dd.salesName}}
									</view>
								</template>
								<template v-else>
									<view class="goods-details-box2" style="padding:30px 0;">暂无商品</view>
								</template>
							</view>
					</template>
				</scroll-view>
			</view>
		</view>
	</view>
</template>

 页面script代码如下:

<script>
	export default {
		data() {
			return {
				classifyData: [//数据格式
					{
						id:11,
						groupName: "大类1",
						children: [
							{
								id:1,
								groupName:'子类1-1',
								goodsSalesList:[
									{salesId: "101",salesName:'订单1-1'},
									{salesId: "102",salesName:'订单1-2'},
								]
							},
							{
								id:2,
								groupName:'子类1-2',
								goodsSalesList:[
									{salesId: "201",salesName:'订单2-1'},
									{salesId: "202",salesName:'订单2-2'},
								]
							}
						],
					},{
						id:22,
						groupName: "大类2",
						children: [
							{
								id:3,
								groupName:'子类2-1',
								goodsSalesList:[
									{salesId: "301",salesName:'订单3-1'},
									{salesId: "302",salesName:'订单3-2'},
								]
							},
							{
								id:4,
								groupName:'子类2-2',
								goodsSalesList:[
									{salesId: "401",salesName:'订单4-1'},
									{salesId: "402",salesName:'订单4-2'},
								]
							}
						],
					},{
						id:33,
						groupName: "大类3",
						children: [
							{
								id:5,
								groupName:'子类3-1',
								goodsSalesList:[
									{salesId: "501",salesName:'订单5-1'},
									{salesId: "502",salesName:'订单5-2'},
								]
							},
							{
								id:4,
								groupName:'子类2-2',
								goodsSalesList:[]
							}
						],
					},
				],
				clickId: "",
				classifyDataIndex: 0,//默认展示的大类下标
				activeClassify:0,//默认展示的子类下标
				RightTopArr:[],
			}
		},
		onReady() {
			this.getList(); //初始化加载
			this.getNodesInfo();
			
		},
		onLoad() {
			
		},
		methods: {
			getList() {},//此处调接口拿到数据并自行处理
			setid(i) {//点击大类
				this.classifyDataIndex = i;
				this.activeClassify=0;//子类状态
				this.clickId ='Index_'+i+'_'+0
			},
			classifyActive(index, event, items,classifyDataIndex){//点击子类
				this.classifyDataIndex=classifyDataIndex;//大类状态与下标一致
				this.activeClassify=index;//子类状态
				
				this.clickId='Index_'+this.classifyDataIndex+'_'+this.activeClassify;
			},
		    scroll(e) {//右侧商品滚动
				let scrollTop = e.target.scrollTop;
				console.log(scrollTop,'scrollTop')
				for(let  index  in this.RightTopArr){
					let data=this.RightTopArr[index];
					if(e.target.scrollTop>=data.height && index==this.RightTopArr.length-1?true:e.target.scrollTop <this.RightTopArr[parseInt(index)+1].height){
						  let myArrData =data.id.split("_");
						   this.classifyDataIndex=myArrData[1];
						   this.activeClassify=myArrData[2];
						return ;
					}
				}
			},
			getNodesInfo() {//滚动的距离
				new Promise(resolve => {
					let selectorQuery = uni.createSelectorQuery();
					// 获取节点的位置信息
					selectorQuery.selectAll('.title').boundingClientRect((rects) => {
						// 如果节点尚未生成,rects值为[](因为用selectAll,所以返回的是数组),循环调用执行
						if (!rects.length) {
							setTimeout(() => {
								this.getNodesInfo();
							}, 10);
							return;
						}
						// 生成之后开始添加进去数组
						rects.forEach((rect) => {
							console.log(this.RightTopArr,'this.RightTopArr')
							let tops=rect.top - rects[0].top;// 这里减去rects[0].top,是因为第一项顶部不是贴到导航栏=>每一个商品距离顶部的高度,如果此页面顶部没有其他的view那就不用减去rects[0].top,自己视情况而定。
							this.RightTopArr.push({height:tops,id:rect.id}); 
							resolve();
						})
					}).exec()
				})
			},
			// 滚动到底部/右边,会触发 scrolltolower 事件
			scrolltolower() {
				setTimeout(() => {
					// this.classifyDataIndex = this.classifyData.length;
					console.log('滚动到底部了')
				}, 10)
			},
		}
	}
</script>

样式代码如下:文章来源地址https://www.toymoban.com/news/detail-630119.html

<style lang="scss" scoped>
	.stickyBox {
		width: 80%;
		display: flex;
		background-color: #FFFFFF;
		.beforeActive {
			width: 600rpx;
			height: 85rpx;
			overflow: hidden;
			display: flex;
			justify-content: flex-start;
			flex-wrap: wrap;
			.categoryName {
				margin: 20rpx;
				padding: 10rpx;
				background-color: #E5E5E5;
				height: 30rpx;
				font-size: 20rpx;
				font-weight: 400;
				line-height: 28rpx;
				color: #333333;
				opacity: 1;
			}
	
			.activeClass {
				margin: 20rpx;
				padding: 10rpx;
				background-color: #333333;
				height: 30rpx;
				font-size: 20rpx;
				font-weight: 400;
				line-height: 28rpx;
				color: #FFFFFF;
				opacity: 1;
			}
		}
	
		.active {
			width: 600rpx;
			height: auto;
			overflow: visible;
			display: flex;
			justify-content: flex-start;
		}
	}
	
	.ld {
		display: flex;
		border: 1px solid black;

		.left {
			width: 100px;
			text-align: center;
			border-right: 1px dashed #007AFF;

		}

		.right {
			flex: 1;
			padding-left: 10px;
		}
	}

	.title {
		font-size: 20px;
		font-weight: bold;
		background-color: pink;
	}
	.activeDefault{
		height: 50px;
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}
	.active {
		background-color: darkgoldenrod;
		height: 50px;
		display: flex;
		    flex-direction: column;
		    align-items: center;
		    color: #ffffff;
		    justify-content: center;
	}
.classifyDataMinHeght{
		min-height: 100vh;
	}
</style>

到了这里,关于微信小程序 uniapp 电商项目使用scroll-view实现左右菜单联动,点击菜单子分类联动对应商品的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电商商城小程序项目完整源码(微信小程序)

    微信公众号:创享日记 发送:简商城 获取完整源码(导入微信开发者工具即可) 【ChatGPT】前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击查看学习资料) 1、首页 点击轮播图可以跳转详情页 点击专享礼包可以

    2024年02月11日
    浏览(46)
  • UniApp项目中 使用微信小程序原生语言 进行开发

    wxcomponents 下放的是微信小程序原生代码写的组件。我进行了封装 在你下uniApp 项目的根目录创建一个 wxcomponents 名字千万不要错 京东、支付宝灯参考下面图片 官方文档也有介绍 然后在你需要引入原生功能的页面里面引入你的组件(我这里提前已经放过来了。在上面图可看到

    2024年02月04日
    浏览(75)
  • 微信小程序 scroll-view组件的基本使用

     scroll-view 组件 其实和view组件很像,结合上节课的内容我们接着尝试教大家一下这个组件怎么使用,现实中这个组件能实现的效果又有那些  上图是CSDN的一个私聊窗口界面,我么看图就能想象的到,左边的聊天对像窗口是不是可以滚动的,这时候小程序就可以通过scroll-vie

    2024年02月01日
    浏览(67)
  • 微信小程序项目实例源码——本地电商平台小程序

    该微信小程序项目使用了 vant ui 组件库,项目页面完整、功能全部有效! 本项目为小程序前端项目,可以直接导入微信开发者工具中打开,可用于计算机专业的课程设计、毕设项目,也可作为商用小程序的前端页面模板。 2.1 首页 在首页中使用了轮播图作为头部 banner 广告,

    2024年02月10日
    浏览(49)
  • 使用VS Code创建编写uniapp项目(vue3+ts 微信小程序)

    uni-create-view :用于快速创建 uni-app 页面 uni-helper uni-app :代码提示 uniapp 小程序扩展 :鼠标悬停查文档 1.在types属性中添加属性名 @types/wechat-miniprogram 和  @uni-helper/uni-app-types. 2.添加vueCompilerOptions选项 ①在VS Code中找到设置 ②在设置中搜索文件关联 ③添加这两个文件名,值为

    2024年04月27日
    浏览(71)
  • uniapp vue3 微信小程序 项目中使用 websocet、微信小程序真机调试 websocket 报错 errMsg: “Invalid HTTP status.“

    uniapp-websocket官方文档 注意点:需要在确定建立连接后才能去发送数据 这个错误通常是因为小程序 WebSocket 请求的地址没有配置为 HTTPS,而是使用了 HTTP,因此需要注意以下几点: 小程序开发者工具可以支持使用 ws:// 前缀的 WebSocket 地址,但在真机上会因为不安全的原因而无

    2024年01月17日
    浏览(67)
  • 【微信小程序】动态修改page的wxss样式/scroll-view使用/监听子组件

    静态写法 直接使用下面的写法,是静态的。 动态写法 在wxml最外层套一个自己定义的page的class。 如果想修改.page的样式,再用普通的动态class判断改变就可以了。 例如:改变背景颜色 参考:微信小程序如何动态修改page标签的css样式 设置id时需要注意下:id 的设置要求是字母

    2024年02月05日
    浏览(65)
  • 微信小程序使用scroll-view导致吸顶无效或vant-sticky吸顶无效

    我们先清楚为什么要使用scroll-view? 在做回到顶部时,需要拿到实时的滚动距离,这时候就得使用上scroll-view了 记录一次在做 微信小程序开发时,在没有使用scroll-view的时候,我们使用vant-sticky做吸顶效果的时候可以正常使用。 但是当我们使用scroll-view时,突然发现吸顶失效

    2024年02月09日
    浏览(54)
  • uniapp微信小程序(商城项目)

    于是在跟着某站上学着做了一个小程序, 主要是为了学uniapp和vue 。某站黑马优购 完成的功能主要有:首页、搜索、分类和购物车。 有人问了为什么没有登录、和添加订单呢? 问的很好,下次别再问了 其实我也想跟着视频做,但视频是2021年的,一些uniapp的方法早就更新了,

    2024年04月27日
    浏览(47)
  • uniapp微信小程序项目启动步骤

    如何创建项目就不说了,可以参考该链接: 如何创建开发uniapp微信小程序项目?链接: link 这里主要记录的是,从代码仓库拉取到本地后, 本地启动运行项目,遇到的问题。 1.下载项目 使用git bash 将代码下载到本地 git clone https://gitlab.xx.xxxxx.com/xxxxx/wuhan-cloud-web.git 拖到HBuild

    2024年02月05日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包