# 项目的目录结构
| 目录 | 名称 | 备注 |
|--------|------|--------|
| api | 接口请求 | 按服务端接口模块创建js文件,关联后端请求 |
| compontents | 全局前端组件 | 和业务属性无关联的通用组件 |
| |-common | 公共组件 | u-dropdown-select 分类选择(支持一级或二级)
u-scroll-view (自动全屏的滚动视图)
u-swiper 实现各类轮播 |
| |-layout | 布局组件 | nav-bar 顶部导航
tab-bar 底部导航 |
| locales | 多语种 | 实现前端多语种 |
| pages | 小程序页面 | 所有的小程序页面与页面片段 (与业务属性相关) |
| static | 静态资源 | 图片/字体/CSS (图片尽可能放到oss,小程序有限制大小) |
| |-style/pages | 页面样式 | 页面可复用的样式放置到这个文件夹, 不可复用的样式仍放到page的style标签内 |
| store | 数据存储 | 固定或临时数据的存储 |
| unpackage | hbuilder编译的微信小程序代码 |
| utils | 工具类 | request.js 网络请求
event-bus.js 消息总线
font.js 加载字体
auth.js 授权token
index.js 公共函数
| wxcomponents | 小程序原生组件 |
| |- vant | vant-weapp组件(请不要重新下载覆盖, 部分组件js有修改, 非必要不修改) |
# 配置文件
## process.env 配置
## package.json 的 env节点
`
```json
"uni-app": {
"scripts": {
"dev": {
"title": "小程序-开发环境",
"env": {
"UNI_PLATFORM": "mp-weixin",
"NAME": "dev",
"TOKEN_KEY": "token",
"BASE_API": "https://starify-api-dev.matchexpo.cn"
},
"define": {
"MP-CJN": true
}
},
```
`
# 基本开发规范
## 缩进
样式与javascript的缩进统一为2个空格,通过修改hbuilder的配置实现
## CSS样式表
- 只允许使用class选择器
- class定义需使用英文小写 + "-" 组成, 与第三方组件保持统一
- style不加scope属性
- 字体大小使用uni.scss中定义的变量
- 通用的主题色值,必须使用uni.scss中定义的变量
- 所有尺寸都使用rpx单位进行定义
- 已在app.scss定义了全局字体Arial, 页面与组件不需要再定义了
## javascript
- 变量与属性使用驼峰命名法
- 常量用const, 变量let, 不允许使用var
- 每个代码行结尾不要加";"
- 慎用hbuilder的自动代码格式化
## 数据的存储与引用
- 使用数据 this.$store.gettings.数据名
- 存储数据 this.$store.commit(方法名, 数据值)
## 文件目录
- pages/功能模块/components 用于存放业务相关的组件
- 根目的components用于存放通用组件
## 参考文档
- vant-weapp官方文档[vant参考文档](https://vant-ui.github.io/vant-weapp)
- uniapp文档: [参考文档](https://zh.uniapp.dcloud.io/component/scroll-view.html)
# FAQ
## uni.scss 与 app.scss有什么区别?
uni.scss可用于定义变量, mixin等, 编译小程序代码后,它会被复制到每一个style元素中.易造成冲突且体积较大
app.scss定义全局公共样式,一次引用,所有页面生效
## 怎么引用第三方字体?
- 不支持全局引用且只支持网络链接字体(上传到OSS)
- 在每个需要使用第三方字体的page的created里调用 this.loadFontFace(字体名字), 修改main.js的loadFontFace方法以支持新字体
- 不要使用过多的第三方字体,以免卡顿.
- 部分情况可以使用图片替换特殊字体
## App.vue里的onLaunch不执行?
这个文件应该是uniapp针对web应用的, 微信小程序不会执行
## 页面的 created 和 onShow 有什么区别?
created只要页面第一次打开时执行, 如果跳转到其它页面再返回则不会执行, 可使用onShow
## 如何创建一个新页面?
- 在pages里创建页面.vue(或模块目录)并在根目录的pages.json文件里配置路径
- 如编译时默认打开该页面,在微信开发者工具里的添加编译模式选择特定页面
## 怎么实现样式的穿透?
- 穿透指的是上级页面或组件想覆盖子组件的样式
- 并不支持::v-deep这类写法
- 需在页面或组件中的script增加styleIsolation,并设置为shared
```javascript
export default {
options: {
styleIsolation: 'shared'
},
```
## 怎么控制用户的授权
- 正常情况下,若page不允许非授权状态下的访问,可以created里加上**this.checkAuth(当前页面的路径)**,会自动跳转登录
## 定义事件用@还是小程序原生的bind...?
- 为保证代码风格统一尽量使用@事件名来监听
- @和bind对应的event数据结构会略有不同, 如遇问题可用console.log查看
## 第三方的vant组件的字体过大
- vant默认是使用单位px, 需要在style/vant.scss文件中覆写样式
## 如何更新iconfont图标
- 从iconfont网站下载解压后,拷贝iconfont.ttf和iconfont.woff2
- iconfont.woff2用于微信开发者工具
- iconfont.ttf用于真机
- iconfont.css不要直接覆盖, 因为最顶部的@font-face定义已修改, 复制时需保留原有的@font-face 注意!!!
## 每个页面都需要放1个nav-bar吗?
- 是的, 即使不显示nav-bar(如user/login页面)也需要,可以设置组件属性为透明色.
- nav-bar可以解决浏海屏状态栏高度的问题
## 如何在小程序中访问网页?
- 需要微信小程序后台配置安全域名
- 通过pages/index/webview组件进行返回
- this.navigateTo支持访问网络地址,自动调用webview
## 如何实现滚动底部加载更多?
- 监听 u-scroll-view的scroll-near-lower事件
- uniapp文档: [参考文档](https://zh.uniapp.dcloud.io/component/scroll-view.html)
## 如何修改小程序appId
- 通过hbuilder修改manifest.json
## 页面常用的函数?
### 导航
- **this.navigateTo(地址)** 导航下一个页面(支持https网格地址或pages本地页面地址)
- **this.redirectTo(地址)** 切换当前页面到另一个页面(支持https网格地址或pages本地页面地址)
### 消息提示
- **this.showToast(消息文本)** 不带图标的消息提示
- **this.showSuccessToast(消息文本)** 带成功图标的消息提示
- **this.showFailToast(消息文本)** 带失败图标的消息提示
- **this.showLoading()** 显示加载中
- **this.hideLoading()** 隐藏加载中
### 对话框
- **this.showAlertDialog(消息文本)** 带1个确认按钮的对话框
- **this.showConfirmDialog(消息文本)** 带1个确认按钮和1个取消按钮的对话框