-
create-vue
1.create-vue是脚手架工具,用来创建vue项目
2、node -v 检查node版本,是否大于16
3、创建项目:npm init vue@latest
4、打开项目安装依赖,npm install
5、运行项目 npm run dev -
熟悉项目目录和关键文件
1、package.json里面有核心依赖
vite.config.js是项目配置文件,添加插件之类的
2、src业务文件夹,
main.js 入口文件,createApp函数创建应用实例
app.vue的setup是一个开关,冗余在scirpt书写组合式API
index.html 单页入口提供id为app的挂载点 -
组合式API-setup选项
-
组合式API-reactive和ref函数
-
computed计算属性函数
-
组合式API-watch
- 组合式API的生命周期
- 组合式API的父子通信
- 组合式API下的父子通信-子传父
- 组合式API的模板引用
- 组合式API-provide和inject
- 综合案例
- 什么是Pinia
- pinia-counter基础使用
异步action的实现:
- storeToRefs
使用storeToRefs函数可以辅助保持数据(state+getter)的响应式解构。
项目起步
建立项目
在vscode中终端窗口中执行如下:
配置路径联想提示
elementPlus引入
重启一下项目:npm run dev
elementPlus主题定制
替换Components选项
配置css:
axios基础配置
- 把axios装到了本地
- 做基础的封装
- 使用实例
- 测试并运行项目
- 思考
项目路由设计
设计首页和登录页的路由(一级路由)
创建登录和退出两个组件
添加配置项
配置path和组件的对应关系
配置一级路由出口组件
设计分类页和默认Home页路由(二级路由)
- 添加分类页和Home页组件
- 配置路由
- 配置二级路由出口
静态资源初始化和Error Lens安装
- 引入样式使之生效
- 自动导入配置
如果在每个组件里都手动导入scss比较麻烦。现在配置自动导入
导入色值变量
npm run dev重新运行
layout-静态模板结构搭建
layout-字体图标引入
layout-一级导航渲染
- 配置接口函数
- 接口测试
- 渲染
layout-吸顶导航交互实现
-
准备吸顶导航组件
进行入口组件index.vue中使用改导航组件
-
获取滚动距离
安装
使用相关函数
-
以滚动距离做判断条件控制组件盒子展示隐藏
layout-pinia优化重复请求
Home-整体结构拆分和分类实现
Home-banner轮播图实现
- 准备模板
- 熟悉elementPlus相关组件
- 获取接口数据
- 渲染
Home-面板组件封装
- 不做任何抽象,准备静态模板
- 抽象可变的部分
- 主标题和副标题是纯文本,可以抽象成prop传入
- 主体内容是复杂的模板,抽象成插槽传入
定义prop
- 进行面板测试
- 总结
Home-新鲜好物和人气推荐实现
- 准备模板(homepanel组件)
这里相当创建了一个静态的组件
- 制定props
- 定制插槽内容(接口+渲染模板)
接口如下:
插槽进行渲染:
Home-图片懒加载指令的实现
测试懒加载:
总结:
Home-懒加载指令优化
- 问题1:逻辑书写位置不合理
修改后的内容为:
入口文件main.js只做一件事情,就是引入注册一下
- 问题2:重复加载
Home-Product产品列表实现
-
熟悉并准备静态模板
-
封装接口
-
获取数据渲染模板
-
图片懒加载
Home-GoodsItem组件封装
如何封装
核心思想:把要显示的数据对象设计为props参数,传入什么数据就显示什么数据。
一级分类-整体认识和路由配置
RouterLinkter-link 是一个用于在 Vue 应用中创建导航链接的组件,由 Vue Router 提供,这个组件用于在不刷新页面的情况下导航到不同的 URL,并且支持 HTML History API,使用 router-link 组件能够生成一个< a >标签,其默认行为与普通的链接相同,但它能够更加智能地处理应用内的导航。
to此属性必须设置,它决定了导航的目标路由,其值可以是一个字符串或者一个对象,当使用对象时,可以设置更多选项如path、query和params。
字符串格式: About
对象格式: About
一级分类-面包屑导航渲染
准备组件模板->封装接口函数->调用接口获取数据(使用路由参数)->渲染模板
准备组件模板
封装接口函数
@ 通常被配置为指向项目的 src 目录或其他特定的目录。这样可以避免使用相对路径(如 …/…/…/),提高代码的可读性和可维护性。
不加 {} 的导入语法只能用于默认导出(default export)。在 JavaScript 或 TypeScript 中,import { getrequest } from ‘@/utils/request’; 语句中的大括号 {} 是用来进行解构导入的。
调用接口获取数据
渲染模板
修改“居家”这个固定值,将其替换成一个动态数据。
一级分类-banner轮播图实现
改造先前的接口
迁移首页轮播图逻辑
一级分类-激活状态显示和分类列表渲染
激活状态显示
分类列表渲染
分类的数据已经在面包屑导航实现的时候获取到了,只需要通过v-for遍历出来即可。
一级分类-解决路由缓存问题
什么是路由缓存问题
使用带有参数的的路由时需要注意,当用户从users/johnny导航到
/users/jolyne时,相同的组件实例将被重复使用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会被调用。
问题:一级分类的切换正好满足上面的条件,组件实例复用,导致分类数据无法更新。
解决问题的思路:1,让组件不复用,强制销毁重建 2,监听路由变化,变化之后执行数据更新操作
- 方案一:给router-view添加key
以当前路由完整路径为key的值,给router-view组件绑定
- 方案二:使用beforeRouteUpdate导航钩子
beforeRouteUpdate钩子函数可以在每次路由更新之前执行,在回调执行需要数据更新的业务逻辑即可
一级分类-使用逻辑函数拆分业务
概念理解:
基于逻辑函数拆分业务是指把同一个组件中独立的业务代码通过函数做封装处理,提升代码的可维护性。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a1ba5b310c7b44229d1ace38627b5b76.png
在逻辑函数中,将route获得的数据以对象的形式return出去。
4.1 二级分类-整体认识和路由配置
创建路由组件
配置路由关系
修改模板实现跳转
4.2 二级分类-面包屑导航实现
封装接口
调用接口渲染模板
测试跳转
4.3 二级分类-基础商品列表实现
整体流程:实现基础列表渲染(基础参数),添加额外参数实现筛功能,获取数据渲染列表。
封装接口
获取基础列表数据渲染
列表渲染
4.4二级分类-列表筛选功能实现
核心逻辑:点击tab,切换筛选条件参数sortFiedl,重新发送列表请求
获取激活数据项
使用新参数发送请求重新渲染列表
el-tab-pane 是 Element UI 库中的一个组件,用于在 el-tabs
标签页组件中定义每个选项卡的内容。具体来说,el-tab-pane 组件表示选项卡页中的一个页面或一个内容区块。@tab-change 是
el-tabs 组件的一个事件回调属性,当选项卡发生变化时会触发。具体来说,当用户点击切换到一个不同的选项卡时,@tab-change
事件就会被触发,并会传递当前激活的选项卡的 name 属性值作为参数。
4.5 二级列表-列表无限加载实现
核心实现逻辑:使用elementPlus提供的v-infiniite-scroll指令监听是否满足触底条件,满足触底条件时页数参数加一获取下一页数据,做新老数据拼接渲染。
配置v-infinite-scroll
页数加一获取下一页
新数据和老数据拼接
加载完毕结束监听
4.6 二级分类-定制路由scrollBehavior
定制路由行为解决什么问题? 在不同路由切换的时候,可以自动滚动到页面的顶部,而不是停留在原先的位置。
如何配置:vue-router支持scrollBehavior配置项,可以指定路由切换时的滚动位置。
4.7 详情页-整体认识和路由配置
路由配置
创建详情组件
绑定路由关系(参数)
绑定模板测试跳转
4.8详情页-基础数据渲染
封装接口
获取数据
渲染模板
4.9 详情页-热榜区域实现-基础封装和数据渲染
封装Hot热榜组件
获取渲染基础数据(以24小时热榜为准)
适配不同标题title
4.10详情页-热榜区-适配不同title和数据列表
适配不同列表内容
适配不同标题title
4.11 详细页-图片预览组件
组件功能分析
- 通过小图切换大图显示
思路:维护一个数组图片列表,鼠标划入小图记录当前小图下标值,通过下标值在数组中取对应图片,显示到大图位置。
准备组件静态模板(包括图片数据列表)
为小图绑定事件,记录当前激活下标值
通过下标切换大图显示
通过下标实现激活状态显示
利用动态类(:class)
2. 放大镜效果
- 左侧滑块跟随鼠标移动
思路:获取当前鼠标在盒子内的相对位置,控制滑块跟随鼠标移动
(1)获取鼠标垫的相对位置
(2) 控制滑块跟随移动
- 右侧大图放大效果实现
效果:为了实现放大效果,大图的宽高是小图的两倍
思路:大图的移动方向和滑块移动方向相反,且数值为2倍
(1)定义大图的两个字段
(2)控制大图的显示
(3)渲染模板
- 鼠标移入控制滑块和大图显示隐藏
思路:鼠标移入盒子(isOutside),滑块和大图才显示(v-show)
- 优化
4.14 详情页-图片预览组件-props适配和整体总结
4.15 详情页-SKU组件熟悉使用
4.16 详情页-通用组件统一注册全局
为什么要优化?
背景:componets目录下有可能还会有很多通用组件,有可能在多个业务模块中共享,所以统一进行全局组件注册比较好。
5.1 登录-整体认识和路由配置
整体认识:登录页面主要功能就是表单校验和登录登出业务
(1)建立登录模板
(2)给“请先登录”绑定事件
5.2 登录-表单校验功能
为什么要校证?
作用:前端提前校验可以省去一些错误的提交请求,为后端节省接口压力
表单数据
ElementPlus表单组件内置了表单校验功能,只需要按照组件要求配置必要参数即可
思想:当功能很复杂时,通过多个组件各自负责某个小功能,再组合成一个大功能是组件设计中的常用方法
(1)按照接口字段准备表单对象并绑定
(2)按照产品要求准备规则对象并绑定
(3)指定表单域的校验段名
(4)把表单对象进行双向绑定
前端校验(过滤错误请求)
后端查询是否匹配
5.3 登录-表单校验-自定义校验规则
自定义校验规则
ElementPlus表单组件内置了初始的校验配置,应付简单的校验只需要通过配置即可,如果想制定一些特殊的校验需求,可以使用自定校验规则,格式如下:
5.4 整个表单的内容验证
思考:每个表单域都有自己的校验触发事件,如果用户一上来不点登录怎么办?
答:在点击登录时需要对所有需要校验的表单进行统一校验。
获取form组件实例
调用实例方法
5.5 登录-基础功能实现
表单校验通过,封装登录接口,调用登录接口(登录成功后续逻辑处理,登录失败的业务逻辑)
(1)创建接口
(2)引入接口
(3)调用接口
(4)处理登录后的跳转
使用拦截器做出统一的控制,如何任何一个接口出现错误,都给出用户提示。
5.6 登录-Pinia管理用户数据
登录-Pinia用户数据持久化
使用步骤:
(1)安装插件包
(2)pinia注册插件
(3)需要持久化的store进行配置
登录-登录和非登录状态下的模板适配
需求分析
登录-请求拦截器携带token
一次配置,在多个地方生效
5.10登录-退出登录功能实现
点击退出登录弹出确定框
点击确定按钮实现退出登录逻辑
登录逻辑包括(清楚当前用户信息;跳转到登录页面)
绑定一个回调函数
5.11 登录-Token失效401拦截处理
5.12购物车-流程梳理和本地加入购物车
封装cartStore
添加按钮需要绑定的事件
5.13 购物车-本地-头部购物车列表渲染
准备头部购物车组件
从pinia中获取数据渲染列表
本地购物车-头部购物车删除实现
5.15 购物车-本地-头部购物车统计计算
购物车-本地-列表购物车基础数据渲染
准备模板
绑定路由
(1)输入这个路由,会跳转到CartList组件对应的静态页面中去。
(2)点击头部购物车结算时跳转到购物车页面
渲染基础列表
购物车-本地-列表购物车单选功能
为什么单选框的状态要和store对应的状态保持同步?
6.3 购物车-本地-购物车列表全 选功能
(1)操作单选决定全选
(2)操作全选决定单选
6.4 购物车-本地-购物车列表统计数据实现
6.5 购物车-接口-加入购物车
(1)判断是否登录
(2)如果登录了
创建接口
调用创建和插入购物车接口
调用覆盖接口
6.6 购物车-接口-删除购物车
6.7 退出登录-清空购物车数据
6.7 退出登录-合并本地购物车到服务器
6.9 结算- 路由配置和基础数据渲染
(1)路由配置
准备路由组件
配置路由关系
配置路由跳转
(2)基础数据渲染
准备接口
获取数据
渲染默认地址和商品列表以及统计数据
6.10 结算-地址切换-打开弹窗交互实现
(1)准备弹窗组件
(2)组件v-model绑定响应式数据
(3)点击按钮控制响应式数据
(4)渲染可选地址列表
6.11 结算-切换地址-地址激活交互实现
(1)记录下来点击了哪一个
(2)通过动态类名控制激活样式类型
(3)点击确定之后更新页面信息
6.12 结算-生成订单功能实现
(1)准备支付路由
(2)封装生成订单接口
(3)点击按钮调用接口
绑定事件
6.13 支付-渲染基础数据
封装获取订单详情的接口
获取数据
6.14 支付-实现支付功能
6.15 支付-支付结果展示
(1)配置paycallback路由
(2)根据支付结果适配支付状态
(3)获取订单数据渲染支付信息
onMounted()钩子函数是用来调用getOrderInfo函数的
6.16 支付-封装倒计时函数
(1)编写函数框架
(2)编写核心倒计时逻辑实现
(3)格式化
导入dayjs插件
防止内存超出
7.1 会员中心-整体功能梳理和路由配置
(1)准备个人中心模板组件
(2)绑定个人中心二级路由
(3)准备个人中心和我的订单三级路由组件
配置三级路由
7.2 会员中心-个人中心信息渲染
(1)个人中心部分直接使用pinia中的数据
(2)猜你喜欢部分从接口获取
7.3 会员中心-我的订单-基础订单列表实现
(1)封装订单接口
(2)准备基础请求参数
7.4 会员中心-我的订单-tab切换实现
(1)绑定tab-change事件
(2)获取当前激活tab项数据
(3)使用最新tab项数据发送请求
7.5 会员中心-我的订单-分页逻辑实现
(1) 使用列表数据生成分页
使用total属性绑定总条数
使用page-size属性绑定每页条数
(2) 切换分页修改page参数
7.6 会员中心-细节优化
设置默认的三级路由
7.7 拓展课-SKU组件-功能拆解
(1) 初始化规格渲染
(2) 点击规格更新选中状态
(3) 点击规格更新禁用状态
生成有效路径字典(1)
生成有效路径字典(2)
①点击规格更新禁用状态-初始化规格禁用
②点击时组合更新禁用规格
(4)产出有效的SKU数据