项目整理笔记自用

101 阅读3分钟

易寻

hash路由模式下的导航栏

image.png
因为网站使用的是hash模式路由,所以肯定不能用href="#abc"来跳转了,我这里是通过判断各种高度来实现导航功能。首先我们要给每个导航设定一个index,方便设定样式以及获得跳转的目的地址

  1. 导航栏的定位
    这里获取导航栏的offsetTop,然后获取滚动条的高度scroll,如果scroll大于offsetTop,导航栏就变成固定定位,否则为绝对定位
  2. 判断当前的位置,触发对应的样式
    首先将每一部分的offsetTop都传到导航栏这个组件中,用一个数组offsetTopArr存储。我们遍历这个数组,如果当前滚动条的高度大于等于这个下标的offsetTop,那么就将activeIndex设为这个下标(相当于之前的部分已经被完全覆盖)。如果被卷去高度document.body.scrollTop + 视窗高度document.body.clientHeight === 正文高度document.body.scrollHeight,也就是滚动条到底了,那么也算作处于最后一个
  3. 编写点击事件,使用requestAnimationFrame 这个就是判断scrollToptargetOffset,判断是要上移还是下移。然后平移的动画使用requestAnimationFrame。
    window.requestAnimationFrame() 告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行

使用html2canvas.js和jspdf.js实现简历生成PDF

这个好像也没什么好说的

webpack相关

CDN

引入CDN资源,具体就是在vue.config.js里配置externals,使打包的时候不对某些资源进行打包,然后再index.html里script标签引入即可。
前端性能优化 - 使用内容分发网络CDN - 掘金 (juejin.cn)

博客

虚拟列表

虚拟列表就是只渲染可视区以及缓冲区的DOM元素。我的项目是这样一个场景,首页是一个博客list,每次点击加载更多都会再加载9个item进list。其实这个场景大可不必用虚拟列表,因为不是同时渲染大量DOM,不过就当学习了。而且如果每次点击加载的数据的endIndex是通过其他页面传来的query参数(刷新后不丢失)确认,刷新后就会有渲染大量DOM的场景。下面讲讲实现的思路。

image.png

思路

首先需要完成以下几点

  • 可视区域的高度(这里我陷入的一个误区,是否有必要纠结头部和底部导航栏的高度对可视区域的影响?其实没啥必要,顶多也就两个DOM的高度)
  • 列表项的高度(数量 * 每项高度)
  • 可视区域能展示的数量(Math.floor(可视区域高度 / 每项高度) + 2 +2是考虑上下展示不全的项目)
  • 开始索引(Math.floor(被卷曲高度scrollTop / 每项高度))
  • 结束索引(开始索引 + 可视区域展示的数量)
  • 展示区域相对渲染区域的偏移量(scrollTop - scrollTop%每项高度 还是考虑展示不全的部分)
  • 缓冲区渲染(这部分没做,要做的话就是再每次对总数据slice获得渲染区域数据的时候,给start - 可视区域展示数量,end + 可视区域展示数量,当然也要判断start会不会大于0,end会不会小于0的情况,用Math.min/max就好了, 这样就相当于多渲染了两个可视区域的数据,也不会影响原来的算法)
  • 对滚动事件进行节流(节流使其不一直触发,这也是为什么要缓冲区,防止白屏)

集成开源markdown编辑器mavon-editor

这也没啥好说的,不是我自己做的,拿来用而已

文章专栏项目

vue3.0+ts,照着视频写的,写的稀巴烂,放到最后

抽离表单组件

抽离上传组件