评论

uniapp开发小程序

为什么使用uni-app?

一、为什么使用uni-app?

  1. 微信定义的这套语法,wxml、wxs,以及wx:if等语法,私有化太强。
  2. uni-app支持跨端多平台编译,多端开发成本低。
  3. 基于通用的前端技术栈,采用vue语法+微信小程序api,没有额外的学习成本。

二、uni-app项目起步

uni-app官方推荐的开发工具为HBuilderX,不过由于本人习惯使用vscode,因此介绍如何在vscode中使用uni-app。

1.CLI工程

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

npm install -g @vue/cli

通过CLI创建uni-app项目

vue create -p dcloudio/uni-preset-vue my-project

此时,会提示选择项目模板,初次体验建议选择 hello uni-app 项目模板,如下所示:

我这里选择默认模板。

2.安装vue语法提示插件vetur

<img src=“https://img-cdn-tc.dcloud.net.cn/uploads/article/20190827/f98722b481a8f8bdb29163a4d248926a.png” alt=“img” style=“zoom:67%;” />

3.目录结构

一个uni-app工程,默认包含如下目录及文件:

┌─uniCloud              云空间目录,阿里云为uniCloud-aliyun,腾讯云为uniCloud-tcb(详见uniCloud)
│─components            符合vue组件规范的uni-app组件目录
│  └─comp-a.vue         可复用的a组件
├─hybrid                App端存放本地html文件的目录
├─platforms             存放各平台专用页面的目录
├─pages                 业务页面文件存放的目录
│  ├─index
│  │  └─index.vue       index页面
│  └─list
│     └─list.vue        list页面
├─static                存放应用引用的本地静态资源(如图片、视频等)的目录,注意:静态资源只能存放于此
├─uni_modules           存放[uni_module](/uni_modules)规范的插件。
├─wxcomponents          存放小程序组件的目录
├─main.js               Vue初始化入口文件
├─App.vue               应用配置,用来配置App全局样式以及监听 应用生命周期
├─manifest.json         配置应用名称、appid、logo、版本等打包信息
└─pages.json            配置页面路由、导航条、选项卡等页面类信息

三、开发

1.页面结构

页面结构和一般的vue一样,既有vue的生命周期,也有小程序的生命周期,如下所示:

<template>
	<view class="content">
		
	</view>
</template>

<script>
	export default {
		data() {
			return {
				
			}
		},
        methods: {

		},
		onLoad() {

		},
        created() {
            
        }
	}
</script>

<style>
	
</style>

2.tabbar和路由跳转

(1)tabbar

如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页。

在 pages.json 中提供 tabBar 配置,不仅仅是为了方便快速开发导航,更重要的是在App和小程序端提升性能。在这两个平台,底层原生引擎在启动时无需等待js引擎初始化,即可直接读取 pages.json 中配置的 tabBar 信息,渲染原生tab。

"tabBar": {
    "color": "#7A7E83",
    "selectedColor": "#3cc51f",
    "borderStyle": "black",
    "backgroundColor": "#ffffff",
    "list": [{
        "pagePath": "pages/component/index",
        "iconPath": "static/image/icon_component.png",
        "selectedIconPath": "static/image/icon_component_HL.png",
        "text": "组件"
    }, {
        "pagePath": "pages/API/index",
        "iconPath": "static/image/icon_API.png",
        "selectedIconPath": "static/image/icon_API_HL.png",
        "text": "接口"
    }]
}

(2)路由跳转

路由方式 页面栈表现 触发时机
初始化 新页面入栈 uni-app 打开的第一个页面
打开新页面 新页面入栈 调用 API uni.navigateTo、使用组件 <navigator open-type=“navigate”/>
页面重定向 当前页面出栈,新页面入栈 调用 API uni.redirectTo、使用组件 <navigator open-type=“redirectTo”/>
页面返回 页面不断出栈,直到目标返回页 调用 API uni.navigateBack 、使用组件 <navigator open-type=“navigateBack”/> 、用户按左上角返回按钮、安卓用户点击物理back按键
Tab 切换 页面全部出栈,只留下新的 Tab 页面 调用 API uni.switchTab 、使用组件 <navigator open-type=“switchTab”/> 、用户切换 Tab
重加载 页面全部出栈,只留下新的页面 调用 API uni.reLaunch、使用组件 <navigator open-type=“reLaunch”/>

3.生命周期

uni-app支持vue以及小程序原生语法的生命周期。

4.全局变量

(1)通过Storage来设置

设置缓存:uni.setStorageSync(key, value)

获取缓存:uni.getStorageSync(key)

删除缓存:uni.removeStorageSync(key)

(2)getApp()

需要在app.vue里设置变量 globalData

设置变量:getApp().globalData.key = xxx

获取变量:let key = getApp().globalData.key

(3)vuex

uni-app 内置了vuex

什么时候需要用vuex?

  • 当一个组件需要多次派发事件时。例如购物车数量加减。
  • 跨组件共享数据、跨页面共享数据。例如订单状态更新。
  • 需要持久化的数据。例如登录后用户的信息。
  • 当您需要开发中大型应用,适合复杂的多模块多页面的数据交互,考虑如何更好地在组件外部管理状态时。

5.分包

分包加载配置,此配置为小程序的分包加载机制。

因小程序有体积和资源加载限制,小程序平台提供了分包方式,优化小程序的下载和启动速度。

所谓的主包,即放置默认启动页面/TabBar 页面,以及一些所有分包都需用到公共资源/JS 脚本;而分包则是根据pages.json的配置进行划分。

在小程序启动时,默认会下载主包并启动主包内页面,当用户进入分包内某个页面时,会把对应分包自动下载下来,下载完成后再进行展示。此时终端界面会有等待提示。

使用方法:

假设支持分包的 uni-app 目录结构如下:

┌─pages               
│  ├─index
│  │  └─index.vue    
│  └─login
│     └─login.vue    
├─pagesA   
│  ├─static
│  └─list
│     └─list.vue 
├─pagesB    
│  ├─static
│  └─detail
│     └─detail.vue  
├─static             
├─main.js       
├─App.vue          
├─manifest.json  
└─pages.json 

则需要在 pages.json 中填写

{
    "pages": [{
        "path": "pages/index/index",
        "style": { ...}
    }, {
        "path": "pages/login/login",
        "style": { ...}
    }],
    "subPackages": [{
        "root": "pagesA",
        "pages": [{
            "path": "list/list",
            "style": { ...}
        }]
    }, {
        "root": "pagesB",
        "pages": [{
            "path": "detail/detail",
            "style": { ...}
        }]
    }],
    "preloadRule": {
        "pagesA/list/list": {
            "network": "all",
            "packages": ["__APP__"]
        },
        "pagesB/detail/detail": {
            "network": "all",
            "packages": ["pagesA"]
        }
    }
}

四、运行发布

运行项目

npm run dev:%PLATFORM%

发布项目

npm run build:%PLATFORM%

%PLATFORM% 可取值如下:

平台
h5 H5
mp-alipay 支付宝小程序
mp-baidu 百度小程序
mp-weixin 微信小程序
mp-toutiao 头条小程序
mp-qq qq 小程序
点赞 3
收藏
评论

2 个评论

  • 黄河边的毛豆
    黄河边的毛豆
    2023-08-31

    不错。

    2023-08-31
    赞同
    回复
  • 彭世瑜
    彭世瑜
    2023-03-17

    写的不错。希望分享一些采坑的文章

    2023-03-17
    赞同
    回复
登录 后发表内容