谈谈面试时遇到的uniapp框架的问题?
1、我告诉面试官,我写的是app项目,用的是uni-app框架,面试官反问我是H5?我说不是 ,就是app,面试官又说uniapp不就是H5,我当时还一愣一愣的,后来我查了一下,确实可以说uniapp是H5,虽然官网没有这么介绍,但是开发的uniapp项目相当于是H5页面,只是装在了Android壳子中,其实开发的还是页面。另外,uniapp是可以跨平台使用,可以发布在app平台、H5平台和小程序平台,可参考以下图:
2、请说一下在uniapp开发中下拉刷新、上拉加载的原理?
(1)下拉刷新:
原理:大部分的下拉刷新控件,都是用contentInset实现的。默认情况下,如果一个UIScrollView的左上角在导航栏的正下方,那么它的contentInset是64,而contentOffset是-64。继续下拉的话,contentOffset就会越来越小,如果上滑,contentOffset就会增大,直到左上角达到屏幕的左上角时,contentOffset刚好为0。
默认情况下,如果下拉一个UIScrollView,在松手之后,会弹回初始的位置(导航栏下方)。而大部分的下拉刷新控件,都是将自己放在UIScrollView的上方,起始y设置成负数,所以平时不会显示出来,只有下拉的时候才会出现,放开又会弹回去。然后在loading的时候,临时把contentInset增大,相当于把UIScrollView往下挤,于是下拉刷新的控件就会显示出来,然后刷新完成之后,再把contentInset改回原来的值,实现回弹的效果。
问题:采用下拉刷新获取数据列表,请求完最后一页的数据后,不小心又进行了一次下拉操作,相当于又重新请求了一次,为了避免这种重复请求的现象,有什么方法?
答:可以通过uni.startPullDownRefresh(),在onLoad中(即页面刚加载进来时)调用该API实现开始下拉功能;在下拉刷新函数中,调用后台接口获取每一页的数据,将每次获取的数据列表累加起来,直到请求到最后一页数据后,调用uni.stopPullDownRefresh(),关闭下拉刷新,这时,即便再次下拉,也不会请求到接口数据了。
(2)上拉加载:
原理:
- 滚定区域是给固定高度, 设置overflow-y:auto来实现
- 触发条件:可视高度 + 滚动高度 >= 实际高度
- 可视高度:通过dom的
offsetHeight
获取, 表示区域固定的高度; 但是更加推荐使用getBoundingClientRect()
来获取高度, 因为使用前者会引起浏览器回流, 造成一些性能问题
- 滚动高度:滚动事件中通过
e.target.scrollTop
获取, 表示滚动条距离顶部的px
- 实际高度:通过dom的
scrollHeight
获取, 表示区域内所有内容的高度(包括滚定距离), 也就是实际的高度
问题与回答同上。