留学择校2.0改版总结

前前后后写了一个半月,12月底加班了两个周末,周中也在加班,还是有点痛苦的

问题出在哪呢?

数据库页面复杂度估计不足,这个页面现在有两千行。
复杂的地方在于:

  1. 有三个tab: 院校库,专业库, 案例库
  2. 每个tab有筛选条件
  3. 两个tab有加载更多
  4. 每个tab有搜索条件

选校页面也比较复杂,复杂的点是滑动删除选校的交互
院校详情页,有视频的时候,样式不同

多催设计,别瞎等

uniapp开发的优点

  1. 代码提示更好
  2. 有computed
    uniapp开发的缺点
  3. xml, js, css全在一个文件里,代码量比较大
  4. 报错不好定位
  5. 很多报错
  6. 弹窗组件的隐藏,需要在外界设置?? 内部私有属性呢?

遇到并解决的问题&学到的技术,技巧:

  • 数组限制展示的数量,可以在xml里面用index判断, 不必在js里面截取数组
  • view作为容器,可以直接显示文字,不用一定夹一个 标签。有时候样式不对,还是要夹个标签
  • 循环生成的组件,如果绑定的key 是固定的,有可能会出bug
<view class="ibItem" :class="index == activeIdx ? 'ibActive' : '' " v-for="(item, index) of products"
					 @tap="sectonItemTap(item , index)" :key="ibKey">

上面的写法,无法定位了,去掉:key="ibKey" 就好了

  • 选校不能删除
<block v-for="(item, index) in sData.list" v-if="isHome">

				<school-moveableview :sData="item" @deleteSchool='moveableDelete' @editCallBack='moveableEdit' v-if="index < 5"
					:selfId='index' :operatingId='operatingId' @opShowCallBack='opShowCallBack'></school-moveableview>

			</block>

			<block v-else>
				<block v-for="(item, index) in sData.groupList">

					<view class="groupBox" v-if="item.list.length > 0" :style="{'margin-top': index == 0 ? '0' : '20rpx'}">
						<image class="gbTitleIcon" :src="item.icon"></image>

						<block v-for="(seitem, seindex) in item.list">

							<school-moveableview :sData="seitem" @deleteSchool='mDelete' @editCallBack='moveableEdit'
								:multipleSelect='multipleSelect' :selfId='index-seindex' :operatingId='operatingId'
								@opShowCallBack='opShowCallBack' @selectCallBack='selectCallBack'></school-moveableview>
						</block>

					</view>
				</block>


			</block>


第一个<school-moveableview 的 deleteSchool可以正常回调, 但是else里面这个deleteSchool不能回调, 最后发现第二个<school-moveableview在双层循环中, item没有修改
我之前这么写的,回调就调用不了:

<!-- 循环中的item 要修改,否则无法回调 -->
<block v-for="(item, seindex) in item.list">

							<school-moveableview :sData="item" @deleteSchool='mDelete' @editCallBack='moveableEdit'
								:multipleSelect='multipleSelect' :selfId='index-seindex' :operatingId='operatingId'
								@opShowCallBack='opShowCallBack' @selectCallBack='selectCallBack'></school-moveableview>
						</block>
  • 取数据的语法
const {
  clientX,
  clientY
  } = event.touches[0];
  • 加选校的动效

			dotAnimate(event) {
				const {
					clientX,
					clientY
				} = event.changedTouches[0]; // 设置小红点初始位置
				this.dotLeft = clientX + 'px';
				this.dotTop = clientY + 'px';
				const num = 30;
				const track = [];
				for (let i = 0; i < num + 1; i++) {
					const [x, y] = this.twoBezier(i / num, [clientX, clientY], [clientX - 60, clientY - 120], [this
						.endLeft,
						this.endTop
					]);
					track.push({
						opacity: 1,
						left: `${x}px`,
						top: `${y}px`
					});
				}
				track[num].opacity = 0;
				let i = 0;
				const inter = setInterval(() => {
					if (i === num + 1) {
						clearInterval(inter);
						return;
					}
					const {
						opacity,
						left,
						top
					} = track[i];
					this.dotOpacity = opacity;
					this.dotLeft = left;
					this.dotTop = top;
					i++;
				}, 10);
			},
			/**
			 * @desc 二阶贝塞尔
			 * @param {number} t 当前百分比
			 * @param {Array} p1 起点坐标
			 * @param {Array} cp 控制点
			 * @param {Array} p2 终点坐标
			 */
			twoBezier(t, p1, cp, p2) {
				const [x1, y1] = p1;
				const [cx, cy] = cp;
				const [x2, y2] = p2;
				const x = (1 - t) * (1 - t) * x1 + 2 * t * (1 - t) * cx + t * t * x2;
				const y = (1 - t) * (1 - t) * y1 + 2 * t * (1 - t) * cy + t * t * y2;
				return [x, y];
			},

  • computed 计算属性, 注意跟method平级
  • 组件使用ref, 在外部直接调用组件内方法
this.$refs.csRef.hideAllOptions()
  • 弹窗组件可以写个selfShow ,可以少写一个回调
  • 滑动删除的不完美优化
handleTouchEnd: function(event) {
				console.log('拖动结束!!', event)
				if (this.multipleSelect) {
					return
				}
				const {
					clientX,
					clientY
				} = event.changedTouches[0];
				const {
					start_x,
					start_y
				} = this;

				let vertical = Math.abs(clientY - start_y)
				// if (Math.abs(clientY - start_y) > 95) return; // 处理上下滑动误触左右滑动的情况

			

				if ((clientY - start_y) > 50) {
					console.log(11111111111111)
					this.hideOperations();
				} else {
					
					let yOffset = Math.abs(clientY - start_y)
					let xOffset = Math.abs(clientX - start_x)
					if(yOffset > xOffset) {
						this.hideOperations();
						return	
					}

					const direction = clientX - start_x;

					// 这里使用1来判断方向,保证用户在非滑动时不触发滚动(有时点击也会产生些许x轴坐标的变化)
					if (direction < -1) {

						this.showOperations();
					} else if (direction > 1) {

						this.hideOperations();
					} else {

						// this.toBrandDetail();
					}
				}

			},

TODO:

1.数据库页面,swiper滚动,嵌套swiper 50个数据安卓卡顿
2.选校页面滑动我的选校,手指到区域外,不能展开(现在统一收起了)
3.留学总监封装
4. 报错修复

看看改过的bug, 代码

mark:
https://admin.guixue.com:9889/backend/workplace/task/1009/1540 )

posted on 2024-01-19 17:00  土匪7  阅读(3)  评论(0编辑  收藏  举报