Entry Task Black Cat
历时n天,终于把entry task做完了。很多个第一次
第一次用cli4搭建项目
之前用的版本好像是2?,自己快要一年都没有写vue项目了。vue变化真大
第一次用ts+vue写项目。
算是ts的初体验吧。繁琐的类型定义。虽然真的会规避掉很多错误。但是要写多很多代码也是真的。漏写了就红杠杠警告!心累。
ts+vue的项目除了ts语法,vue写起来也有一些不同。
第一次如此严格的eslint
eslint不过关,直接不让编译。哭了
……
唠家常完毕
下面说说这次过程中遇到的坑和收获
-
vue监听列表滚动至底部
https://my.oschina.net/parchments/blog/3163606
一般做法就是,注册监听事件,挂载监听器,设置监听方法(监听方法设置节流/防抖)
这个点遇到比较吊诡的事情就是,监听到的scrollTop一直为0。原因是监听器没有挂对位置。
由此引起一个问题,什么是scrollTop?
当元素纵向排列时,当子容器的高度超出了父容器的高度,并且父容器设置了overflow: scroll
时,此时父容器就会产生了滚动条。
scrollTop正是针对这个滚动条来说的,含义为,元素滚动条内的顶部隐藏部分的高度。
scrollHeight:指父容器的可滚动高度,只读,不可设置
clientHeight:屏幕高度
// 获取clientheight常常使用这种写法
const clientHeight = document.documentElement.clientHeight || document.body.clientHeight
当html文档是否指定了DTD,使用documentElement
没有指定DTD时,使用body
这种写法兼容以上两种情况
当scrollTop+clientheight = scrollHeight时,就是列表滚动到了底部。
- 使用IntersectionObserver监听元素出现,制作锚点定位
(还记得毕设时,小程序对这个api兼容的不好,想使用它,监听常常不生效。现在在vue中,他终于发挥了作用)
异步监听对比列表监听,不用操心监听位置。不用担心监听多次触发。
值得注意的是,IntersectionObserver是一个异步的监听,这意味着,监听引起的变化不会太过灵敏。
创建监听器:createObserver(el, options)。第一个参数为监听的dom节点,options是一些可选的配置项
什么时候注册监听器?
经过尝试,在mounted中注册监听事件,无法获取到ref节点
(这和生命周期概念,mounted完成真实doom节点的挂载不太一样。另一种说法是如果这个节点挂载了v-if这些逻辑,也是找不到的。尝试过普通的节点,也无法获取ref节点)
因此为了百分百获得监听的dom节点,
选择在updated的nextTick中注册监听事件(优化:判断没有注册时才进行注册)
又发现,当我把id,ref挂载到子组件上时,在updated的nextTick中也无法获得这个dom节点。这牵涉到了父子组件生命周期执行顺序的问题。
遗憾: 没有用rem单位去做移动端屏幕的适应
https://juejin.im/post/5b6503dee51d45191e0d30d2
ET就此落幕~
下周进行看文档学习