前期准备

技术栈

  • uni-app
  • TypeScript
  • vue2

    开发工具

    vscode

搭建项目并完成初始化 使用 CLI 搭建项目)

全局安装 vue-cli 3.x(如已安装请跳过此步骤)

  1. # 安装稳定最新版
  2. npm install -g @vue/cli
  3. yarn global add @vue/cli
  4. # 安装指定版本
  5. npm install -g @vue/cli@3.x.x
  6. yarn global add @vue/cli@3.x.x
  7. # 查看版本号
  8. vue --version
  9. vue -V

通过 CLI 创建 uni-app 项目

  1. # <name> 输入项目名
  2. vue create -p dcloudio/uni-preset-vue uni-loan-mate-platform

等待下载,之后会提示选择项目模板,选择 默认模板(TypeScript) 项目模板,如下所示:
WechatIMG45.png
选择后等待项目下载完成。

运行、发布uni-app

  1. npm run dev:%PLATFORM%
  2. npm run build:%PLATFORM%

%PLATFORM% 可取值如下:

平台
app-plus app平台生成打包资源(支持npm run build:app-plus,可用于持续集成。不支持run,运行调试仍需在HBuilderX中操作)
h5 H5
mp-alipay 支付宝小程序
mp-baidu 百度小程序
mp-weixin 微信小程序
mp-toutiao 字节跳动小程序
mp-qq qq 小程序
mp-360 360 小程序
quickapp-webview 快应用(webview)
quickapp-webview-union 快应用联盟
quickapp-webview-huawei 快应用华为

可以自定义更多条件编译平台,比如钉钉小程序,参考package.json文档

修改.vue文件组件为基于类的vue组件

  1. // App.vue
  2. <script lang="ts">
  3. import { Vue } from 'vue-property-decorator'
  4. export default Vue.extend({
  5. mpType: 'app',
  6. onLaunch() {
  7. console.log('App Launch')
  8. },
  9. onShow() {
  10. console.log('App Show')
  11. },
  12. onHide() {
  13. console.log('App Hide')
  14. }
  15. });
  16. </script>

Tips

  • App.vue文件不能修改为基于类的Vue组件;
  • uni-app申明文件采用命名空间方式编写,使用方式: UniApp.xxxx;

App.vue 文件在 $mount() 挂载Vue实例中注入

  1. // main.ts 入口文件
  2. import { Vue } from 'vue-property-decorator'
  3. import App from './App.vue'
  4. Vue.config.productionTip = false
  5. const app = new Vue({
  6. render: h => h(App)
  7. })
  8. app.$mount() //挂载Vue实例

基于类的vue组件

  1. <script lang="ts">
  2. import { Vue, Component } from 'vue-property-decorator'
  3. @Component({})
  4. export default class Index extends Vue {
  5. // 初始数据可以直接声明为实例的 property
  6. title: string = 'Hello!'
  7. // 组件方法也可以直接声明为实例的方法
  8. onClick (): void {
  9. window.alert(this.title)
  10. }
  11. }
  12. </script>

uni-app 初始化目录结构

  1. #整体结构
  2. ┌─public
  3. └─index.html
  4. │─src 代码编辑区
  5. └─**** 查看下方src文件夹下目录结构
  6. ├─typings .d.ts 申明文件存放目录
  7. ├─.gitignore git 过滤文件
  8. ├─babel.config.js babel 编译配置文件
  9. ├─postcss.congfig.js css处理器配置文件
  10. └─tsconfig.json TS 编译配置文件
  11. #src文件夹下目录
  12. ┌─apis 请求数据接口
  13. ├─common 公共文件(static中不编译jsES6)文件,可以放在该目录下)
  14. └─css
  15. └─reset.scss scss文件
  16. │─components 符合vue组件规范的uni-app组件目录
  17. └─comp-a.vue 可复用的a组件
  18. ├─pages 业务页面文件存放的目录
  19. ├─index
  20. └─index.vue index页面
  21. └─subpackages 分包优化
  22. ├─static 存放应用引用静态资源(如图片、视频等)的目录,注意:静态资源只能存放于此
  23. ├─images
  24. ├─tabbar
  25. └─icon.png tabBar 需要的图片资源
  26. ├─store vuex 状态管理
  27. ├─utils 工具文件存在在该目录下
  28. ├─dataTime 对时间的处理
  29. ├─request 请求封装
  30. └─wxsdk 微信SDK封装
  31. ├─main.ts Vue初始化入口文件
  32. ├─App.vue 应用配置,用来配置App全局样式以及监听 应用生命周期
  33. ├─manifest.json 配置应用名称、appidlogo、版本等打包信息
  34. ├─pages.json 配置页面路由、导航条、选项卡等页面类信息
  35. └─uni.scss uni 提供的默认变量

可以自定义目录,根据项目需求,参考uni-app文档

附录:

tyconfig.json 配置

  1. {
  2. "compilerOptions": {
  3. "target": "esnext",
  4. "module": "esnext",
  5. "strict": true,
  6. "jsx": "preserve",
  7. "importHelpers": true,
  8. "moduleResolution": "node",
  9. "esModuleInterop": true,
  10. "allowSyntheticDefaultImports": true,
  11. "experimentalDecorators":true,
  12. "sourceMap": true,
  13. "skipLibCheck": true,
  14. "baseUrl": ".",
  15. "typeRoots" : ["./typings"],
  16. "types": [
  17. "webpack-env",
  18. "@dcloudio/types",
  19. "miniprogram-api-typings",
  20. "mini-types"
  21. ],
  22. "paths": {
  23. "@/*": [
  24. "./src/*"
  25. ]
  26. },
  27. "lib": [
  28. "esnext",
  29. "dom",
  30. "dom.iterable",
  31. "scripthost"
  32. ]
  33. },
  34. "exclude": [
  35. "node_modules",
  36. "unpackage",
  37. "src/**/*.nvue"
  38. ]
  39. }

reset.scss 初始化样式文件

  1. page {
  2. font-size: 28rpx;
  3. line-height: 1.5;
  4. color: #2c3e50;
  5. background: #fff;
  6. -webkit-overflow-scrolling: touch; /* 使 ios 列表滑动流畅 */
  7. }
  8. button {
  9. color: #333;
  10. }
  11. page,
  12. view,
  13. input,
  14. text,
  15. form,
  16. navigator,
  17. rich-text,
  18. picker,
  19. scroll-view,
  20. cover-view,
  21. open-data{
  22. box-sizing: border-box;
  23. }
  24. rick-text,
  25. open-data,
  26. form {
  27. display: block;
  28. }
  29. cover-view {
  30. line-height: 1.5;
  31. white-space: nowrap;
  32. }
  33. /* 隐藏滚动条 */
  34. ::-webkit-scrollbar{
  35. display: none;
  36. }
  37. button:after{
  38. border: 0;
  39. }
  40. /* 清除浮动 */
  41. .clearfix:after {
  42. content: '.';
  43. display: block;
  44. height: 0;
  45. clear: both;
  46. visibility: hidden;
  47. }

文件来源于 @京城一灯

参考资料:

uni-app官方文档
DCloud 问答社区:当 uni-app 遇见 vscode
搭建 uni-app ts 项目
Vue2.x TypeScript 支持