eslint prettier husky commitlint src-@
vueuse router axios anywhere 随启随用的静态文件服务器 ——失败 删除了
src\utils\flexible.js
axios相应拦截器 跨域 环境变量 dev prod
src\libs\svg-icon\index.vue 在Vue应用中安装和使用一个自定义的SVG图标组件库。 把封装的svg插件,在vite中注册:vite-plugin-svg-icons main.js注册
1 选中的 item 下标:currentCategoryIndex 2 所有 item 元素:itemRefs 3 ul 的横向滚动偏离位置:ulScrollLeft 4 最后在 currentCategoryIndex 发生改变时,获取 item 下标元素的 left 和 width,计算 sliderStyle 即可
src\libs\popup\index.vue teleport transition vue3动画
src\libs\index.js
-
知识点 1.vite的Glob导入功能:该功能可以帮助我们在文件系统中导入多个模块 2.vue的defineAsyncComponent方法:该方法可以创建一个按需加载的异步组件
-
具体方法1.获取当前路径下所有文件夹中的index.vue 2.遍历或许到的组件模块3.利用app component进行注册
src\libs\search\index.vue /**
-
- 输入内容实现双向数据绑定
-
- 搜索按钮在 hover 是展示
-
- 一键清空文本功能
-
- 触发搜索
-
- 控制下拉展示区的展示
-
- 事件处理 */
需求分析 1 显示文字 提供loading能力 2 显示icon 可以指定icon颜色 3 可以开关的点击动画 4 制定各种风格和大小 5 当指定的风格或者大小不符合预设时,需要给开发者以提示消息
开发分析
-
- 构建 type 风格可选项和 size 大小可选项
-
- 通过 props 让开发者控制按钮
-
- 区分 icon button 和 text button
-
- 依据当前的数据,实现视图
-
- 处理点击事件
阻止事件冒泡
props
emit
slot
用户将鼠标移入某个元素时,显示一个气泡提示框;当鼠标移出时,气泡提示框会延迟关闭。气泡提示框的位置可以根据配置动态调整(如左上、右上、左下、右下等)。
点击\悬浮时候 触发 具名插槽 匿名插槽 显示的位置 左上 右上 左下 右下->计算位置 定时器 延迟效果(防抖)
通常情况下复杂功能的响应式处理,一般我们有三种处理方案:
-
一套代码处理多端
- 优势:代码量相对比较少
- 劣势:耦合性强,不利于后期维护
-
多套代码分别处理各端:
- 优势:逻辑清晰
- 劣势:可能会产生很多重复的逻辑
-
结合以上两种方案,抽离公用逻辑,封装私有逻辑:
- 优势:结合以上两点优势
- 劣势:需要对业务和逻辑足够清楚
那么综合来看,肯定是第三种方式更好,所以咱们的 navigationBar 就通过第三种方式来去进行实现。
那么具体我们应该怎么去做呢?哪些是公用逻辑?哪些是私有逻辑?
我们知道一个功能由两部分组成:
- 数据
- 视图
pinia抽离公共数据->PC移动端分别实现
也就是开始pinia中只有一个“全部”,后来发送网络请求才会有很多其他的 pinia持久化pinia-plugin-persistedstate
// 1. 监听主题的切换行为 // 2. 根据行为保存当前需要展示的主题到 pinia 中 // 3. 根据 pinia 中保存的当前主题,展示 header-theme 下的显示图标 // 4. 根据 pinia 中保存的当前主题,修改 html 的 class
window下的跟随系统
瀑布流组件的构建过程
每个 item 应该横向排列,第二行的 item 顺序连接到当前【最短】的列中,而这个也就是构建瀑布流的核心逻辑。那么想要实现这个核心逻辑,我们的每个 item 肯定就不可以使用正常的布局方式,而必须使用 absolute 绝对布局,通过 top 和 left 来手动控制位置。
那么明确好了这个核心逻辑之后,接下来如何进行构建呢?
想要搞明白一个复杂组件的构建机制,那么最好的方式是想象一下:当你去使用这个组件时,你希望如何进行使用。
按照你期望的使用方式来反向思考构建过程,这样在主要的思路上就不会出现大的偏差。 我期望我是这么使用瀑布流的:
<div>
<m-waterfall :data="" :nodeKey="" :column="" :picturePreReading="">
<template v-slot="{ item, width }">
<item-vue :data="item"></item-vue>
</template>
</m-waterfall>
</div>
// picturePreReading图片是否需要预加载获取容器宽度&列宽 区分预加载(需要预加载->图片高度未知。不需要预加载->图片高度已知)
- 瀑布流的核心就是:通过 relative 和 absolute 定位的方式,来控制每个 item 的位置
- 影响瀑布流高度的主要元素,通常都是 img 标签
- 有些服务端会返回关键 img 的高度,有些不会,所以我们需要分别处理 (1)当服务端不返回高度时:我们需要等待 img 加载完成之后,再来计算高度,然后通过得到的高度计算定位。否则则会出现高度计算不准确导致定位计算不准确的问题。 (2)当服务端返回高度时:开发者则必须利用此高度为 item 进行高度设定。一旦 item 具备指定高度,那么我们就不需要等待 img 加载的过程。这样效率更高,并且可以业务的逻辑会变得更加简单。
- 当进行响应式切换时,同样需要区分对应场景: (1)当服务端不返回高度时:我们需要重新执行整个渲染流程,虽然会耗费一些性能,但是这样可以最大可能的避免出现逻辑错误。让组件拥有更强的普适性。 (2)当服务端返回高度时:我们同样需要重新计算列宽和定位,但是因为 item 具备明确的高度,所以我们可以直接拿到具体的高度,而无需重复整个渲染流程,从而可以实现更多的交互逻辑。比如:位移动画,将来的图片懒加载占位...
长列表原理:当滚动到列表底部,加载数据 核心是监听到列表滚动到底部
vueuse提供了useIntersectionObserver 当我们使用长列表时,希望如何使用?
<m-infinite-list
v-model="" //当前是否处于加载状态
isFinished="" //数据是否全部加载完毕
@onload="" //加载下一页数据的触发事件
>
</m-infinite-list>原理:当图片不可见时,不加载图片,当图片可见时,加载图片 关键还是IntersectionObserver
src\directives\modules\lazy.js
全局指令注册 src\directives\index.js
main.js引入
- 全局指令注册
import lazy from './modules/lazy'
/**
* 全局指令注册
*/
export default {
install(app) {
app.directive('lazy', lazy)
},
}- vite自动注册
src\utils\color.js
搜索提示 搜索历史 推荐主题 search触发时和list联动
防抖 vueuse 高亮 正则替换
本地化-pinia 删除 全部删除
1 虚拟 dom:通过 js 来描述 dom 2 vnode 虚拟节点:告诉 vue 页面上需要渲染什么样子的节点 3 h 函数:用来创建 vnode 的函数,接受三个参数(要渲染的 dom,attrs 对象,子元素) 4 render 函数:可以根据 vnode 来渲染 dom、
根据以上所说我们知道:通过 h 函数可以生成一个 vnode,该 vnode 可以通过 render 函数被渲染
1 创建一个 confirm 组件 2 创建一个 confirm.js 模块,在该模块中返回一个 promise 3 同时利用 h 函数生成 confirm.vue 的 vnode 4 最后利用 render 函数,渲染 vnode 到 body 中
transition: all v-bind(duration);
ul li 最后一个元素
<li
v-for="item in _categorys"
:key="item.id"
class="shrink-0 px-1.5 py-0.5 z-10 duration-200 last:mr-4"
>
{{ item.name }}
</li>
高度设置
响应式 xl:dark 视频10-2
- 小文件下载 file-saver
- 大文件下载 streamsaver
defineProps里面的validator
- 功能引导 driver.js
vue router的transition是对应的页面组件切换 所以当前我想实现的【点击瀑布流中的某个元素->图片放大动画】是无法用transition实现
【思路】不去进行真实的路由跳转,而是先修改浏览器的URL,再切换展示的页面(以组建的形式覆盖整个浏览器的可视区域)。 【问题转换】 :1如何让浏览器的URL变化,但是不跳转页面 2 如何让一个新的组件以包含动画的形式进行展示
History.pushState()
const onToPins = (item) => {
history.pushState(null, null, /pins/${item.id}) //修改浏览器的URLW
// currentPins.value = item
// isVisiblePins.value = true
}
GSAP
gsap.set() 这个方法通常使用在动画开始之前,表示设置动画开始前的元素属性 gsap.to() 这个方法表示最终元素展示的状态
gsap会基于set和to的状态,来自动执行中间的补间动画。
所以我们需要 (1)创建对应的组件 使用transition包括 (2)计算set时 组件对应的演示 (3)计算to时 组件对应的演示
