01-image mode属性(了解)
图片裁剪、缩放的模式。
学习时可以类比于css background-size:cover,contain
- scaleToFill不保持纵横比,短边拉伸
- aspectFit 保持纵横比,长边显示,短边留空
- aspectFill保持纵横比,短边显示,长边截取
- widthFix保持纵横比,宽度不变,高度自动变化
注意点:
- 如果图片显示的区域的纵横比和原图片是一致,不管用什么模式都是一样的效果
- 设计稿的图片宽高尽量要和后端返回的图片宽高的比例保持一致
02-搜索列表-输入框输入触发搜索
- 输入框键盘类型
- confirm-type=" search "
- 输入框输入内容,点击右下角按钮时,触发关键字搜索(搜索第一页),清空原来的列表
- v-model:keyword用来获取内容
- 点击右下角按钮时,触发关键字搜索(搜索第一页)
- @confirm:search方法
- search的逻辑,pageNum:1, 清空goodsList,并查询商品列表
- 下拉刷新和输入框触发搜索的逻辑完全一致
- 抽取一个公共的方法reload
03-搜索列表-请求不需要loading
- 分页的场景一般无须中央的loading
- 在queryGoodsList,里面传参isLoading:false
- 在公共请求方法里面替换掉BASE_URL
const BASE_URL = 'https://api-ugo-dev.itheima.net'
- 需要在搜索列表页面,图片的属性修改为goods_small_logo
04-搜索列表-请求中,不再发请求
- 补充:运行到内置浏览器时,下拉动画一直都在; 微信开发者工具,下拉动画时间太长
- 请求结束后,主动停止下拉动画
- wx.stopPullDownRefresh
- 现象:下拉刷新,还在Loading中,就可以发请求
- 解决方法:
- 设置data属性为isRequesting:false
- 请求前,判断如果状态是请求中,返回
- 进入请求前,设置状态为请求中
- 结束请求后,设置状态为请求结束
- 注意点
- 先判断是否在请求中,再进入请求后,设置请求中的状态
- 如以下的代码,顺序反的话,总是return
// 进入请求前,设置状态为,请求中
this.isRequesting = true
// 请求前,判断.如果在请求中,就返回
if(this.isRequesting){
return
}
05- 搜索列表-如果已经到最后一页,没必要再发请求
- 现象:已经到了最后一页,上拉时依然会触发发请求,请求回来的数据空的。
- 解决方案:
- 到最后一页,后续的请求不必发了
- 如何判断是否到最后一页了?
- 方案
- 如果返回数据是空的。还是多发一次请求
- 判断返回数据长度<PageSize
- 如果最后一页长度和pagesize相等,也会多发一条
- total和列表总长度对比(最优的)
// 列表长度和total对比
if(data.total<=this.goodsList.length){
this.isLastPage = true
}
- 设置data属性isLastPage
- 在请求前判断,如果是最后一页就不发请求
06- 搜索列表-最后一页提示
- 先添加样式
- 如果是最后一页,显示对应的提示
注意点:
- uniapp里面v-show支持得不好
v-show="categoryList.length"
07-搜索列表-搜索和过滤栏固定定位
onPageScroll
- 先用样式把搜索和过滤栏固定
- 用view把搜索和过滤栏包裹起来
- 定位用fixed,相于对屏幕,不是相对于滚动的盒子。不能用absolute
.top-header {
position: fixed;
width: 100%;
background-color: #fff;
top: 0;
}
.goods-list {
margin-top: 220rpx;
}
- 下拉时,下拉动画被遮住了
- 下拉时,把.top-header的定位改回static
- 经过第2步的分析,方案
- 设置data属性isFixed:false/true
- 下拉时,设置isFixed:false
- 不下拉时,设置isFixed:true
- 监听页面滚动onPageScroll
- 结构中根据isFixed来设置样式
08-搜索列表-删除部分data属性
- 在结构中使用的变量,都应该是data属性
- 不在结构中使用的变量,不应该声明为data属性
- 为什么呢?Vue监听data属性是耗性能
- 那变量声明哪里呢?
- 声明在vue外边
const PAGE_SIZE = 6;
export default {
- 添加为Vue实例的属性
onLoad(options) {
// Vue实例添加属性
this.pageNum = 1;
},
- 确认一下data属性里面哪一些属性并没有在结构中使用
- pageNum
- isRequesting
09-搜索列表-搜索和过滤栏固定定位-sticky方案
- sticky
- 相对于滚动的父DOM
- 定位,可以使有left,top,bottom,right
- 确认兼容性
- caniuse网站
- 使用
.top-header {
position: sticky;
top: 0;
left: 0;
right: 0;
background-color: #fff;
}
10-git冲突的解决
- 何时出现git冲突
- 当git无法判断使用哪一段代码的时候
- 具体场景
- 在本地回滚提交,再提次,本地提交和回滚前的提交有相同文件的改动
- 两个程序员修改同一文件,后推送代码的人就会冲突
- 如何解决
- git pull
- 然后解决冲突
- 用别人的代码,删除自己的
- 用自己的代码,删除掉别人的(需要沟通)
- 两者都用(需要沟通的)
- 再提交推送
注意点:
- 可以利用vscode来解决冲突
- 解决完冲突后,依然需要git add., git commit,git push
- 最终的代码不能出现<<<<,====
11-搜索列表-自测
为什么要自测?
- 有些时候程序员比测试更容易发现bug
- 程序员自测才能让自己更专业
如何自测?一般都按照功能来自测
- 从三级分类带上三级分类名跳转到搜索列表页,输入框显示三级分类名,同时列表显示keyword搜索的第一页数据
- 分类页面vfor嵌套不要用相同的下标名
- 输入框输入内容,列表的数据为输入框内容搜索的第一页数据
- isLastPage需要重置为false
- 下拉刷新:按之前的关键字进行搜索,列表的数据为输入框内容搜索的第一页数据
- isLastPage需要重置为false
- 上拉加载:按之前的关键字,pageNum++,追加数据,到最后一页,就不再发请求
注意点:
- 微信开发者工具,模拟器输入框可能无法输入中文。用手机扫码预览是没有问题,忽略。
12-非Tabbar页与页面栈
页面栈
概念
- 存放所有的页面的栈,先进后出
- 举例A->B->C,
如何查看
方法getCurrentPages
有什么用
- 方便理解页面路由,A打开B,B入栈,A隐藏,B初始化
- B返回A, B销毁并出栈,A显示的
13-Tabbar页与页面栈
传送门
tab栏的作用
为应用提供多入口的
tabbar特点:
- 页面栈是存放所有的具有返回关系的页面
- AppData里面可以看到所有活动的页面路径
- 同一时间只有一个tabbar页面会入栈
- switchTab跳转到tabbar页面,销毁所有非tabbar页面
总结:非tabbar页面,打开就入栈,返回就出栈销毁。tabbar切换就入栈/出栈,并不会销毁
14-场景值
传送门
概念
小程序的入口
使用方法
onShow: function (options) {
console.log('场景值: '+options.scene)
},
作用
- 获取小程序入口
- 事件上报,统计哪种小程序入口更有效
扩展:事件上报
- PV 页面一天被访问的次数
- 每次页面被访问时,告诉后端页面url即可
- UV 页面一天被多少用户访问
- 每次页面被访问时,告诉后端页面url,还有uid
- 点击流 某个button,某个image一天被点击的次数
- 给目标dom一个唯一标识,每次被点时,告诉后端即可
- dom一个唯一标识就是埋点
注意点
- 事件上报就是给后端发请求
- 接口
- new Image().src="url"是跨域
15-uniapp生命周期
uniapp的生命周期
- 应用的生命周期和微信小程序完全一致
- 页面的生命周期和微信小程序完全一致
- 组件的生命周期和Vue完全一致,不要使用onLoad…
16-字体图标
阿里矢量图标库
以项目方式管理图标
- 先在图标库找到图标,加入购物车
- 创建项目,图标加入到项目
- 生成链接
注意点:
- import不支持网络路径 //把生成的css单独建立一个文件并复制到里面,然后在app.vue 导入字体图标的这个css文件@import url("./css/iconfont.css");