# consultationUniapp
**Repository Path**: Xbaiss/consultationUniapp
## Basic Information
- **Project Name**: consultationUniapp
- **Description**: 基于uniApp开发的兼容H5以及微信小程序的练手项目
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2020-04-02
- **Last Updated**: 2025-06-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# consultationUniapp
uni-app
# 介绍
基于uniApp开发的兼容H5以及微信小程序的练手项目
uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝)、快应用等多个平台。
官网【[](https://uniapp.dcloud.io/)】
材料【[博文](https://blog.csdn.net/gao_xu_520/article/details/100920972)】
视频 [入门教程](https://www.bilibili.com/video/BV1pE411Z7E8?p=1)
uni-app 改变不了小程序,只是做兼容小程序
# 创建项目
[官网介绍](https://uniapp.dcloud.io/quickstart-hx)
# 开发规范
为了实现多端兼容,综合考虑编译速度、运行性能等因素,uni-app 约定了如下开发规范:
1、页面文件遵循[ Vue 单文件组件 (SFC) 规范](https://vue-loader.vuejs.org/zh/spec.html)
2、组件标签靠近小程序规范,详见[uni-app 组件规范](https://uniapp.dcloud.io/component/README)
3、接口能力(JS API)靠近微信小程序规范,但需将前缀 wx 替换为 uni,详见uni-app[接口规范](https://uniapp.dcloud.io/api/README)
4、数据绑定及事件处理同 Vue.js 规范,同时补充了App及页面的生命周期
5、为兼容多端运行,建议使用flex布局进行开发
# 页面样式与布局
[](https://uniapp.dcloud.io/frame?id=%e9%a1%b5%e9%9d%a2%e6%a0%b7%e5%bc%8f%e4%b8%8e%e5%b8%83%e5%b1%80)
## 单位
设计稿1px/设计稿基准宽度 = 框架样式1px/750px
如果设计稿是640px ,a元素在设计稿是宽 100px,那么a 在uni-app 宽= 750*100/640
如果设计稿是375px ,a元素在设计稿是宽 200px,那么a 在uni-app 宽= 750*200/375
uni-app 按照这上面的比例的计算的话,就是以750 设计来弄,uni-app会自动适配 任何手机的屏幕,
App端,在 pages.json 里的 titleNView 或页面里写的 plus api 中涉及的单位,只支持 px,不支持 rpx。早期 uni-app 提供了 upx ,目前已经推荐统一改为 rpx 了
## 样式导入
使用@import语句可以导入外联样式表,@import后跟需要导入的外联样式表的相对路径,用;表示语句结束。
@import "../../common/uni.css";
## 内联样式
在 uni-app 中不能使用 * 选择器。
## 选择器
[选择器](https://uniapp.dcloud.io/frame?id=%e9%80%89%e6%8b%a9%e5%99%a8)
注意:
在 uni-app 中不能使用 * 选择器。
微信小程序自定义组件中仅支持 class 选择器
page 相当于 body 节点,例如:
page {
background-color:#ccc;
}
## Flex布局
为支持跨平台,框架建议使用Flex布局,关于Flex布局可以参考外部文档A Complete Guide to Flexbox、阮一峰的flex教程等。
## 背景图片
支持 base64 格式图片。
支持网络路径图片。
使用本地路径背景图片需注意:
图片小于 40kb,uni-app 会自动将其转化为 base64 格式;
图片大于等于 40kb, 需开发者自己将其转换为base64格式使用,或将其挪到服务器上,从网络地址引用。
本地背景图片的引用路径仅支持以 ~@ 开头的绝对路径(不支持相对路径)
.test2 {
background-image: url('~@/static/logo.png');
}
## 字体图标
①支持 base64 格式字体图标。
②支持网络路径字体图标。
③网络路径必须加协议头 https。
④从 http://www.iconfont.cn 上拷贝的代码,默认是没加协议头的。
⑤uni-app 本地路径图标字体支持情况:
字体文件小于 40kb,uni-app 会自动将其转化为 base64 格式;
字体文件大于等于 40kb, 需开发者自己转换,否则使用将不生效;
字体文件的引用路径仅支持以 ~@ 开头的绝对路径(不支持相对路径)。
## style,class 三元换算
:class="{ active: isActive, 'text-danger': hasError }"
:class="[{ active: isActive }, errorClass]"
:class="[isActive ? activeClass : '', errorClass]">
v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"
:style="[{ color: activeColor, fontSize: fontSize + 'px' }]"
# 事件
## 事件修饰符
修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():
v-on 提供了事件修饰符:
.stop: 各平台均支持, 使用时会阻止事件冒泡,在非 H5 端同时也会阻止事件的默认行为
.native: 监听原生事件,仅在 H5 平台支持
.prevent: 仅在 H5 平台支持
.capture: 仅在 H5 平台支持
.self: 仅在 H5 平台支持
.once: 仅在 H5 平台支持
.passive: 仅在 H5 平台支持
注意:使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。
1. 为兼容各端,事件需使用 v-on 或 @ 的方式绑定,请勿使用小程序端的 bind 和 catch 进行事件绑定。
2. 若需要禁止蒙版下的页面滚动,可使用 @touchmove.stop.prevent="moveHandle",moveHandle 可以用来处理 touchmove 的事件,也可以是一个空函数。
3.按键修饰符:uni-app 运行在手机端,没有键盘事件,所以不支持按键修饰符。
## 事件
### 踩坑
1. 平台差异所致,bind,catch事件同时绑定时候,只会触发bind,catch不会被触发
## 是
# 配置相关
[配置列表](https://uniapp.dcloud.io/collocation/pages?id=%e9%85%8d%e7%bd%ae%e9%a1%b9%e5%88%97%e8%a1%a8)
pages.json
# 生命周期
[生命周期](https://uniapp.dcloud.io/collocation/frame/lifecycle)
# 路由
uni-app 有两种路由跳转方式:
使用navigator组件跳转,调用API(uninavigateTo(OBJECT)/uni.redirectTo(OBJECT)/uni.reLaunch(OBJECT)/uni.switchTab(OBJECT)/uni.navigateBack(OBJECT))跳转。
这个类似a标签
uni.navigateTo({
url: 'test?id=1&name=uniapp'
});
注意:uni.navigateTo 无法跳转到页面的情况下,一般是因为该链接地址在tabBar里面,所以不能用uni.navigateTo,而是uni.switchTab
# 判断平台
## 条件编辑
条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。
写法:以 #ifdef 或 #ifndef 加 %PLATFORM% 开头,以 #endif 结尾。
#ifdef:if defined 仅在某平台存在
#ifndef:if not defined 除了某平台均存在
%PLATFORM%:平台名称
## 条件编译写法:
仅出现在 App 平台下的代码
#ifdef APP-PLUS
需条件编译的代码
#endif
除了 H5 平台,其它平台均存在的代码
#ifndef H5
需条件编译的代码
#endif
在 H5 平台或微信小程序平台存在的代码(这里只有||,不可能出现&&,因为没有交集)
#ifdef H5 || MP-WEIXIN
需条件编译的代码
#endif
①、js
// #ifdef H5 || APP-PLUS
该代码仅出现在H5和 5+App的情况
// #endif
// #ifndef H5
该代码不会出现在H5的情况
// #endif
②、组件
显示
微信小程序
③、样式
/* #ifdef H5 */
.wx-color{
color:#f00;
}
/* #endif */
view{
/* #ifdef H5 */
color:#f00;
/* #endif */
}
## uni.getSystemInfoSync().platform
运行期判断 运行期判断是指代码已经打入包中,仍然需要在运行期判断平台,此时可使用 uni.getSystemInfoSync().platform 判断客户端环境是 Android、iOS 还是小程序开发工具(在百度小程序开发工具、微信小程序开发工具、支付宝小程序开发工具中使用 uni.getSystemInfoSync().platform 返回值均为 devtools)
switch(uni.getSystemInfoSync().platform){
case 'android':
console.log('运行Android上')
break;
case 'ios':
console.log('运行iOS上')
break;
default:
console.log('运行在开发者工具上')
break;
}
# 第三方登录
因小程序和app登录接口不同,需要前端进行跨域兼容处理
小程序只能微信登录,qq,微博等其他的第三方登录 是不行的。
[文档查看](http://www.html5plus.org/doc/zh_cn/oauth.html)
## 小程序
1.小程序配置
manifest.json 编写appid
"mp-weixin":{
"appid":"小程序的appid"
}
2.接口地址
[用户信息](https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html)
编写小程序登录
[微信登录](https://cloud.tencent.com/developer/article/1410675)
[微信](https://www.cnblogs.com/wfaceboss/p/10472413.html)
### 问题
1.
manifest.json 编写appid 错误
2. getUserInfo:fail 系统错误,错误码:-12001,invalid scope
不是该小程序的开发者
3. s
## APP
[h5+app登录](http://www.hcoder.net/tutorials/info_1361.html)
[登录功能APP端代码编写](https://www.bilibili.com/video/BV1xy4y167NC)
[uni-app 第三方登录(小程序篇)](https://www.kancloud.cn/guobaoguo/uni-app/821801)
[uniapp 中APP使用微信授权登录完整总结](https://www.jianshu.com/p/4278b41d9c2b)
app 端支持微信、qq、微博等多种登录方式,都需要申请对应的开发者并获取对应的 appid。获取对应的appid后打开 manifest 可视化操作填写即可。
app 端 可以多端登录,去配置就好,下面是以微信登录
1.APP模块权限配置 打钩oAuth(登录鉴权) ->微信登录(打钩) 然后填写appid appsecret
## openid和UnionID的区别
OpenID: 普通用户的标识,对当前开发者帐号唯一。一个openid对应一个公众号。
UnionID :用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。
如果只是考虑一端的话,那可以用openid 做唯一的标识。
如果要考虑多端的话,唯一性时 去微信开发平台,申请账号,认证好了。可以把公众号,小程序,APP的项目全部添加在一个账号下面
这样的话,就可以使用UnionID做唯一性。
openid 每一个应用就会有一个openid,每个应用的openid 都是不一样。每个应用的unionId是一样的
# api
## 请求
[uni.request](https://uniapp.dcloud.io/api/request/request)
## uni.chooseImage 选择手机图片
[](https://uniapp.dcloud.io/api/media/image?id=chooseimage)
功能是多端支持,但是属性兼容性不一样
### 问题
[uniapp调用API_uni.chooseImage的相机的调用不起来](https://blog.csdn.net/qq_37564189/article/details/102966943)
## uni.uploadFile 上传
[](https://uniapp.dcloud.io/api/request/network-file?id=uploadfile)
将本地资源上传到开发者服务器,客户端发起一个 POST 请求,其中 content-type 为 multipart/form-data。
如页面通过 uni.chooseImage 等接口获取到一个本地资源的临时文件路径后,可通过此接口将本地资源上传到指定服务器。
注意:App支持多文件上传,微信小程序只支持单文件上传,传多个文件需要反复调用本API。所以跨端的写法就是循环调用本API。
## 数据缓存
uni.setStorage 这个是异步(一边存储数据一边可以做其他的事情)
uni.setStorageSync 同步(存储数据完成后,再做其他的事情)
[数据缓存](https://uniapp.dcloud.io/api/storage/storage?id=setstorage)
## 设备信息
[](https://uniapp.dcloud.io/api/system/info)
## onPullDownRefresh 下拉刷新
需要在 pages.json 里,找到的当前页面的pages节点,并在 style 选项中开启 enablePullDownRefresh。
当处理完数据刷新后,uni.stopPullDownRefresh 可以停止当前页面的下拉刷新。
[](https://uniapp.dcloud.io/api/ui/pulldown?id=onpulldownrefresh)
## 上拉刷新
俩种情况下:
a. 使用scroll-view滚动组件,当滚动在一定的区域的时候,触发刷新数据
b.页面滚动底部的区域的时候,触发刷新数据【onReachBottom 利用生命周期 ,当页面滚动到底部的时候,去做触发】
俩种方式不能共存
# 功能
## 分享
[官网分享](https://uniapp.dcloud.io/api/plugins/share)
在不同平台,分享的调用方式和逻辑有较大差异。
1.App:可以自主控制分享内容、分享形式及分享平台
2.使用 uni.share API方式调用社交sdk分享
3.使用[plus.share.sendWithSystem](http://www.html5plus.org/doc/zh_cn/share.html#plus.share.sendWithSystem)呼起手机os的系统分享菜单
4.小程序:不支持API调用,只能用户主动点击触发分享。可使用自定义按钮方式