前言

说明:

  • 基于mpvue框架:mpvue官方文档
  • 语法同vue框架:vue官方文档
  • 小程序中会有一些坑点,这里会就工作中遇到的坑一一列举出来
  • 无说明时请直接看代码注释

v-show无法使用在小程序中

  1. <!-- 下面这行代码无法正常工作 -->
  2. <img v-show="IDcard" :src="IDcard" alt="">
  3.  
  4. <!-- 替代方案 -->
  5. <img v-if="IDcard" :src="IDcard" alt="">

input标签的type无法动态赋值

  1. <!-- 下面的inputType的值可能为:number|text|tel -->
  2. <!-- 下面的代码无法得到正确结果 -->
  3. <input class="value" :type="inputType" v-model="value">
  4.  
  5. <!-- 替代方案 -->
  6. <input v-if="inputType === 'text'" class="value" v-model="value" type="text">
  7. <input v-else-if="inputType === 'number'" class="value" v-model="value" type="number">
  8. <input v-else class="value" v-model="value" type="tel">

img标签的src内不可使用三元运算符

  1. <!-- 下面的写法导致src拿不到bg_identity.png -->
  2. <img :src="IDcard?IDcard:'../../../static/images/bg_identity.png'" alt="">
  3.  
  4. <!-- 替代方案 -->
  5. <img v-if="IDcard" :src="IDcard" alt="">
  6. <img v-else src="../../../static/images/bg_identity.png" alt="">

详情页跳转旧数据不销毁处理办法

场景:

  • 从商品列表点击一件商品进详情,返回列表页,选择另一件商品进详情,会出现上一件商品的数据后再渲染新商品的数据
  1. // 解决方案
  2. onUnload () {
  3. Object.assign(this.$data, this.$options.data())
  4. }

解释:

  • 在小程序的页面卸载生命钩子onUnload中添加以上代码,可让data对象里的属性重新初始化

原生组件的层级问题

官方说明文档原生组件说明

举例说明:

  • 如果想让一个按钮定位在canvas内容层级上面,直接使用z-index是无效的。

解决办法:

  • 使用小程序提供的cover-view 与 cover-image组件可覆盖在部分原生组件上面。

实际例子:

  • button组件定位在canvas组件上面

注意事项:

  • 使用了cover-view组件后,cover-view容器内不能使用常规的div,a,span等等,可嵌套cover-view 、 cover-image和button
  • 可覆盖的原生组件包括map、video、canvas、camera、live-player、live-pusher

onLoad与onShow的区别

页面路由

说明:

  • onLoad:页面加载时触发。一个页面只会调用一次,可以在 onLoad 的参数中获取打开当前页面路径中的参数。
  • 例:从分享的消息卡片中带参数到指定页,如:pages/index/main?id=123
  • onShow:页面显示/切入前台时触发。不可带参数,但是可以动态更新当前页

  1. onLoad (e) {
  2. console.log(e.id) //
  3. },
  4.  
  5. onShareAppMessage: function (res) {
  6. return {
  7. title: '邀请您填简历',
  8. path: `/pages/index/main?id=${this.id}`
  9. }
  10. }

textarea原生组件相关问题

  • 解决textarea组件为原生组件层级最高,穿透弹窗或遮罩层。
  1. <textarea v-model="desc" class="inp" placeholder="" auto-focus v-if="focusFlag" @blur="hideTextarea"></textarea>
  2. <p v-else-if="!focusFlag && desc" class="textarea-replace" @click="showTextarea">{{desc}}</p>
  3. <p v-else class="textarea-replace no-desc" @click="showTextarea">请介绍一下自己的性格特点、工作经历,描述下自己擅长做的事情</p>
  1. export default {
  2. data () {
  3. desc: '',
  4. focusFlag: true
  5. },
  6. methods: {
  7. hideTextarea () {
  8. this.focusFlag = false
  9. },
  10. showTextarea () {
  11. this.focusFlag = true
  12. }
  13. }
  14. }

解释

  • auto-focus很重要,不加的话,每次输入文字都得聚焦(点击)两次;
  • placeholder可以通过增减p标签的class名来实现,即class="no-desc"
  • @blur事件是失去焦点时触发

new Date()设置日期在IOS的兼容问题

说明:

  • new Date(date).getTime(),用这个方法来获取时间戳时,iphone手机上打印出的时间戳为NaN
  • 例:日期为2019-08-27 16:11:02时使用new Date(date).getTime()方法无法在iphone手机上获取到对应的时间戳
  • 安卓手机不管是‘-’还是‘/’都能正确转成时间戳

解决方案:

  1. const time = '2019-08-27 16:11:02'
  2. const newTime = new Date(time.replace(/-/g, '/')).getTime()

关于小程序中计时器的正确使用

先看实例

讲解:

  • 每个需求详情对应一组倒计时
  • 每次进详情页,希望数据都是初始化的状态
  • 离开页面即销毁数据,下次进详情重新获取新数据

坑点:

  • 每次进详情页都会生成一个计时器
  • 如果页面销毁时不手动清除计时器的话会导致再次进入详情页会有两个计时器在运行,重复动作,会有越来越多的计时器存在于详情页中
  • 如何销毁,计时器如何定义?

解决方案

  1. data () {
  2. return {
  3. timer: null
  4. }
  5. },
  6. onLoad (e) {
  7. this.demandId = e.id
  8. this.getDemandDetail()
  9. },
  10. onUnload () {
  11. clearInterval(this.timer)
  12. Object.assign(this.$data, this.$options.data())
  13. },
  14. methods: {
  15. getDemandDetail() {
  16. // axios请求拿到详情数据后
  17. getDetail(this.demandId).then(res => {
  18. // 在接口中获取到截止时间和服务器的当前时间
  19. this.runTimer(res.data.deadline, res.data.systemDate)
  20. })
  21. },
  22.  
  23. runTimer (deadline, systemDate) {
  24. deadline = deadline.replace(/-/g, '/')
  25. systemDate = systemDate.replace(/-/g, '/')
  26. let totalSeconds = parseInt((new Date(deadline).getTime() - new Date(systemDate).getTime()) / 1000)
  27. this.timer = setInterval(() => {
  28. const hours = parseInt(totalSeconds / 60 / 60) > 0 ? parseInt(totalSeconds / 60 / 60) : 0
  29. const minutes = parseInt((totalSeconds - hours * 3600) / 60) > 0 ? parseInt((totalSeconds - hours * 3600) / 60) : 0
  30. const seconds = parseInt(totalSeconds - hours * 3600 - minutes * 60) > 0 ? parseInt(totalSeconds - hours * 3600 - minutes * 60) : 0
  31. // 计算出时分秒并赋值给显示区域
  32. this.countTime.hours = hours < 10 ? '0' + hours : hours
  33. this.countTime.minutes = minutes < 10 ? '0' + minutes : minutes
  34. this.countTime.seconds = seconds < 10 ? '0' + seconds : seconds
  35. // 当秒数小于零时销毁计时器,否则秒数-1
  36. if (totalSeconds <= 0) {
  37. this.countdownEnd = true
  38. clearInterval(this.timer)
  39. this.timer = null
  40. } else {
  41. totalSeconds--
  42. }
  43. }, 1000)
  44. }
  45. }

关键代码:

  1. onUnload () {
  2. // 必须执行clearInterval操作才能销毁计时器,简单的null赋值无法销毁
  3. clearInterval(this.timer)
  4. // 前面有介绍过,负责页面销毁后再次回到页面时初始化数据
  5. Object.assign(this.$data, this.$options.data())
  6. }

【微信小程序】踩坑指南(持续更新)的更多相关文章

  1. 微信小程序踩坑集合

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...

  2. 两百条微信小程序跳坑指南(不定时更新)

    微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合跳坑<二百一十三> background-image无法获取本地资源图片....跳 ...

  3. 微信小程序踩坑之前端问题处理篇

    近期完成了一个小程序,自己做的前后端开发.真是惨哭我了o(╥﹏╥)o,下面几点希望大家可以避雷. 首先,想先介绍一下我遇到问题的解决思路: 1.先在postman调试接口,看数据获取是否正常, 2.在 ...

  4. 微信小程序踩坑

    微信小程序自定义属性data-xx使用注意事项 data-xx采用驼峰式命名时,数据传递打印显示(以jxsName与jxsname打印显示对比) data-xx全小写命名时,数据传递打印显示

  5. 微信小程序踩坑记

    1:微信小程序之去掉横向滑动滚动条 /** 去除横向滚动条 */ ::-webkit-scrollbar { width: 0; height: 0; color: transparent; } 2: ...

  6. 微信小程序踩坑- tabBar.list[3].selectedIconPath 大小超过 40kb

    重新启动微信小程序编辑器的时候遇到了这样的一个问题: tabBar.list[3].selectedIconPath 大小超过 40kb 微信小程序开发的过程之中总会出现这样或者那样的错误,需要我们耐 ...

  7. 微信小程序踩坑日记1——调用微信授权窗口

    0. 引言 微信小程序为了优化用户体验,取消了在进入小程序时立马出现授权窗口.需要用户主动点击按钮,触发授权窗口. 那么,在我实践过程中,出现了以下问题. . 无法弹出授权窗口 . 希望在用户已经授权 ...

  8. 微信小程序避坑指南

    如果对小程序还不熟悉,建议先看下另一篇小程序简介 1. 基础库和微信版本对应关系 iOS 客户端版本 基础库版本 6.7.2 2.3.0 6.7.0 2.2.5 6.6.7 2.1.3 6.6.6 2 ...

  9. 微信小程序踩坑之一[thist]使用技巧

    刚上手小程序 时,习惯把this当成jquery中的$(this)来用,实际上这两个还是有差别的 在页面方法中调用其他方法,一般是用this.function(),直接调用小程序 的方法或函数则是用w ...

  10. 微信小程序踩坑之获取手机号

    最近在开发小程序遇到这样一个问题, 在用户点击授权后去解密手机号时会出现第一次失败,第二次成功的情况.研究了一段时间,终于找到比较合理的解决方案,在此记录并总结一下,希望可以帮助到大家. 需求描述 在 ...

随机推荐

  1. 零基础转行web前端,要学习多久?需要掌握些什么?

    web前端开发技术人才越来越吃香,而且web前端领域划分越来越细,对技术的需求越来越高,想学习web前端的人也是越来越多.那么,如何学习web前端知识?从哪开始?转型成为web前端工程师需要学些什么? ...

  2. Spring Boot 入门(七):集成 swagger2

    本片文章是基于前一篇写的,<Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图>,本篇主要介绍了spring boot集成swagger2.关于swa ...

  3. UI测试之元素定位

    定位方式优先级选择:  ID>Name>CSS>XPath 1.使用id定位 2.使用name定位 3.使用class定位 4.使用css选择器定位 示例xml: <?xml ...

  4. SpringBoot-Mysql模板多数据源加载

    SpringBoot-Mysql模板多数据源加载 qq交流群: 812321371 微信交流群: MercyYao 简介 在 java 项目里常用到 mysql 多数据源操作.结合 springboo ...

  5. 自定义的Spring Boot starter如何设置自动配置注解

    本文首发于个人网站: 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触 ...

  6. 让button的文字换行和左对齐

    btn.titleLabel.numberOfLines = 0;   btn.contentHorizontalAlignment = UIControlContentHorizontalAlign ...

  7. 微信小程序开发注意事项(优化项)

    最近公司有一个小程序开发项目,自己也自学了不少,有一些开发小心得,记录在这里. 小程序开发中注意: 1,setData 小程序视图层和逻辑层在两个独立的模块,并不具备数据直接传递的,setData相当 ...

  8. Azure EventHub快速入门和使用心得

    Azure Event Hubs(事件中心)是一个大数据流式数据摄取服务平台,每秒接受数百万事件; EventHubs 是一个有数据保留期限的缓冲区,类似分布式日志:可缩放的关键在于[分区消费模型], ...

  9. Servlet处理原生Ajax请求

    萌新小白人生中的第一篇博客,难免会有差错,还望各位大佬多多包涵. 1. Ajax技术简介      Ajax(Asynchronous JavaScript and XML,异步JavaScript和 ...

  10. Leetcode Tags(1)Linked List

    1.知识点回顾 https://www.cnblogs.com/BigJunOba/p/9174206.html https://www.cnblogs.com/BigJunOba/p/9174217 ...