You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
8.2 KiB
8.2 KiB
e锦水小程序开发文档
一、该小程序框架 所包含的功能以如下:
1、引入前端打包工具gulp,实现代码压缩等功能
2、通过gulp,使typescript 编译产生 javascript
3、通过gulp,引入css预处理器 sass 编译产生 css 可实现换肤功能
4、引入eslint, 用于统一团队代码规范
5、之后不再写 js 和 wxss,为了便于快速生成小程序页面和组件(.ts .scss .json .wxml),新增脚本,新增命令行
npm run new:page
// 请输入要生成的页面路径,会生成在src/目录下
eg: pages/auto/auto // 会在pages自动生成auto页面
npm run new:component
// 请输入要生成的组件路径,会生成在src/目录下
eg: components/loadMore/loadMore 会在通用组件下生成 上拉加载 组件
6、可以通过 cross-env 搭配 gulp-preprocess 实现多环境变量,不过暂时感觉意义不大
二、该小程序框架 代码规范如下:
1、小程序开发规范----ts/js代码规范
(1)、页面级API顺序
Page({
data: {
// 页面数据
}
onLoad () {
// 页面实例创建完成
},
onShow () {
// 页面出现在前台时执行
},
onReady () {
// 页面首次渲染完毕时执行
},
onHide () {
// 页面从前台变为后台时执行
},
onUnload () {
// 页面销毁时执行
},
onPullDownRefresh () {
// 触发下拉刷新时执行
},
onReachBottom () {
// 页面触底时执行
},
onPageScroll () {
// 页面滚动时执行
},
onShareAppMessage () {
// 页面被用户分享时执行
},
onResize () {
// 页面尺寸变化时执行
},
onTabItemTap (item) {
// tab 点击时执行
},
// 最后写自定义方法, 每一个方法加注释 页面生命周期和内置方法不需要加注释,没用到的方法不需要写出来
customMethod () {}
})
(2)、组件级API顺序
Component({
data: {
// 组件数据
},
properties: {
// props 数据
},
lifetimes: {
created () {
// 组件实例刚刚被创建
}
attached () {
// 实例创建完成 并加入页面Dom树
},
ready () {
// 组件在视图层布局完成
},
detached () {
// 组件实例从页面DOM树移除
}
},
pageLifetimes: {
show () {
// 组件所在页面进入前台
},
hide () {
// 页面进入后台
},
reside () {
// 页面尺寸变化
}
},
methods: {
// 组件内的方法 记得每一个方法加注释,组件生命周期和内置方法不需要加注释,没用到的内置方法不需要写
}
})
(3)、有时某个字段有多个状态,传给后端的是状态对应的数字,可以使用枚举来区分,同时将注释填写完整。 其他同事阅读代码时,更容易理解。
const selfStatus = 4
/* eslint-disable no-unused-vars */
enum Status {
success = 1, // 成功
fail = 2, // 失败
error = 3, // 产生错误
pending = 4 // 加载中
}
if (selfStatus === Status.success) {
this.setData({
status: Status.success
})
} else if (selfStatus === Status.fail) {
this.setData({
status: Status.fail
})
} else if (selfStatus === Status.error) {
this.setData({
status: Status.error
})
} else if (selfStatus === Status.pending) {
this.setData({
status: Status.pending
})
}
console.log(this.data.status) // 4
(4)、项目存在迭代升级,后端接口会随时更新,前端对于每个功能模块采用 命名空间的方式来适应后端迭代升级。
// 后端接口 加入命名空间定义
// 命名空间v1
export namespace indexV1 {
/**
* 未转项目议题列表(热议中,已关闭)接口
* @param {string} deptId 部门Id
* @param {Number} pageIndex 页码
* @param {Number} pageSize 页容量
* @param {string} stateType 状态类型:1.热议中,2.已关闭
*/
export function getUnpassedList ({ deptId, pageIndex, pageSize, stateType }: { deptId: string, pageIndex: number, pageSize: number, stateType: string }) {
return request({
method: "GET",
url: "cloudAnalysis/issue/getUnpassedList",
options: {
deptId,
pageIndex,
pageSize,
stateType
}
})
}
}
// 命名空间v2
export namespace indexV2 {
/**
* 未转项目议题列表(热议中,已关闭)接口
* @param {string} deptId 部门Id
* @param {Number} pageIndex 页码
* @param {Number} pageSize 页容量
* @param {string} stateType 状态类型:1.热议中,2.已关闭
*/
export function getUnpassedList ({ deptId, pageIndex, pageSize, stateType }: { deptId: string, pageIndex: number, pageSize: number, stateType: string }) {
return request({
method: "GET",
url: "cloudAnalysis/issue/getUnpassedList",
options: {
deptId,
pageIndex,
pageSize,
stateType
}
})
}
}
// 接口使用
import { indexV1, indexV2 } from "../../api/index"
async getIssueListV1 () {
const para = {
deptId: "",
pageIndex: 1,
pageSize: 10,
stateType: "1"
}
try {
let resV1 = await indexV1.getUnpassedList(para) // 使用v1版本的接口
let resV2 = await indexV2.getUnpassedList(para) // 使用v2版本的接口
console.log(resV1)
console.log(resV2)
} catch (e) {
console.log(e)
}
}
(5)、所有后端接口 全部放入 api 文件夹下对应的模块文件内,便于统一管理,每个接口注释其作用,入参类型、含义。
- 接口参数 <= 3, 接口函数形参逐一填写
- 接口参数 > 3 && <= 5 可以一个形参(对象)或者形参逐一写上
- 接口参数 > 5 必须 一个形参(对象)
/**
* 未转项目议题列表(热议中,已关闭)接口
* @param {string} deptId 部门Id
* @param {Number} pageIndex 页码
* @param {Number} pageSize 页容量
* @param {string} stateType 状态类型:1.热议中,2.已关闭
*/
export function getUnpassedList ({ deptId, pageIndex, pageSize, stateType }: { deptId: string, pageIndex: number, pageSize: number, stateType: string }) {
return request({
method: "GET",
url: "cloudAnalysis/issue/getUnpassedList",
options: {
deptId,
pageIndex,
pageSize,
stateType
}
})
}
// 或者
export function getUnpassedList ( options: { deptId: string, pageIndex: number, pageSize: number, stateType: string }) {
return request({
method: "GET",
url: "cloudAnalysis/issue/getUnpassedList",
options
})
}
(6)、页面跳转 不要使用相对路径,一律使用绝对路径,便于某个模块或某个页面复用
wx.navigateTo({
url: "/pages/index/index"
})
wx.navigateTo({
url: "/subpages/reality/pages/realityIndex/realityIndex"
})
2、小程序开发规范---- wxml代码规范
(1)、当标签属性超过三个时,一律换行展示,不要一梭到底
<cover-view
catchtap="onChnageUnionCondition"
data-condition="{{item.value}}"
class="list-item"
wx:for="{{categoryList}}"
wx:for-index="index"
wx:for-item="item" wx:key="index">
<cover-view class="name">{{item.label}}</cover-view>
<cover-view wx:if="{{selectUnionCondition.value === item.value}}" class="select">√</cover-view>
</cover-view>
(2)、 除了动态属性,禁止在wxml里面写内联样式
(3)、最外层的components放公共组件(公共组件可以全局配置为全局组件这样就不需要用到的时候在引入),业务模块组件在自己所在页面下建components存放
src
├─api
├─components ---- 公共组件/通用组件
├─filters
├─pages
├ ├─index
├ ├─components --- 模块组件/页面拆分组件
├ ├─index.json
├ ├─index.ts
├ ├─index.scss
├ └index.wxml
└subpages