【微信小程序】踩坑指南(持续更新)
前言
说明:
v-show无法使用在小程序中
<!-- 下面这行代码无法正常工作 -->
<img v-show="IDcard" :src="IDcard" alt=""> <!-- 替代方案 -->
<img v-if="IDcard" :src="IDcard" alt="">
input标签的type无法动态赋值
<!-- 下面的inputType的值可能为:number|text|tel -->
<!-- 下面的代码无法得到正确结果 -->
<input class="value" :type="inputType" v-model="value"> <!-- 替代方案 -->
<input v-if="inputType === 'text'" class="value" v-model="value" type="text">
<input v-else-if="inputType === 'number'" class="value" v-model="value" type="number">
<input v-else class="value" v-model="value" type="tel">
img标签的src内不可使用三元运算符
<!-- 下面的写法导致src拿不到bg_identity.png -->
<img :src="IDcard?IDcard:'../../../static/images/bg_identity.png'" alt=""> <!-- 替代方案 -->
<img v-if="IDcard" :src="IDcard" alt="">
<img v-else src="../../../static/images/bg_identity.png" alt="">
详情页跳转旧数据不销毁处理办法
场景:
- 从商品列表点击一件商品进详情,返回列表页,选择另一件商品进详情,会出现上一件商品的数据后再渲染新商品的数据
// 解决方案
onUnload () {
Object.assign(this.$data, this.$options.data())
}
解释:
- 在小程序的页面卸载生命钩子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:页面显示/切入前台时触发。不可带参数,但是可以动态更新当前页

onLoad (e) {
console.log(e.id) //
},
onShareAppMessage: function (res) {
return {
title: '邀请您填简历',
path: `/pages/index/main?id=${this.id}`
}
}
textarea原生组件相关问题
- 解决textarea组件为原生组件层级最高,穿透弹窗或遮罩层。
<textarea v-model="desc" class="inp" placeholder="" auto-focus v-if="focusFlag" @blur="hideTextarea"></textarea>
<p v-else-if="!focusFlag && desc" class="textarea-replace" @click="showTextarea">{{desc}}</p>
<p v-else class="textarea-replace no-desc" @click="showTextarea">请介绍一下自己的性格特点、工作经历,描述下自己擅长做的事情</p>
export default {
data () {
desc: '',
focusFlag: true
},
methods: {
hideTextarea () {
this.focusFlag = false
},
showTextarea () {
this.focusFlag = true
}
}
}
解释:
- auto-focus很重要,不加的话,每次输入文字都得聚焦(点击)两次;
- placeholder可以通过增减p标签的class名来实现,即class="no-desc"
- @blur事件是失去焦点时触发
new Date()设置日期在IOS的兼容问题
说明:
newDate(date).getTime(),用这个方法来获取时间戳时,iphone手机上打印出的时间戳为NaN- 例:日期为2019-08-27 16:11:02时使用
new Date(date).getTime()方法无法在iphone手机上获取到对应的时间戳 - 安卓手机不管是‘-’还是‘/’都能正确转成时间戳
解决方案:
const time = '2019-08-27 16:11:02'
const newTime = new Date(time.replace(/-/g, '/')).getTime()
关于小程序中计时器的正确使用
先看实例


讲解:
- 每个需求详情对应一组倒计时
- 每次进详情页,希望数据都是初始化的状态
- 离开页面即销毁数据,下次进详情重新获取新数据
坑点:
- 每次进详情页都会生成一个计时器
- 如果页面销毁时不手动清除计时器的话会导致再次进入详情页会有两个计时器在运行,重复动作,会有越来越多的计时器存在于详情页中
- 如何销毁,计时器如何定义?
解决方案
data () {
return {
timer: null
}
},
onLoad (e) {
this.demandId = e.id
this.getDemandDetail()
},
onUnload () {
clearInterval(this.timer)
Object.assign(this.$data, this.$options.data())
},
methods: {
getDemandDetail() {
// axios请求拿到详情数据后
getDetail(this.demandId).then(res => {
// 在接口中获取到截止时间和服务器的当前时间
this.runTimer(res.data.deadline, res.data.systemDate)
})
},
runTimer (deadline, systemDate) {
deadline = deadline.replace(/-/g, '/')
systemDate = systemDate.replace(/-/g, '/')
let totalSeconds = parseInt((new Date(deadline).getTime() - new Date(systemDate).getTime()) / 1000)
this.timer = setInterval(() => {
const hours = parseInt(totalSeconds / 60 / 60) > 0 ? parseInt(totalSeconds / 60 / 60) : 0
const minutes = parseInt((totalSeconds - hours * 3600) / 60) > 0 ? parseInt((totalSeconds - hours * 3600) / 60) : 0
const seconds = parseInt(totalSeconds - hours * 3600 - minutes * 60) > 0 ? parseInt(totalSeconds - hours * 3600 - minutes * 60) : 0
// 计算出时分秒并赋值给显示区域
this.countTime.hours = hours < 10 ? '0' + hours : hours
this.countTime.minutes = minutes < 10 ? '0' + minutes : minutes
this.countTime.seconds = seconds < 10 ? '0' + seconds : seconds
// 当秒数小于零时销毁计时器,否则秒数-1
if (totalSeconds <= 0) {
this.countdownEnd = true
clearInterval(this.timer)
this.timer = null
} else {
totalSeconds--
}
}, 1000)
}
}
关键代码:
onUnload () {
// 必须执行clearInterval操作才能销毁计时器,简单的null赋值无法销毁
clearInterval(this.timer)
// 前面有介绍过,负责页面销毁后再次回到页面时初始化数据
Object.assign(this.$data, this.$options.data())
}
【微信小程序】踩坑指南(持续更新)的更多相关文章
- 微信小程序踩坑集合
1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debu ...
- 两百条微信小程序跳坑指南(不定时更新)
微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合跳坑<二百一十三> background-image无法获取本地资源图片....跳 ...
- 微信小程序踩坑之前端问题处理篇
近期完成了一个小程序,自己做的前后端开发.真是惨哭我了o(╥﹏╥)o,下面几点希望大家可以避雷. 首先,想先介绍一下我遇到问题的解决思路: 1.先在postman调试接口,看数据获取是否正常, 2.在 ...
- 微信小程序踩坑
微信小程序自定义属性data-xx使用注意事项 data-xx采用驼峰式命名时,数据传递打印显示(以jxsName与jxsname打印显示对比) data-xx全小写命名时,数据传递打印显示
- 微信小程序踩坑记
1:微信小程序之去掉横向滑动滚动条 /** 去除横向滚动条 */ ::-webkit-scrollbar { width: 0; height: 0; color: transparent; } 2: ...
- 微信小程序踩坑- tabBar.list[3].selectedIconPath 大小超过 40kb
重新启动微信小程序编辑器的时候遇到了这样的一个问题: tabBar.list[3].selectedIconPath 大小超过 40kb 微信小程序开发的过程之中总会出现这样或者那样的错误,需要我们耐 ...
- 微信小程序踩坑日记1——调用微信授权窗口
0. 引言 微信小程序为了优化用户体验,取消了在进入小程序时立马出现授权窗口.需要用户主动点击按钮,触发授权窗口. 那么,在我实践过程中,出现了以下问题. . 无法弹出授权窗口 . 希望在用户已经授权 ...
- 微信小程序避坑指南
如果对小程序还不熟悉,建议先看下另一篇小程序简介 1. 基础库和微信版本对应关系 iOS 客户端版本 基础库版本 6.7.2 2.3.0 6.7.0 2.2.5 6.6.7 2.1.3 6.6.6 2 ...
- 微信小程序踩坑之一[thist]使用技巧
刚上手小程序 时,习惯把this当成jquery中的$(this)来用,实际上这两个还是有差别的 在页面方法中调用其他方法,一般是用this.function(),直接调用小程序 的方法或函数则是用w ...
- 微信小程序踩坑之获取手机号
最近在开发小程序遇到这样一个问题, 在用户点击授权后去解密手机号时会出现第一次失败,第二次成功的情况.研究了一段时间,终于找到比较合理的解决方案,在此记录并总结一下,希望可以帮助到大家. 需求描述 在 ...
随机推荐
- iOS RGBA转YV12
引言 因为项目中要做画面共享,所以需要学一点图像相关的知识,首当其冲就是RGB转YUV了,因为图像处理压缩这一块是由专业对口的同事做的,所以呢,我这就是写一下自己的理解,如有不对的地方,还望指正,谢谢 ...
- MySQL 插入记录时自动更新时间戳
将字段设置成timestamp类型,同时默认值设置成 CURRENT_TIMESTAMP.
- Mac系统 安装Photoshop CC 2018破解版
应用场景 本人从事前端行业,但是工作中有时也需要会点PS技能,之前一直使用window系统,突然换了Mac其他软件基本都差不多安装完了,就剩下比较难搞的PS.刚开始按照网上乱七八槽的教程下载过好多次都 ...
- insert into select 引起的 "子查询返回的值不止一个。当子查询跟随在**之后,或子查询用作表达式时,这种情况是不允许的"
目录 1.事故现场 1.1 在使用 Insert into Table2 select * from Table1 将表1的数据插入到表2时,报错如下: 1.2 sql 语句 2.推测 3.解决方案 ...
- echarts画中国地图,省市区地图分享
中国地图 四川地图 重庆地图 源码分享: https://github.com/livelyPeng/ec-map
- python学习-while True语句
while True是不会跳出循环的. 在while中括号里为一个条件值,只有当条件为真的时候,会执行这条语句,直到条件为false的时候,则会跳出该循环语句.而在这里括号里的值为true,也就意味着 ...
- Java基础(八)对象包装器与自动装箱
1.对象包装器 有时候,需要将int这样的基本类型转换为对象.所有的基本类型都有一个与之对应的类.通常,这些类被称为包装器(wrapper). 这些对象包装类分别是:Integer.Long.Floa ...
- krry-transfer ⏤ 基于 element 的升级版穿梭框组件发布到 npm 啦
博客地址:https://ainyi.com/81 基于 element ui 的==升级版穿梭框组件==发布到 npm 啦 看过我之前博客的同学或许知道我之前写过关于 element 穿梭框组件重构 ...
- Flask框架实现给视图函数增加装饰器操作示例
在@app.route的情况下增加装饰器的写法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...
- 在SpringBoot中使用flyway进行数据库版本管理
本文大纲 flyway是什么 能帮助我们解决什么问题 springboot环境下使用flyway flyway的工作原理 一.flyway是什么 Flyway是一个开源的数据库版本管理工具,并且极力主 ...