我在 uniapp 中开发 钉钉/浙政钉 时遇到的坑(持续更新...)

1,970 阅读8分钟

问题总结

  1. jsapi在哪里安装?
  2. 安装之后一引入就报错?
  3. 无法真机调试?
  4. 真机调试后一直显示 加载中?
  5. 子组件无法触发 click 事件?
  6. 小程序中 ios 标题显示偏上,安卓正常?
  7. 小程序中,嵌套子组件中 onPageScroll、onReachBotton无法正常触发?
  8. v-show 小程序无效?
  9. tabBar 页面在切换回来之后响应式失效?
  10. 专有钉钉上 ios 环境下,打开提示 “服务暂不可用,请稍后再试”?
  11. 真机调试时候使用 uView 组件报错?
  12. 基于 uni-popup 弹框封装一个多选框,当使用蒙版关闭的时候,无法正常关闭
  13. ios环境下、正式环境(浙政钉)里面使用小程序在input点击完成时无法隐藏键盘?
  14. 上传正式版本(浙政钉)的时候,开发工具显示成功,但是正式环境没有获取到?

问题说明:因为我使用uniapp 开发小程序是同时包含了 钉钉、浙政钉 俩套所以我遇到的问题都写在一起了。然后删除线的问题是我没有解决的问题

1.jsApi在哪里安装?

钉钉小程序 jsApi ,我在使用的时候在官方文档中一直都没有找到 jsApi 的安装方法,后面我在 H5微应用 文档中找到了安装命令: npm install dingtalk-jsapi --save 你敢相信,整个小程序文档中只有教你是用 jsApi 但是一点点教你安装命令都没有告诉你,所以在这里我搞了好久才好。 直到后来,我的小程序开发了一半了之后我有幸了解到 小程序的 jsApi 是内置的不需要额外的安装,除非你要使用 H5 的一些功能才需要去单独去安装 jsApi

2.安装之后一引入就报错?

接着第一个问题,手动安装之后我安装官方的用法引入。单单光引入就报错。Function(...) is not a function, 我人傻了。这TM都报错。后面反复实验得到解决办法
uniapp 项目不要使用 V3 版本,在创建项目的时候使用 V2 版本就不会报错了。具体为什么 V3 报错。这就不知道了

3.无法真机调试?

在写 专有钉钉小程序 的时候无法真机调试。
解决办法: 开发工具中要使用 单独的 mPaaS 模块,然后再白名单中配置自己 id就可以了

4.真机调试后一直显示 加载中?

这个比较重要
先说明下为什么这个重要:
1. 本地真机调试的时候一直都是 loading 加载中,无法使用和调试
2. 我新来这个公司后发现,以前的老项目都是把钉钉小程序和浙政钉小程序分成俩套代码来写。其中:钉钉是 uniapp项目、浙政钉是原生的项目。我咨询后发现因为之前 uniapp项目部署到浙政钉后一直显示 loading 加载中。无法使用
解决办法:
1.在真机调试的时候需要把小程序右上角 详情打开,然后关闭 2.0基础库,再去调试
2.在项目构建的时候 pages.json 文件的 pages 数组的第一个启动页的 路径(path) 一定要保持 pages/index/index 一定一定一定!!! 这样在你部署到浙政钉的时候就不会出现加载中了

5.子组件无法触发click事件?

我在使用模块化开发的时候发现,子组件无法触发click事件。解决办法:
查看子组件是否在 pages.json文件中 被注册成路由了,我把路由删掉就可以正常触发事件了
我出现这个问题的原因是:uniapp在新建页面的时候会自动在 pages.json 文件中注册,下次创建组件的时候注意:把这个选项取消

6.小程序中 ios 的标题偏上,安卓正常?

这个问题没有手动解决
ios 中页面的标题显示在中线的偏上,我没有解决后续自己好了,我还不知道为什么会出现这个情况?和怎么解决?

7.小程序中,嵌套子组件中 onPageScroll、onReachBotton无法正常触发?

这个问题没有深入研究
我个人使用了 <scroll-view/> 标签包裹了一下,使用 @scrolltolower 事件来处理触底加载

8.v-show 小程序无效?

我在 image 等标签中使用 v-show 指令无效,在 view 可以正常使用
解决办法:
1.我最后在标签中写了动态的 style来手动控制它的显示隐藏。v-if也是可以用,但是因为我需要频繁操作,所以我是自己手动来控制的。(推荐第一种,因为第二种在某种布局状态下也会失效)
2.在需要隐藏的标签外面包裹一层 view 标签,然后在 view 标签上面使用 v-show。

9.tabBar 页面在切换回来之后响应式失效?

这个属于我自己第一次开发uniapp导致的失误性BUG
前提知识: 在小程序中 tabBar 页面是不会销毁和重新挂载的
问题原因: 因为我自己想让它切换回来后能重新挂载和渲染。这样不用自己手动初始化。所以我在 onHidden 生命周期中使用了$destroy()。但是切换回来仍然没有重新挂载和渲染,并且还导致了,页面失去了响应式。
解决办法:$destroy()删除掉就恢复了,但是需要注意,后续需要自己在 onShow 里面把 data 给初始化一遍。

10.专有钉钉上 ios 环境下,打开提示 “服务暂不可用,请稍后再试”?

首先强调一下,只有在 特定环境(专有钉钉模式ios真机)下才会出现这个提示。
问题原因: 在项目中没有配置原生的 tabBar 属性导致这个问题出现。其它环境目前正常
解决办法: 就是使用原生的 tabBar 属性来配置。如果你的项目没有导航栏(tabBar),目前没有找到解决办法,但是小程序基本都需要导航栏吧。

11.真机调试时候使用 uView 组件报错?

首先强调一下,特定的发生情况 1. 真机调试或者预览 2. 使用了uView 的文本域的组件
在第 4 条中,明确指出,真机调试需要关闭 2.0 组件库然后在去调试。本来很正常的程序当你取消勾选之后 uView 中的 文本域(Textarea)组件就会报错。
前提知识:在uView 官网明确指出:由于在 nvue 下,u-textarea 名称被uni-app官方占用,在 nvue 页面中请使用 u--textarea 名称,在 vue 页面中使用 u--textarea 或者 u-textarea 均可
解决办法: 在使用的时候 把 u--textarea 换成 u-textarea 写法。

12.基于 uni-popup 弹框封装一个多选框,当使用蒙版关闭的时候,无法正常关闭

因业务需要多选框,又没有找到合适的多选框组件自己就简单封装了一下。后续有时间会完善整个多选框组件
问题原因: uni-popup 弹框层在点击蒙版关闭的时候会再次打开。多次实验得出结果,是因为 uni-popup 这个官方组件没有做 阻止事件冒泡 。然后又恰巧我的打开事件是写在 弹框 父元素上的。蒙版关闭的时候,冒泡到了父组件又再次打开了弹框。(如下图:我把事件放在了父元素上了)
解决办法: 在弹框同级写打开事件。主要是不要在弹框父元素写打开事件(@click => onTap)

Snipaste_2023-06-27_09-30-31.png

Snipaste_2023-06-27_10-10-11.png

后续计划: 1.准备把弹框和用户显示做成一个完整的一个组件。2. 优化弹框大数据不卡顿。3.增加支持分页获取数据

13.ios环境下、正式环境(浙政钉)里面使用小程序在input点击完成时无法隐藏键盘?

先讲一下问题发生的环境 1.ios 2.浙政钉 3.输入框(包括普通input、数字、文本)
问题原因: 无论使用原生的组件input 还是使用 uniapp 封装的组件在用户输入之后点击完成按钮时无法隐藏键盘,因为这些组件使用的是原生的键盘,原生的在组件封装的时候交互存在问题
解决办法:
1.在点击完成时加入一个监听事件使用 隐藏键盘 api 来完成

<textarea @confirm="confirm" laceholder="请输入事件描述" />
confirm() {
        dd.hideKeyboard();
        uni.hideKeyboard();
},

2. 在输入框组件中添加 :enableNative="false" 属性即可。下图为官网说明 强烈推荐

Snipaste_2023-07-25_11-03-35.png 官网说明链接 如果不放心可以俩种结合使用,目前自己使用第2种完全够用
注意当输入框为数字键盘的时候依然会出现无法隐藏的情况,目前本人用 type="text" 代替。有没有懂得大佬讲一下解决办法

14.上传正式版本(浙政钉)的时候,开发工具显示成功,但是正式环境没有获取到?

开发的时候上传完成,然后找工作人员更新的时候却一直无法获取到更新的正式版本,经过尝试和工作人员的沟通发现是开发工具版本的问题(自己保持怀疑,但是确实解决了问题)
解决办法: 开发工具使用 2.x 版本,本人目前使用 2.3.4
不知道现在这个问题改好了没有

各位有更好的优化方法或者问题欢迎留言和指教