uni-app 护眼背景色

https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/35112

  1. 绿柔环保主题

idea 配置护眼色

https://blog.csdn.net/ring300/article/details/81237629

uni-app 执行流程

  1. 1、下载hbuilderxhttps://download.dcloud.net.cn/HBuilderX.2.6.11.20200409.full.zip
  2. 2、导入代码:本地目录或者git
  3. 3、安装项目npm依赖: 代码包位置,按shift键右键选择powershell 执行 npm i
  4. 4、安装环境依赖包:工具》安装插件》选择编译时提示的需要安装的包
  5. 5、开发测试环境:选项编译 dev【运行》运行到微信模拟器】
  6. 6、发布版本:选择编译 build;【发行》小程序-微信】
  7. 7、配置微信开发者工具端口号:打开微信开发者工具》安全设置》开启》使用默认55520
  8. 8、开发与发布:开发包仅开发调试用,需要编译开发后热刷新的;编译包是发布包,可以直接提交代码审核

uni 统计入门教程

https://ask.dcloud.net.cn/article/36303

hbuilder 快捷键

https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/35357

  • Alt+Shift+o 折叠、展开
  • Alt+w 左边大纲
  • Ctrl+q 关闭其他标签

hbuilder 保存即编译

uniapp - 图1

uniapp - 图2

项目目录地址:{projectHome}/unpackage/dist/dev

uniapp - 图3

uniapp - 图4

注意:发布的时候,不要上传dev代码,之前上传错了,贼慢。

运行模式(dev)下不压缩代码且含有sourcemap,体积较大;若要正式发布,请点击发行菜单进行发布

  1. npm run dev:%PLATFORM%
  2. # PLATFORM
  3. # mp-alipay = 支付宝
  4. # mp-weixin = 微信小程序

发布

命令行操作

  1. npm run build:%PLATFORM%
  2. # PLATFORM
  3. # mp-alipay = 支付宝
  4. # mp-weixin = 微信小程序

在HBuilderX中顶部菜单依次点击 “发行” => “小程序-支付宝”,即可在 /unpackage/dist/build/mp-alipay 生成支付宝小程序项目代码。

uniapp - 图5

在支付宝小程序开发者工具中,导入生成的支付宝小程序项目,测试项目代码运行正常后,点击“上传”按钮上传代码,在 支付宝小程序后台,选择刚提交的版本点击提交审核,详见:支付宝小程序文档

应用生命周期

uni-app 支持如下应用生命周期函数:

函数名 说明
onLaunch uni-app
初始化完成时触发(全局只触发一次)
onShow uni-app
启动,或从后台进入前台显示
onHide uni-app
从前台进入后台
onError uni-app
报错时触发
onUniNViewMessage nvue
页面发送的数据进行监听,可参考 nvue 向 vue 通讯
onUnhandledRejection 对未处理的 Promise 拒绝事件监听函数(2.8.1+)
onPageNotFound 页面不存在监听函数
onThemeChange 监听系统主题变化

注意

页面生命周期

https://uniapp.dcloud.io/collocation/frame/lifecycle?id=页面生命周期

函数名 说明 平台差异说明 最低版本
onLoad 监听页面加载,其参数为上个页面传递的数据,参数类型为Object(用于页面传参),参考示例
onShow 监听页面显示。页面每次出现在屏幕上都触发,包括从下级页面点返回露出当前页面(当切换其他应用程序的时候,返回回来,也会show一次)
onReady 监听页面初次渲染完成。注意如果渲染速度快,会在页面进入动画完成前触发
onHide 监听页面隐藏
onUnload 监听页面卸载
onResize 监听窗口尺寸变化 App、微信小程序
onPullDownRefresh 监听用户下拉动作,一般用于下拉刷新,参考示例
onReachBottom 页面滚动到底部的事件(不是scroll-view滚到底),常用于下拉下一页数据。具体见下方注意事项
onTabItemTap 点击 tab 时触发,参数为Object,具体见下方注意事项 微信小程序、支付宝小程序、百度小程序、H5、App(自定义组件模式)
onShareAppMessage 用户点击右上角分享 微信小程序、百度小程序、字节跳动小程序、支付宝小程序
onPageScroll 监听页面滚动,参数为Object nvue暂不支持
onNavigationBarButtonTap 监听原生标题栏按钮点击事件,参数为Object App、H5
onBackPress 监听页面返回,返回 event = {from:backbutton、 navigateBack} ,backbutton 表示来源是左上角返回按钮或 android 返回键;navigateBack表示来源是 uni.navigateBack ;详细说明及使用:onBackPress 详解
。支付宝小程序只有真机能触发,只能监听非navigateBack引起的返回,不可阻止默认行为。
app、H5、支付宝小程序
onNavigationBarSearchInputChanged 监听原生标题栏搜索输入框输入内容变化事件 App、H5 1.6.0
onNavigationBarSearchInputConfirmed 监听原生标题栏搜索输入框搜索事件,用户点击软键盘上的“搜索”按钮时触发。 App、H5 1.6.0
onNavigationBarSearchInputClicked 监听原生标题栏搜索输入框点击事件 App、H5 1.6.0
onShareTimeline 监听用户点击右上角转发到朋友圈 微信小程序 2.8.1+
onAddToFavorites 监听用户点击右上角收藏 微信小程序 2.8.1+

路由

/pages.json

  1. {
  2. "pages": [
  3. {
  4. "path": "pages/home/home", // 页面路径
  5. "style": {
  6. "navigationBarTitleText": "首页", //设置页面标题文字
  7. "enablePullDownRefresh":true //开启下拉刷新
  8. }
  9. },
  10. ],
  11. "globalStyle":{ // 全局外观配置
  12. "navigationBarTextStyle": "black", // 导航栏标题颜色
  13. "navigationBarTitleText": "钉家医", // 导航栏标题文字内容
  14. "navigationBarBackgroundColor": "#FFF", // 导航栏背景颜色
  15. "backgroundColor": "#F8F8F8" // 窗口的背景色 微信小程序
  16. },
  17. "tabBar": {
  18. "color": "#5D5C5C", // tab 上的文字默认颜色
  19. "selectedColor": "#1A8BFB", // tab 上的文字选中时的颜色
  20. "borderStyle": "black", // tabbar 上边框的颜色,仅支持 black/white
  21. "backgroundColor": "#ffffff", // tab 的背景色
  22. "list": [{
  23. "pagePath": "pages/home/home", // 页面路径,必须在 pages 中先定义
  24. "iconPath": "static/shouye22x.png", // 图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px,当 postion top 时,此参数无效,不支持网络图片
  25. "selectedIconPath": "static/shouye2.png", // 选中时的图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px ,当 postion top 时,此参数无效
  26. "text": "首页" // tab 上按钮文字
  27. },
  28. ]
  29. }
  30. }
  • tabBar 底部导航,如下图所示

uniapp - 图6

钉钉专属tabbar

调用dd.setTabBarBadge为 tabBar 某一项的右上角添加文本。

  1. dd.setTabBarBadge({
  2. index: 0,
  3. text: '新'
  4. })

uniapp - 图7

修改后台服务地址

util/api.js

  1. // const host = 'http://192.168.1.245/api' //测试
  2. const host = 'http://118.190.27.104:8291/api/' //正式

取 URL 上的参数

shop.vue 页面跳转代码如下

  1. //服务详情
  2. navto_fwdetail(id){
  3. uni.navigateTo({
  4. url:'fwDetails?id='+id
  5. })
  6. },

fwDetails.vue 页面取值代码如下

  1. onLoad(e) {
  2. this.id = e.id;
  3. },

轮播图集成

  1. <view class="swiper">
  2. <swiper :indicator-dots="true" :autoplay="true" :interval="3000" :duration="1000" indicator-active-color="#fff"
  3. circular="true">
  4. <swiper-item v-for="(item,i) in banner" :key="i" >
  5. <view class="swiper-item" @click="toskip(item)">
  6. <image :src="$http.host()+item.imgUrl" mode="widthFix"></image>
  7. </view>
  8. </swiper-item>
  9. </swiper>
  10. </view>
  • interval 自动切换时间间隔,单位毫秒
  • duration 轮播图切换速度 ,单位毫秒
  1. //轮播图
  2. getswiper() {
  3. this.$http.get('/banner/list', {
  4. userType: this.userType
  5. }).then(res => {
  6. console.log(res, '轮播图')
  7. this.banner = res
  8. })
  9. },

分类导航

uniapp - 图8

  1. <view class="shop_fwGoods_Nav">
  2. <scroll-view scroll-x>
  3. <view class="fwGoods_Nav_part" :class="{ active: navI == index }" v-for="(item, index) in navList" @click="selectNav(item.id)">{{ item.name }}</view>
  4. </scroll-view>
  5. </view>
  1. export default {
  2. data() {
  3. return {
  4. // 服务分类
  5. navList:[],
  6. navI: 0 //当前导航的下标
  7. };
  8. },
  9. }

小程序图片高度适应

widthFix

  1. <image :src="$http.host()+item.imgUrl" mode="widthFix"></image>

富文本显示

uniapp - 图9

  1. <rich-text :nodes="contentNodes" class="richtext"></rich-text>
  1. // 导入转换的包
  2. import parse from 'mini-html-parser2';
  3. data(){
  4. return{
  5. contentNodes:{},
  6. }
  7. },
  8. methods:{
  9. getServeProduct(){
  10. var id = this.id;
  11. this.$http.get('/shopServe/getServeProduct',{id:id}).then(res => {
  12. this.serveProduct = res
  13. let string = res.content.replace(/\<img/gi, '<img style="max-width:100%;height:auto" ')
  14. parse(string, (err, htmlNodes) => {
  15. if (!err) {
  16. this.contentNodes = htmlNodes
  17. }
  18. })
  19. })
  20. },
  21. }

参考:https://uniapp.dcloud.io/component/rich-text

成功跳转

  1. this.$http.post('/shopTask/submit').then(res => {
  2. console.log(res, '答题测试问题提交')
  3. if(res=='成功'){
  4. uni.navigateTo({
  5. url:'answerOver'
  6. })
  7. }
  8. })

util/api.js 封装http请求

  1. // const host = 'http://dingjiayi.vaiwan.com/api' //本地
  2. const host = 'http://dingjiayi.cn1.utools.club/api' //测试
  3. // const host = 'http://118.190.27.104:8291/api/' //正式
  4. let Promises = Promise
  5. Promises.prototype.finally = function(callback) {
  6. let P = this.constructor
  7. return this.then(
  8. value => P.resolve(callback()).then(() => value),
  9. reason => P.resolve(callback()).then(() => {
  10. throw reason
  11. }))
  12. }
  13. class Https {
  14. host() {
  15. return host
  16. }
  17. request(url, method, data, type) {
  18. // console.log(data)
  19. const token = uni.getStorageSync('token')
  20. // console.log(token)
  21. uni.showLoading({
  22. title: '加载中'
  23. });
  24. return new Promises((resolve, reject) => {
  25. uni.request({
  26. // dd.httpRequest({
  27. url: host + url, // 接口地址
  28. method: method, // 接口类型
  29. data: {
  30. ...data
  31. },
  32. header: {
  33. 'token': token,
  34. 'content-type': 'application/json' //'application/x-www-form-urlencoded'// 默认值
  35. },
  36. success: function(res) {
  37. uni.hideLoading() // 关闭加载中
  38. // console.log(res)
  39. if (res.data.code == 200) {
  40. resolve(res.data.data)
  41. } else {
  42. resolve(res.data.data)
  43. uni.showToast({
  44. title: res.data.message,
  45. icon: 'none',
  46. duration: 2000
  47. })
  48. }
  49. },
  50. fail: function(error) {
  51. uni.hideLoading() // 关闭加载中
  52. uni.showModal({
  53. title:'提示',
  54. content:error.errMsg,
  55. })
  56. reject(error)
  57. }
  58. })
  59. })
  60. uni.hideLoading() // 关闭加载中
  61. }
  62. get(url, data) {
  63. return this.request(url, 'GET', data, 0)
  64. }
  65. post(url, data) {
  66. return this.request(url, 'POST', data, 0)
  67. }
  68. postNoFormat(url, data) {
  69. return this.request(url, 'POST', data, 1)
  70. }
  71. // 上传图片
  72. upImg(tempFilePaths, count, length) {
  73. let timestamp = Date.parse(new Date()) // 获取时间戳
  74. return new Promises((resolve, reject) => {
  75. wx.showLoading({
  76. title: '正在上传第' + (Number(count) + 1) + '张'
  77. })
  78. wx.uploadFile({
  79. url: qiniuHost,
  80. filePath: tempFilePaths[count],
  81. name: 'file',
  82. formData: {
  83. token: uni.getStorageSync('qiniuToken'),
  84. key: timestamp + Math.floor(Math.random() * 10000) + '.png'
  85. },
  86. success(res) {
  87. let imgKey = JSON.parse(res.data).key
  88. if (Number(count) + 1 === length) { // 上传完毕
  89. wx.showToast({
  90. title: '上传成功',
  91. icon: 'success',
  92. duration: 2000
  93. })
  94. }
  95. resolve(imgKey)
  96. },
  97. fail: function(error) {
  98. reject(error)
  99. }
  100. })
  101. })
  102. }
  103. // uniApi
  104. uniApi(params, data) {
  105. return new Promises((resolve, reject) => {
  106. params.events({
  107. ...data,
  108. success(res) {
  109. resolve(res)
  110. },
  111. fail(err) {
  112. reject(err)
  113. }
  114. })
  115. })
  116. }
  117. }
  118. const https = new Https()
  119. export default https

加下拉刷新

uniapp - 图10

  1. onReachBottom() {
  2. if(this.jtlist.length < this.total) {
  3. this.pageNum++
  4. this.getlecturelist()
  5. }
  6. },

data 默认值的定义

  • 根据后台后台数据是否显示,默认值给null
  • 如果不是,默认值给0

代码如下

  1. <view v-if="taskQuesStatus==0" class="submit_answer">
  2. <view class="submit_btn" @click="navto_over">
  3. 提交
  4. </view>
  5. </view>
  6. <script>
  7. export default{
  8. data(){
  9. return{
  10. // 答题状态
  11. taskQuesStatus:null,
  12. }
  13. },
  14. onShow() {
  15. this.getTaskQuesStatus()
  16. },
  17. methods:{
  18. // 获取答题状态
  19. getTaskQuesStatus(){
  20. this.$http.get('/shopTask/getTaskQuesStatus').then(res => {
  21. console.log(res, '获取答题状态')
  22. this.taskQuesStatus = res
  23. this.listTaskQues()
  24. })
  25. },
  26. }
  27. </script>

默认值给 0 的情况下

uniapp - 图11

默认值给 null 的情况下

uniapp - 图12

分页处理

  1. <script>
  2. export default {
  3. data() {
  4. return {
  5. shopAddressList: [],
  6. pageNum:1,//分页
  7. isfenye:false,//判断是否有数据可以分页如果是false 则可以分页 true则不能分页
  8. }
  9. },
  10. // 页面滚动到底部的事件(不是scroll-view滚到底),常用于下拉下一页数据
  11. onReachBottom() {
  12. if(!this.isfenye){
  13. this.pageNum++
  14. this.listShopAddress()
  15. }
  16. },
  17. methods: {
  18. listShopAddress() {
  19. if(this.pageNum == 1){
  20. this.shopAddressList = []
  21. }
  22. this.$http.get('/shopAddress/listShopAddress',{pageNum:this.pageNum,pageSize:10}).then(res=>{
  23. console.log(res, '收货地址列表')
  24. // 根据后台框架返回的分页数据去改
  25. if(res.list.length<10){
  26. this.isfenye = true
  27. }
  28. // concat 是用于下拉刷新,每次加载的数据都得拼接上原数据
  29. this.shopAddressList = this.serveProductList.concat(res.list)
  30. })
  31. }
  32. }
  33. </script>

切换导航,数据记得清空

uniapp - 图13

  1. <template>
  2. <view class="orderList_modular_Nav">
  3. <view class="orderList_modular_Nav_part" :class="{active:Navi==-1}" @click="nav(-1)">
  4. 全部
  5. </view>
  6. <view class="orderList_modular_Nav_part" :class="{active:Navi==1}" @click="nav(1)">
  7. 待使用
  8. </view>
  9. </view>
  10. </template>
  11. <script>
  12. export default {
  13. data() {
  14. return {
  15. Navi: 1,
  16. orderList: []
  17. }
  18. },
  19. methods: {
  20. nav(i) {
  21. this.Navi = i
  22. this.orderList = []
  23. this.listOrder(i)
  24. },
  25. listOrder(i){
  26. }
  27. }
  28. </script>

uniapp 弹框出提醒消息

参考:https://uniapp.dcloud.io/api/ui/prompt?id=showtoast

  1. uni.showToast({
  2. title: res.data.message,
  3. icon: 'none',
  4. duration: 2000,
  5. succcess:function(){
  6. // 注意:需要配置一个定时器,1.5秒后执行其他操作
  7. setTimeout(() => {
  8. _this.refresh();
  9. }, 1500);
  10. }
  11. })
参数 类型 必填 说明 平台差异说明
title String 提示的内容,长度与 icon 取值有关。
icon String 图标,有效值详见下方说明。
image String 自定义图标的本地路径 App、H5、微信小程序、百度小程序
mask Boolean 是否显示透明蒙层,防止触摸穿透,默认:false App、微信小程序
duration Number 提示的延迟时间,单位毫秒,默认:1500
position String 纯文本轻提示显示位置,填写有效值后只有 title
属性生效, 有效值详见下方说明。
App
success Function 接口调用成功的回调函数
fail Function 接口调用失败的回调函数
complete Function 接口调用结束的回调函数(调用成功、失败都会执行)

icon 值说明

说明 平台差异说明
success 显示成功图标,此时 title 文本最多显示 7 个汉字长度。默认值
loading 显示加载图标,此时 title 文本最多显示 7 个汉字长度。 支付宝小程序不支持
none 不显示图标,此时 title 文本在小程序
最多可显示两行,App
仅支持单行显示。

弹出成功后调用js方法

let _this = this ,调用方法的时候用 _this

  1. sure(id) {
  2. // 确认核销订单
  3. this.$http.get('/shopServe/updateOrderStatus', {
  4. orderId: id
  5. }).then(res => {
  6. console.log(res, '确认核销订单')
  7. let _this=this
  8. if (res == 'ok') {
  9. uni.showToast({
  10. title: '核销成功',
  11. icon: 'none',
  12. duration: 2000,
  13. success: function() {
  14. // 注意:需要配置一个定时器,1.5秒后执行其他操作
  15. setTimeout(() => {
  16. _this.listOrder()
  17. }, 1500);
  18. }
  19. }
  20. })
  21. }
  22. })
  23. },

动态设置当前页面的标题

uniapp - 图14

https://uniapp.dcloud.io/api/ui/navigationbar

  1. // editAddress.vue
  2. onLoad(e) {
  3. var title = "添加收货地址"
  4. if(e.id){
  5. title = "编辑收货地址"
  6. }
  7. // 钉钉微应用(h5)不支持 钉钉微应用(h5)参考
  8. uni.setNavigationBarTitle({
  9. title: title
  10. });
  11. },

因为在onLoad内执行需要延迟一小段时间,在 pages.json 配置路由不要命名

  1. {
  2. "path": "pages/shop/editAddress",
  3. "style": {
  4. // 无名氏
  5. "navigationBarTitleText": ""
  6. }
  7. },

钉钉页面导航标题一直不变

兼容性问题

https://ding-doc.dingtalk.com/document/app/set-the-navigation-bar-title

dd.js

  1. setTitle(title){
  2. dd.biz.navigation.setTitle({
  3. title : title,//控制标题文本,空字符串表示显示默认文本
  4. onSuccess : function(result) {
  5. /*结构
  6. {
  7. }*/
  8. },
  9. onFail : function(err) {}
  10. });
  11. }

页面引用 onReady

  1. onReady(){
  2. this.$dd.setTitle("首页")
  3. },

跳转页面会出现 undefined

在最上层 view 加上 v-if = 'xxx!=null'

小程序编译后,直接进入某个页面

uniapp - 图15

uniapp - 图16

钉钉支付宝支付

返回码 含义
9000 订单支付成功
8000 正在处理中,支付结果未知(有可能已经支付成功),请通过 alipay.trade.query
接口查询订单支付状态
4000 订单支付失败
6001 用户中途取消
6002 网络连接出错
6004 支付结果未知(有可能已经支付成功),请通过 alipay.trade.query
接口查询订单支付状态
其他 其他支付错误
  1. dd.biz.alipay.pay({
  2. info: 'xxxx', // 订单信息,
  3. onSuccess: function (result) {
  4. {
  5. memo: 'xxxx', // 保留参数,一般无内容
  6. result: 'xxxx', // 本次操作返回的结果数据
  7. resultStatus: '' // 本次操作的状态返回值,标识本次调用的结果
  8. }
  9. },
  10. onFail: function (err) {
  11. }
  12. });

钉钉弹框提醒

  1. dd.alert({
  2. content:JSON.stringify(res)
  3. })

页面单独显示一张图片

uniapp - 图17

  1. <template>
  2. <view class="box">
  3. <image class="img" src="https://i.loli.net/2021/01/30/b2J5d9ePGNatzWY.png" mode="widthFix" ></image>
  4. </view>
  5. </template>
  6. <style lang="scss" scoped>
  7. .box {
  8. padding: 0;
  9. position: relative;
  10. }
  11. .box .img {
  12. width: 100%;
  13. height: 100%;
  14. }
  15. </style>

注意: widthFixaspectFill 的区别

  • widthFix 宽度不变,高度自动变化,保持原图宽高比不变
  • aspectFill 保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。

https://uniapp.dcloud.io/component/image?id=image

App.vue

通用css 都可以放在这,其他页面都可以引用

内网穿透报错

Invalid Host header

manifest.json 添加一下代码:

  1. "h5" : {
  2. "uniStatistics" : {
  3. "enable" : false
  4. },
  5. "devServer": {
  6. //解决127.0.0.1指向其他域名时出现"Invalid Host header"问题
  7. "disableHostCheck": true
  8. }
  9. },

集成钉钉h5微应用

  • 如果报下面的错误,项目需要初始化

uniapp - 图18

  1. npm init
  2. # 一直回车即可
  • 安装 dingtalk-jsapi
  1. npm install dingtalk-jsapi --save
  • util 目录创建一个 dd.js
  1. import * as dd from 'dingtalk-jsapi'
  2. export default{
  3. getCode(callback) {
  4. let corpId = 'ding81c870a3d9410366a1320dcb25e91351'
  5. // alert(dd.env.platform)
  6. if (dd.env.platform !== 'notInDingTalk') {
  7. dd.runtime.permission.requestAuthCode({
  8. corpId: corpId,
  9. onSuccess: function(result) {
  10. /*{
  11. code: 'hYLK98jkf0m' //string authCode
  12. }*/
  13. alert(result.code);
  14. callback(result.code)
  15. },
  16. onFail : function(err) {
  17. alert('err'+err);
  18. }
  19. });
  20. }
  21. }
  22. }
  • main.js 引入 dd.js
  1. import dd from './util/dd.js' //引入dingtalk.js
  2. Vue.prototype.$dd = dd // dingtalk.js
  • home.vue 使用
  1. this.$dd.getCode(code=>{
  2. console.log(code)
  3. })

自定义导航栏使用注意

uniapp - 图19

pages.jsonglobalStyle 添加以下代码

  1. "globalStyle": {
  2. # custom即取消默认的原生导航栏
  3. "navigationStyle":"custom"
  4. }

uniapp - 图20

uniapp 存储本地数据缓存

  • 存 setStorageSync
  1. uni.setStorageSync('token',token)
  • 取 getStorageSync
  1. uni.getStorageSync('token')

uniapp 跳转其他页面

  • 配置路由 pages.json
  1. {
  2. "path": "pages/home/report",
  3. "style": {
  4. "navigationBarTitleText": "报表"
  5. }
  6. }
  • 跳转页面
  1. uni.navigateTo({
  2. url: 'report'
  3. })

页面通讯

先定义,再回传,比如选择申请人,弹出一个申请人列表,然后把勾选的申请人ids回传回来。

  1. // 我的页面
  2. onLoad(){
  3. // 监听事件
  4. uni.$on('login',(usnerinfo)=>{
  5. this.usnerinfo = usnerinfo;
  6. })
  7. },
  8. onUnload() {
  9. // 移除监听事件
  10. uni.$off('login');
  11. },

进入登陆页面,触发事件

  1. // 登陆页面
  2. uni.$emit('login', {
  3. avatarUrl: 'https://img-cdn-qiniu.dcloud.net.cn/uploads/nav_menu/10.jpg',
  4. token: 'user123456',
  5. userName: 'unier',
  6. login: true
  7. });

画页面的时候 加一个边框

  1. border: 1px red solid;

增加下拉刷新事件

https://uniapp.dcloud.io/api/ui/pulldown

vue 页面

  1. onPullDownRefresh(){
  2. this.listChangeWorkRecord();
  3. },

pages.json

  1. {
  2. "path": "pages/home/home",
  3. "style": {
  4. "navigationBarTitleText": "首页",
  5. // style 选项中开启 enablePullDownRefresh
  6. "enablePullDownRefresh":true
  7. }
  8. },

自定义 uni-app 弹框样式

uniapp - 图21

https://ask.dcloud.net.cn/article/37639

H5 弹窗解决思路,全局修改 uni.showModal 弹窗样式

App.vue 添加以下代码

  1. <style>
  2. /*每个页面公共css */
  3. .uni-modal .uni-modal__bd{
  4. // CSS3 内容对齐开始边界
  5. text-align: start;
  6. }
  7. </style>

PopUp 弹出层

https://ext.dcloud.net.cn/plugin?id=329

uniapp - 图22

代码如下:

  1. <view class="report_bottom">
  2. <view @click="$refs.popu.open()">
  3. <text>值班注意事项</text>
  4. </view>
  5. </view>
  6. <uni-popup ref="popu">
  7. <view class="popu-box" >
  8. <scroll-view scroll-y="true" class="popu-content">
  9. <view v-html="content"></view>
  10. </scroll-view>
  11. <view class="model-close" @click="$refs.popu.close()" >
  12. <image src="/static/img/cha@2x.png"></image>
  13. </view>
  14. </view>
  15. </uni-popup>
  1. data() {
  2. return {
  3. content:"",
  4. };
  5. }

uni-app页面滑到一定距离固定某个元素在顶部,如导航栏

参考:https://www.cnblogs.com/lishuang2243/p/12487746.html

效果如图所示

uniapp - 图23

代码如下

  1. <view class="report_table" :style="isTop == 1 ? 'position:fixed;background:#FFFFFF;z-index:9;top:0' :''">
  2. <view class="head head1">值班日期</view>
  3. <view class="head head2">带班领导</view>
  4. <view class="head head3">值班人员</view>
  5. <view class="head head4">值班车辆</view>
  6. </view>
  1. data() {
  2. return {
  3. isTop: 0,
  4. };
  5. },
  6. mounted() {
  7. console.log('mounted 组件挂载完毕状态===============》');
  8. const query = uni.createSelectorQuery().in(this);
  9. query.select('.report_table').boundingClientRect(data => {
  10. // console.log("得到布局位置信息" + JSON.stringify(data));
  11. // console.log("节点离页面顶部的距离为" + data.top);
  12. this.myScroll = data.top - 3
  13. }).exec();
  14. },
  15. // 监听页面滚动
  16. onPageScroll: function(e) {
  17. if (e.scrollTop >= this.myScroll) {
  18. this.isTop = 1
  19. } else {
  20. this.isTop = 0
  21. }
  22. },

日期选择器

参考:https://uniapp.dcloud.io/component/picker

uniapp - 图24

uniapp - 图25

代码如下:

  1. <!-- fields=year 显示年 -->
  2. <picker @change="changeDate" mode="date" fields="year">{{dateStr}}</picker>
  3. <!-- fields=month 显示月份 -->
  4. <picker @change="changeDate" mode="date" fields="month">{{dateStr}}</picker>
  5. <!-- 默认显示天 -->
  6. <picker @change="changeDate" mode="date" >{{dateStr}}</picker>
  1. data(){
  2. return {
  3. dateStr:'2021-02-01',
  4. };
  5. },
  6. methods:{
  7. changeDate(event){
  8. this.dateStr = event.detail.value;
  9. },
  10. }

tabbar 在 h5 端高度问题

  1. .box{
  2. min-height: calc(100vh - 100rpx);
  3. }

tabbar常见问题 https://uniapp.dcloud.io/collocation/pages?id=tips-tabbar

input @confirm事件

代码如下:

  1. <input class="txt" v-model="userName" @confirm="getReport()" placeholder="搜索"></input>

隐藏键盘框、隐藏软键盘

https://uniapp.dcloud.io/api/key?id=hidekeyboard

  1. uni.hideKeyboard();

PC适配

宽屏适配指南

https://uniapp.dcloud.io/adapt

在根目录新增 postcss.config.js 文件

  1. // postcss.config.js
  2. const path = require('path')
  3. module.exports = {
  4. parser: 'postcss-comment',
  5. plugins: {
  6. 'postcss-import': {
  7. resolve(id, basedir, importOptions) {
  8. if (id.startsWith('~@/')) {
  9. return path.resolve(process.env.UNI_INPUT_DIR, id.substr(3))
  10. } else if (id.startsWith('@/')) {
  11. return path.resolve(process.env.UNI_INPUT_DIR, id.substr(2))
  12. } else if (id.startsWith('/') && !id.startsWith('//')) {
  13. return path.resolve(process.env.UNI_INPUT_DIR, id.substr(1))
  14. }
  15. return id
  16. }
  17. },
  18. 'autoprefixer': {
  19. overrideBrowserslist: ["Android >= 4", "ios >= 8"],
  20. remove: process.env.UNI_PLATFORM !== 'h5'
  21. },
  22. // 借助postcss-px-to-viewport插件,实现rpx转px,文档:https://github.com/evrone/postcss-px-to-viewport/blob/master/README_CN.md
  23. // 以下配置,可以将rpx转换为1/2的px,如20rpx=10px,如果要调整比例,可以调整 viewportWidth 来实现
  24. 'postcss-px-to-viewport': {
  25. unitToConvert: 'rpx',
  26. viewportWidth: 200,
  27. unitPrecision: 5,
  28. propList: ['*'],
  29. viewportUnit: 'px',
  30. fontViewportUnit: 'px',
  31. selectorBlackList: [],
  32. minPixelValue: 1,
  33. mediaQuery: false,
  34. replace: true,
  35. exclude: undefined,
  36. include: undefined,
  37. landscape: false
  38. },
  39. '@dcloudio/vue-cli-plugin-uni/packages/postcss': {}
  40. }
  41. }

pages.json 添加以下内容

  1. "globalStyle": {
  2. // rpx 计算所支持的最大设备宽度,单位 px,默认值为 960
  3. "rpxCalcMaxDeviceWidth": 960,
  4. // rpx 计算使用的基准设备宽度,设备实际宽度超出 rpx 计算所支持的最大设备宽度时将按基准宽度计算,单位 px,默认值为 375
  5. "rpxCalcBaseDeviceWidth": 375,
  6. // rpx 计算特殊处理的值,始终按实际的设备宽度计算,单位 rpx,默认值为 750
  7. "rpxCalcIncludeWidth": 750
  8. },

换行

  1. // 在长单词或 URL 地址内部进行换行
  2. word-wrap:break-word

运行app

运行自定义基座.pnguniapp打包截图.png

在uni回调里面不能用this

需要在外面单独定义一个 let _this = this , 然后用 _this

  1. let _this = this;
  2. uni.login({
  3. onlyAuthorize:true,
  4. provider: 'weixin',
  5. success: function (loginRes) {
  6. var code = loginRes.code;
  7. login_pwd({
  8. username: code,
  9. loginType: 3,
  10. loginSource: 3
  11. }).then(res => {
  12. console.log('登录成功',res);
  13. _this.toast('登录成功');
  14. // 将token保存到vuex中
  15. _this.saveToken(res.data.access_token);
  16. });
  17. });
  18. },
  19. fail: function (err) {
  20. console.log(err,'loginByWx fail');
  21. }
  22. });
  23. },

uni.previewImage 在h5下页面标题变为http://xxxx/#/preview-image

点击图片预览
预期结果:
预览图片页面的页面标题使用全局配置的标题
实际结果:
显示的是http://xxxx/#/preview-image
bug描述:
在浏览器环境下使用 uni.previewImage 预览图片页面标题变为http://xxxx/#/preview-image。
image.png
解决方案:
是由于 Vue2 实现 previewImage 是路由跳转,title会跟着改变。你可以自己处理一下 document.title

  1. uni.previewImage({
  2. current: e,
  3. urls: this.imglist,
  4. success(){
  5. setTimeout(()=>{
  6. document.title = '图片预览'
  7. }, 0)
  8. }
  9. })