# supermail
**Repository Path**: whj_51920/supermail
## Basic Information
- **Project Name**: supermail
- **Description**: a vuejs supermail
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-09-04
- **Last Updated**: 2021-10-11
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 一、开发前期准备工作
### 1. 划分目录结构
components 组件
- common 所有项目都能使用的
- content 当前项目使用的
asset 资源
- img
- css
network 网络
common 装一些公共的js文件夹
### 2. css文件引入
normalize.css 对标签的初始化
### 3. vue.config.js和.editorconfig
vue.config.js
```js
module.exports = {
configureWebpack: {
resolve: {
alias: {
'assets': '@/assets',
'common': '@/common',
'components': '@/components',
'network': '@/network',
'views': '@/views',
}
}
}
}
```
.editorconfig:对代码风格规范,便于维护(脚手架3删除了,公司一般会复制过来)
```js
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
```
## 二、首页开发
### 1. 顶部导航栏的封装
一般导航栏的高度都是44px,状态栏的高度是20px。
CSS中想要撑起来盒子直接给它设置line-height。
封装组件的背景颜色不要写死!
JS
```js
```
css
```css
.nav-bar {
display: flex;
line-height: 44px;
text-align: center;
box-shadow: 0 1px 1px rgba(100, 100, 100, .1);
}
.left, .right {
width: 60px;
}
.center {
flex: 1;
}
```
home组件内引入
```html
购物街
```
### 2. 请求首页数据(axios)
- 安装 axios
`npm install axios --save`
- network包里创建request.js
```js
import axios from "axios";
export function request(config) {
// 1. 创建axios实例
const instance = axios.create({
baseURL: 'http://152.136.185.210:7878/api/hy66',
timeout: 5000
})
// 2. axios拦截器
instance.interceptors.request.use(config => {
return config
}, err => {
console.log(err);
})
return instance(config)
}
```
- network包里再创建一个home.js,对其进行再一次封装(方便今后的管理)
```js
import {request} from "@/network/request";
export function getHomeMultiData() {
return request({
url: '/home/multidata'
})
}
```
### 3. 获取轮播图数据
```js
import {getHomeMultiData} from "@/network/home";
data() {
return {
// 轮播图数据
banners: [],
recommends: []
}
},
created() {
// 1. 请求多个数据
// 这里是一个异步函数,且这个函数的返回值是promise数据
getHomeMultiData().then(res => {
console.log(res);
this.banners = res.data.data.banner.list
this.recommends = res.data.data.recommend.list
})
}
```
### 4. 封装轮播图组件
导入老师封装好的Swiper
把轮播图再封装为一个组件放在home包下

HomeSwiper
```js
```
### 5. 封装tab-control组件
这个组件是公共业务组件,放在components / content下,由于是内部文字不同所以无需使用插槽。
>注意:这里实现点击谁谁变色的功能
>- 设置currentIndex = 0
>- 添加属性名 {active: index === currentIndex}
>- 添加click方法,点击谁将谁的index值赋给currentIndex
```js
```
### 6. 首页商品列表
>一次处理多类数据
>
定义一个变量 goods 保存三类数据,分别是流行 / 新款 / 精选
```js
goods: {
// page记录当前页码,list记录当前数据
'pop': {page: 1, list: []},
'news': {page: 1, list: []},
'sell': {page: 1, list: []}
对于其他开发常见的是
map -> map -> Array
```
home.js
```js
export function getHomeGoods(type, page) {
return request({
url: '/home/data',
params: {
type,
page
}
})
}
```
home页面
```js
goods: {
'pop': {page: 0, list: []},
'new': {page: 0, list: []},
'sell': {page: 0, list: []}
}
getHomeGoods(type) {
const page = this.goods[type].page + 1
getHomeGoods(type, page).then(res => {
this.goods[type].list.push(...res.data.data.list)
this.goods[type].page += 1
console.log(this.goods[type].list);
})
}
```
控制tabControl切换商品列表
```js
1. tabControl组件给home页面传index过去
itemClick(index) {
this.currentIndex = index;
this.$emit('tabClick', index)
}
2. home页面引入goodList组件
3. home页面拿到子组件传来的index
4. 根据index变换数据
computed: {
showGoodsList() {
return this.goods[this.currentType].list
}
}
tabClick(index) {
switch (index) {
case 0:
this.currentType = 'pop'
break;
case 1:
this.currentType = 'new'
break;
case 2:
this.currentType = 'sell'
break;
}
}
```
### 7.better-scroll 的使用
基本使用
```js
// 默认情况下,BScroll不能实时监听滚动的位置
/*
probeType:侦测
0 / 1: 不侦测;
2: 手指滚动过程中侦测,手指离开后不侦测;
3: 只要手指在上面就侦测
click: 默认false
pullUpload: true 上拉加载更多
*/
const BS = new BScroll(document.querySelector('.wrapper'), {
probeType: 1,
click: true,
pullUpload: true
})
// 监听滚动位置
BS.on('scroll', (position) => {
console.log(position);
})
// 上拉加载(只能一次,所以我们会用.finishPullUp)
BS.on('pullingUp', () => {
console.log('上拉加载');
// 先去发送网络数据,请求更多页的数据
// 等数据请求完成,并且将新的数据展示出来
setTimeout(() => {
BS.finishPullUp()
}, 2000)
})
document.querySelector('.btn').addEventListener('click', function () {
console.log('按钮打印啦!!!!')
})
```
> vue 中使用
安装
`npm install better-scroll --save`
`npm install @better-scroll/observe-dom --save`
封装 better-scroll
```js
- 引入better-scroll.observe-dom
import BScroll from 'better-scroll'
import ObserveDOM from '@better-scroll/observe-dom'
- Scroll封装
data() {
return {
scroll: null
}
},
mounted() {
this.scroll = new Bscroll(this.$refs.wrapper, {
probeType: 2,
click: true,
pullUpLoad: true,
observeDOM: true
})
}
```
完成回到顶部操作`backTop`组件(组件点击)
```js
- 创建组件BackTop
- home页引用并且添加点击事件
- Scroll组件内封装回到顶部方法
methods: {
scrollTop(x, y, time=300) {
this.scroll.scrollTo(x, y, time)
}
}
- home页的点击方法
backClick() {
this.$refs.sc.scrollTop(0, 0, 500)
}
```