Vue中常见问题解决
项目地址
https://github.com/Zephon-H/vue-store ## 使用Better-Scroll时由于计算高度时,图片未加载出来所以高度计算错误,滚动会有问题,如何解决?
- 监听每一张图片是否加载完成,每张图片加载完成后就执行一次scroll的refresh()的方法
如何监听图片加载完成?
- 原生的JS方式
img.onload=function(){}
- Vue中监听:
@load='方法'
如何将图片所在vue中的监听到的图片加载完成事件传给Home.vue中
因为涉及到了非父子组件的通信,所以这里可以采用vuex或事件总线的方法
事件总线的方法步骤
- 在main.js中
Vue.prototype.$bus = new Vue()
- 在图片组件中给图片加上
@*load*="imageLoad"
并在imageLoad()方法中*this*.$bus.$emit('itemImageLoad')
- 在Home组件中
this.$bus.$on('itemImageLoad',()=>{o})
对于refresh频繁的问题,如果处理?
- 在main.js中
进行防抖
防抖函数起作用的过程:
- 如果我们直接执行refresh,那么refresh会被执行n次
- 可以将refresh函数传入到debounce函数中,生成一个新的函数
- 之后在调用非常频繁的时候,就调用新生成的函数
- 而新生成的函数,并不会非常频繁的调用,如果下一次执行来的非常快,那么会将上一次的取消掉
1
2
3
4
5
6
7
8
9debounce (func, delay) {
let timer = null
return function (...args) {
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
func.apply(this, args)
}, delay)
}
}
tab选项卡的吸顶效果
- 获取offsetTop
- 必须知道滚动到多少时,开始有吸顶效果,这个时候,就需要获取tab的offsetTop
- 但是如果直接在mounted中获取offsetTop,那么值不正确,因为可能有图片未加载
- 监听滚动,动态的改变tab的样式,动态改变tab的样式时会出现两个问题
如何获取正确的offsetTop?
- 由于swiper中图片较大,当swiper中图片加载完后,可视为所有图片加载完,所有监听swiper中img加载完成
- 加载完成后,发出事件,在home中获取正确的值
- 为了swiper不多次发出事件,可以设置一个变量isLoad进行状态记录
当动态改变tab的样式时,下面的商品内容会突然上移,且tab虽然设置了fixed,但也会随着better scroll一起滚出去,如何解决?
- 通过其它方法实现相同效果
- 在最上面,多复制一个tab组件,用它实现停留效果
- 当用户滚动一定的位置时,复制的tab显示,未到该位置,则隐藏
加入详情页后,点击所有商品进入的详情页内容是同一个?
- 由于前面使用了keep-alive,所有离开详情页后,结果只是将detail转为deactive,再进入不会执行created中的更新id、加载数据的方法,所以需要在keep-alive中使用exclude="Detail"排除详情页
如何将时间戳转成格式化字符串?
- 将时间戳(单位是秒)转成Date对象
const date = new Date(t*1000)
- 将date进行格式化,转成对应的字符串
date.getYear()+date.getMonth()+1...
部分语言中可以使用fmt.format(date,'yyyy-MM-dd hh:mm:ss')