uniapp
uniapp介绍
ts
https://uniapp.dcloud.net.cn/
uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台
HBuilderX使用
ts
首先需要登陆
文件-新建项目-uni-app-默认模版
使用vue2 或vue3版本
第一步:用工具创建完配置 mainfest.json - 微信小程序配置
第二部:找到微信小程序配置,设置appId
导入项目后,我们打开manifest.json文件,修改下小程序的AppID
ts
第三部:运行-运行到模拟器-运行设置-
运行项目-运行模拟器-安装一个底座
ts
微信开发者工具-右上角上的设置-安全-服务端口打开
ts
运行-运行到小程序模拟器-运行微信开发者工具
创建项目
通过cli工具创建项目
ts
全局安装
npm install -g @vue/cli
使用正式版
vue create -p dcloudio/uni-preset-vue my-project
使用Vue3/Vite版
创建以 javascript 开发的工程(如命令行创建失败,请直接访问 gitee 下载模板)
npx degit dcloudio/uni-preset-vue#vite my-vue3-project
npx degit dcloudio/uni-preset-vue#vite-alpha my-vue3-project
创建以 typescript 开发的工程(如命令行创建失败,请直接访问 gitee 下载模板)
npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project (使用这个)
安装依赖
ts
安装依赖
npm install
运行指令
npm run dev:mp-weixin (微信)
出现一个dist文件夹,把dist文件夹导入微信小程序程序中
项目结构
根目录
ts
node_modules 项目依赖文件夹(vue3,babel,)
src 源代码区域
.gitignore 忽略文件
index.html 首页
package.json 依赖文件
shims-uni.ts ts的配置文件
tsconfig.json ts配置文件
vite.config.ts vite配置文件
src目录
ts
pages 页面(都是vue文件,使用vue语法(div可以用view替代),也可以使用微信语法)
uni.scss 全局样式文件(样式变量)
shime-uni.d.ts 声明vue类型
pages.json 类似于微信小程序中的app.json应用文件(配置页面路由,配置导航,tabbar,分包)
mainfest.json 项目配置文件(设置微信小程序的APPID)
main.ts 入口文件
App.vue 相当于微信小程序中的app.js和app.wxss文件
pages.json
json
"pages":[
{
"path":"pages/index/index", // 路由配置 -类似于 app.json 文件中的 pages配置
"style":{
"navigationBarTitleText":"uni-app", // 页面配置- 类似于 页面配置文件中的 配置
}
}
],
"globalStyle":{ // window全局配置-类似于 app.json 文件中的 window全局配置
}
vscode插件
ts
uni-app-snippets uniapp语法提示
⚠️
*.vue 页面可以使用微信小程序语法,同时也可以使用vue3语法
生命周期
onPageScroll
监听页面在垂直方向已滚动的距离 px
uni-app-教程-页面
ts
监听页面在垂直方向已滚动的距离 px
属性 scrollTop
ts
onPageScroll : function(e) { //nvue暂不支持滚动监听,可用bindingx代替
console.log("滚动距离为:" + e.scrollTop);
},
ts
onPageScroll(event){
console.log(event)
// 如果滚动的距离大于200像素
if(event.scrollTop>200){
// 显示
back.value = true
}else{
// 隐藏
back.value = false
}
}
API
uni.pageScrollTo
uniapp-API-界面
将页面滚动到目标位置
uni.request
发送网络请求
ts
class Servive{
// 原型对象的方法
API(params:any):any{
// 定义全局基础路由
baseUrl:
// 开启加载效果
// 返回一个promise对象
return new Promise(()=>{
// 发送request请求
uni.request({
// 地址
url:baseUrl + params.url,
// 方法
method:params.method || 'GET',
// 请求体
data:params.data || {},
// 成功回调
success(res){
// 执行成功的回调
},
// 失败回调
fail(){
// 执行失败的回调
},
// 都会执行的回调
complete(){
// 关闭加载效果
uni.hideLoading
}
})
})
}
// get请求方法
get(params:any){
params.method = "GET"
return this.API(params)
}
// post请求方法
get(params:any){
params.method = "post"
return this.API(params)
}
// delete 请求方法
get(params:any){
params.method = "delete"
return this.API(params)
}
}
// 暴漏数据
export default Servive
ts
//ES6类
class Service {
//原型对象的方法
API(params: any): any {
// 定义全局基础路由
const baseURL = 'https://gmall-prod.atguigu.cn/skb';
//加载效果开启
uni.showLoading({
title: '加载中....'
})
//判断用户是否登录:如有token携带
const token = uni.getStorageSync('TOKEN');
// 定义请求头
var header: any = {};
// 如果token存在,则携带请求头
if (token) {
header.token = token;
}
// 返回一个promise对象
return new Promise((resolve, reject) => {
//uni-app 提供的API进行网络发请求
uni.request({
url: baseURL + params.url,// 请求的地址
method: params.method || 'GET',// 请求方式
data: params.data || {},// 携带的参数
header, // 请求头
success(res) {// 请求成功的回调
resolve(res.data); // 返回一个成功的Promise对象,同时简化数据
},
fail(error) { // 请求失败的回调
reject(error);
},
complete() { // 成功失败都执行
uni.hideLoading(); // 隐藏加载动画
}
})
})
}
// get请求方法
get(params: any) {
params.method = "GET";
return this.API(params);
}
// post请求方法
post(params: any) {
params.method = "POST";
return this.API(params);
}
// delete 请求方法
delete(params: any) {
params.method = "DELETE";
return this.API(params);
}
}
// 暴漏数据
export default Service;
uni.setStorageSync
存储storage中的数据
ts
uni.setStorageSync("TOKEN", result.data.token);
uni.getStorageSync
获取storage中的数据
ts
uni.getStorageSync('TOKEN');
从本地缓存中同步获取指定 key 对应的内容。
uni.showLoading
加载效果展示
ts
uni.showLoading({
title: '加载....'
})
uni.showToast
uniapp-API-界面-交互反馈
显示消息提示框。
ts
//提示
uni.showToast({ title: "取消收藏" });
uni.login
uniapp-API-第三方服务-登陆
uni.login是一个客户端API,统一封装了各个平台的各种常见的登录方式,包括App手机号一键登陆、三方登录(微信、微博、QQ、Apple、google、facebook)、各家小程序内置登录
ts
uni.login({
provider: 'weixin', //使用微信登录
success: function (loginRes) {
console.log(loginRes.authResult);
}
});
uni.navigateTo
保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack
可以返回到原页面
ts
uni.navigateTo({
url: `/pages/course/video/index?videoSourceId=${course.value.chapterList[0].children[0].videoSourceId}&courseId=${courseId.value}`,
});
uni.navigateBack()
返回上一个路由
ts
uni.navigateBack();
uni.requestPayment()
uni.requestPayment是一个统一各平台的客户端支付API,不管是在某家小程序还是在App中,客户端均使用本API调用支付
ts
uni.requestPayment({
provide:'',
})
ts
uni.requestPayment({
provider: 'alipay',
orderInfo: 'orderInfo', //微信、支付宝订单数据 【注意微信的订单信息,键值应该全部是小写,不能采用驼峰命名】
success: function (res) {
console.log('success:' + JSON.stringify(res));
},
fail: function (err) {
console.log('fail:' + JSON.stringify(err));
}
});
组件库
安装使用
方式一:通过 uni_modules 单独安装
ts
如果你没有创建uni-ui项目模板,也可以在你的工程里,通过 uni_modules 单独安装需要的某个组件。
下表为uni-ui的扩展组件清单,点击每个组件在详情页面可以导入组件到项目下,导入后直接使用即可,无需import和注册
组件名 | 组件说明 |
---|---|
uni-badge | 数字角标 |
uni-calendar | 日历 |
uni-card | 卡片 |
uni-collapse | 折叠面板 |
uni-combox | 组合框 |
uni-countdown | 倒计时 |
uni-data-checkbox | 数据选择器 |
uni-data-picker | 数据驱动的picker选择器 |
uni-dateformat | 日期格式化 |
uni-datetime-picker | 日期选择器 |
uni-drawer | 抽屉 |
uni-easyinput | 增强输入框 |
uni-fab | 悬浮按钮 |
uni-fav | 收藏按钮 |
uni-file-picker | 文件选择上传 |
uni-forms | 表单 |
uni-goods-nav | 商品导航 |
uni-grid | 宫格 |
uni-group | 分组 |
uni-icons | 图标 |
uni-indexed-list | 索引列表 |
uni-link | 超链接 |
uni-list | 列表 |
uni-load-more | 加载更多 |
uni-nav-bar | 自定义导航栏 |
uni-notice-bar | 通告栏 |
uni-number-box | 数字输入框 |
uni-pagination | 分页器 |
uni-popup | 弹出层 |
uni-rate | 评分 |
uni-row | 布局-行 |
uni-search-bar | 搜索栏 |
uni-segmented-control | 分段器 |
uni-steps | 步骤条 |
uni-swipe-action | 滑动操作 |
uni-swiper-dot | 轮播图指示点 |
uni-table | 表格 |
uni-tag | 标签 |
uni-title | 章节标题 |
uni-transition | 过渡动画 |
方式二:通过npm安装
ts
在 vue-cli 项目中可以使用 npm 安装 uni-ui 库 ,或者直接在 HBuilderX 项目中使用 npm
注意 cli 项目默认是不编译 node_modules 下的组件的,导致条件编译等功能失效 ,导致组件异常 需要在根目录创建 vue.config.js 文件 ,增加 @dcloudio/uni-ui 包的编译即可正常
// vue.config.js
module.exports = {
transpileDependencies:['@dcloudio/uni-ui']
}
ts
准备 sass
vue-cli 项目请先安装 sass 及 sass-loader,如在 HBuliderX 中使用,可跳过此步。
安装 sass
npm i sass -D 或 yarn add sass -D
安装 sass-loader
npm i sass-loader@10.1.1 -D 或 yarn add sass-loader@10.1.1 -D
安装 uni-ui
npm i @dcloudio/uni-ui 或 yarn add @dcloudio/uni-ui
配置easycom
使用 npm 安装好 uni-ui 之后,需要配置 easycom 规则,让 npm 安装的组件支持 easycom
打开项目根目录下的 pages.json 并添加 easycom 节点:
ts
// pages.json
{
"easycom": {
"autoscan": true,
"custom": {
// uni-ui 规则如下配置
"^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue"
}
},
// 其他内容
pages:[
// ...
]
}
使用
vue
在 template 中使用组件:
<uni-badge text="1"></uni-badge>
<uni-badge text="2" type="success" @click="bindClick"></uni-badge>
<uni-badge text="3" type="primary" :inverted="true"></uni-badge>
⚠️
- uni-ui 现在只推荐使用
easycom
,如自己引用组件,可能会出现组件找不到的问题- 使用 npm 安装的组件,默认情况下 babel-loader 会忽略所有 node_modules 中的文件 ,导致条件编译失效,需要通过配置
vue.config.js
解决:
ts
// 在根目录创建 vue.config.js 文件,并配置如下
module.exports = {
transpileDependencies: ['@dcloudio/uni-ui']
}
// 如果是 vue3 + vite, 无需添加配置
collapse组件
折叠面板-手风琴效果
vue
<uni-collapse ref="collapse" accordion>
<uni-collapse-item :title="item.title" v-for="(item, index) in course.chapterList"
:key="item.id">
<view class="task_list" v-for="(info, index) in item.children" :key="info.id">
<view class="task_items">
<image class="task_type"
src="https://cdn-cos-ke.myoed.com/ke_proj/mobilev2/m-core/f1c59a1527e075f6ebfba3d7ac605f07.png" />
<view class="task_title">{{ info.title }}</view>
<image v-show="!course.isBuy" class="task_icon"
src="https://cdn-cos-ke.myoed.com/ke_proj/mobilev2/m-core/064fdd1eb99fcb8bef80085f2b548e4b.png" />
</view>
</view>
</uni-collapse-item>
</uni-collapse>
rate组件
评分组件
vue
<uni-rate :touchable="false" :value="3.5" size="12" />
icon组件
图标组件
ts
<uni-icons class="input_icon" type="paperplane-filled" size="20" @click="add" />