# FreshRabbit
**Repository Path**: yemoleng/fresh-rabbit
## Basic Information
- **Project Name**: FreshRabbit
- **Description**: vue实践项目小兔鲜git仓库
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-05-11
- **Last Updated**: 2023-07-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# FreshRabbit
### 项目描述
基于 vue3.0 的组合 AP I方式与选项 API 的方式开发的一个综合品类的电商前台系统。 实现了一套完整的电商业务流程,从首页,类目,搜索,品牌,商品详情,购物车,结算,支付,个人中心,订单管理,收货地址管理,评价中心,和其他个人信息管理业务。
## 使用技术
项目基于vue技术来实现,大概会使用以下技术:
- Vue3.0 (使用组合api的方式来开发)
- Vite (项目脚手架)
- axios (请求接口)
- vue-router (单页路由)
- pinia (状态管理)
- ElementPlus(UI组件库)
- @vueuse/core (组合api常用工具库)
# 编写过程及问题
## 一、基础配置
- 项目初始化和git管理
- 别名路径联想设置
- elementUIPlus按需引入
- elementUIPlus主题色引入
- axios基本配置
`import Layout from '@/views/Layout/index.vue'`,提前定义但未使用,报错找不到资源`GET http://127.0.0.1:5173/src/views/Layout/Login.vue net:ERR ABORTED 404 (Not Found)`
- 项目整体路由设计
添加子路由时忘记在父组件添加二级路由出口,可以是``也可以是``
- 添加全局样式文件和配置全局自动导入`scss`文件
## 二、Layout页面
### 1、vue3的setup
Vue3 保留了 Vue2 中引用组件的方式,使用组件实例的 `components` 属性声明,但是,使用 Vue3 提供的 `script setup` 语法,我们只需要将其引入,便可以使用。
### 2、LayoutNav
**样式错乱**:`main.js`里面引入了`main.css`样式文件
**css里的&表示的意思:** **&** 表示在嵌套层次中回溯一层。[[参考文章]](https://blog.csdn.net/qq_44192588/article/details/106111301)
```css
.box{
&:before{
border-color: red;
}
&:after{
border-color: green;
}
}
```
`&:before`相当于`.box:before`
`&:after`相当于`.box:after`
`:before`和`:after`是CSS中的伪元素,在这里分别表示为在使用box类的元素前面和后面插入指定内容
### 3、LayoutHeader
**RouterLink渲染问题**
`router-link`在页面默认渲染出来的是``标签,如果想要修改成其他标签,比如`div`标签,只需要在`router-link`中添加`tag="div"`即可,并且不会影响其路由的切换。
***text-indent: -9999px;***:为什么要移出屏幕外而不直接删除文字?
### 4、吸顶导航栏
用原始方法写吸顶效果
## 三、Home页面视图
图片懒加载原始方法
## 四、一级分类
> **路由缓存问题**
使用带有参数的路由时需要注意的是,当用户从`/users/johnny`导航到`/users/jolyne`时,相同的组件实例将被重复使用,只有路劲不同。因为两个路由都染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会被调用。
问题:一级分类的切换正好满足上面的条件,组件实例复用,导致分类数据无法更新
解决问题的思路:
- 1.让组件实例不复用,强制销毁重建;
在路由入口添加key,这样浏览器会将其视为不同的路由而进行销毁重建
- 2.监听路由变化,变化之后执行数据更新操作
`beforeRouteUpdate`钩子函数可以在每次路由更新之前执行,在回调中执行需要数据更新的业务逻辑即可,或者,使用`beforeRouteUpdate`导航守卫,它也可以取消导航:
> **封装业务逻辑代码为hook**
1.按照业务声明以`use`打头的逻辑函数
2.把独立的业务逻辑封装到各个函数内部
3.函数内部把组件中需要用到的数据或者方法return出去
4.在组件中调用函数把数据或者方法组合回来使用
## 五、详情页
**渲染详情页基础数据报错undefind**
错误原因:goods一开始{} `{}.categories` -> `undefined` -> `undefined[1]`
1、可选链的语法`.?`
2、`v-if`手动控制渲染时机保证只有数据存在才渲染
**SKU组件**(回去理解)
问:在实际工作中,经常会遇到别人写好的组件,熟悉一个三方组件,首先重点看什么?
答:`props`和`emit`,`props`决定了当前组件接收什么数据,`emit`决定了会产出什么数据
## 六、登录页
> `TypeError:Cannot read properties of undefined (reading replace)`
router不能写在方法里面
> 账号密码错误仍然跳转首页
忘记写await
> 在js文件中跳转路由
v3中`useRouter` 不可以在非`setup`中使用`useRouter`,需要直接从路由文件中导入
```js
import router from '@/router'
```
## 七、购物车
> 重写头部购物车
## 八、订单页
> **可选链运算符**(**`?.`**)
`checkInfo.summary?.totalPayPrice.toFixed(2)`
允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。`?.` 运算符的功能类似于 `.` 链式运算符,不同之处在于,在引用为空 ([nullish](https://developer.mozilla.org/zh-CN/docs/Glossary/Nullish) ) ([`null`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/null) 或者 [`undefined`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/undefined)) 的情况下不会引起错误,该表达式短路返回值是 `undefined`。与函数调用一起使用时,如果给定的函数不存在,则返回 `undefined`。
问题:问什么在控制台输出是`undefined`,但是数据却是实际存在的。
⭕特别注意如果某个属性有值但是输出却是`undefined`,可能是因为获取值的方法是异步的,赋值的时候并没有获取到相关的值。
> 使用可选链后报`[vue/no-parsing-error]Parsing error:Unexpected token错误`
在`.eslintrc.cjs`添加`'parser': '@typescript-eslint/parser'`,记得需要安装依赖`npm install @typescript-eslint/parser --save-dev`。