前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手摸手带你分析记录那些年我们一起淌过的小程序坑

手摸手带你分析记录那些年我们一起淌过的小程序坑

作者头像
用户2231227
发布2022-09-26 10:59:39
3090
发布2022-09-26 10:59:39
举报
文章被收录于专栏:前端技术专栏-吴佳

前言

自从公司的IM项目倒了之后,就置身投入到了教育类产品的研发。目前公司主要业务是做一个教育类的微信小程序,本人也是从最开始还没写过一个完整小程序项目的小白,到现在已经开发过一个完整小程序项目的小菜鸟。

从中经历了太多的心酸,所以我有话要说,更希望后面开发小程序的各位兄弟,不要和我一样走太多弯路而浪费了宝贵时间。

接下来,正文的内容就要开始了,如果你还没关注我的公众号,希望各位能够支持我,关注一下公众号,这也是给我的动力,写出更好的文章去帮助你们,谢谢~

正文

第一坑 textarea 层级过高无法被覆盖

项目开发中都会有这样的需求,在一个表单中需要遮罩弹窗做一些事情,而当你表单中有textarea组件的时候,你就会发现textarea会比你遮罩层级要高,无论你的遮罩z-index设置的有多大都是无效的,无法覆盖textarea。

至于发生这样的事情,是因为textarea是原生组件,所以当你使用非原生节点,比如:view,text是无法覆盖过原生组件的。如果你非要覆盖textarea,也不是不可取的,你可以使用cover-view视图节点去做遮罩,这样你就能完美的盖过textarea了。

当然,如果你使用了cover-view,那么就会造成它所在子级只支持嵌套 cover-view、cover-image,还可以在 cover-view 中使用 button。cover-view还可覆盖的原生组件包括: map、video、canvas、camera、live-player、live-pusher。

其它解决方法:在弹出遮罩层的时候把textarea组件隐藏,关闭遮罩后重新显示textarea组件。

提示:video的层级问题在开发者工具中不会显露出来,z-index会起作用,一定要在真机上测试。

第二坑 事件冒泡和捕获的bug

如果是view绑定事件,会存在子组件触发事件,即使用事件捕获也没法阻止。但是用button就不存在这样的问题。建议有点击事件的都应该使用button

代码语言:javascript
复制
// 给当前view绑定一个tapNav事件
<view class="btn" bindtap="tapNav" data-nav="1">
</view>

// 给当前view绑定一个tapNav事件
<view class="btn" bindtap="tapNav" data-nav="1">
  <view data-nav="2"></view>
</view>

// 读取当前执行事件的view data-nav值打印出来
// 第一个打出1
// 第二个如果点击的位置是子view的话,会打印出2.
tapNav: function(event){
  console.log(event.target.dataset.nav)
}

第三坑 scroll-view不触发bindscrolltolower事件

在开发列表上拉分页加载功能时用到了小程序提供的组件scroll-view(可滚动视图区域),通过bindscrolltolower(滚动到底部/右边,会触发 scrolltolower 事件)绑定了一个方法,但是无论我怎么上拉,并没有触发该方法,发现自己遗漏了一个属性,需要给scroll-view配上height样式属性,这样才能触发事件。

代码语言:javascript
复制
<scroll-view 
  scroll-y style="height:1200rpx" 
  lower-threshold="30rpx" 
  bindscrolltolower="searchScrollLower" 
 ></scroll-view>

第四坑 页面通过事件传值问题

通常我们想通过点击页面列表某一项时进行传值,在绑定的方法里进行取值会用到data-index="{data}"来进行传值,在这里发现了一个小坑。

代码语言:javascript
复制
<view data-INDEX=“1” bind:tap="taphandler">第一项内容</view>

taphandler ({ currentTarget }) {
  const index = currentTarget.dataset.INDEX // 错的
  const index = currentTarget.dataset.index // 对的
}

跟据上方代码就可以看出问题了,在我们设置属性名的时候是大写的,但是取值的时候需要小写,所以一定要注意~免得出些奇怪的bug

第五坑 background图片url不能为本地图片

比如

代码语言:javascript
复制
background: url(../imgs/xxx.png); // 这样图片并不能显示。

解决的办法

1:将图片上传到服务器,填写服务器上的图片的路径地址。

2:将图片转为base64编码。

第六坑 预览文档问题

两种方式:

1.web-view组件,在微信后台设置好域名后直接调用

代码语言:javascript
复制
<web-view src="{{url}}"></web-view>

这种方式在android下会下载该文件,这种体验很糟糕。

2.使用openDocumenAPI

代码语言:javascript
复制
wx.downloadFile({
    url: 'http://xxxxx.com/xxxx.pdf',
    success: function(res) {
        const filePath = res.tempFilePath
        wx.openDocument({
            filePath: filePath,
            success: function(res) {
                console.log('打开文档成功')
            }
        })
    }
})

第七坑 数据绑定 Mustache 语法(双大括号)

这个 {{}} 里面不能执行任何的方法,只能做简单的四则运算和Boolen判断,比如:

代码语言:javascript
复制
<view wx:for="{{['1.22', '2.22', '3.222']}}" wx:for-item="i">
  {{parseInt(i)}}
</view>

你这么干是不行的,你只能在拿到数据的时候就先对数据格式化一遍。

但是你如果非要在渲染的时候再格式化的话也行,你就只能通过WXS来处理了,比如:

代码语言:javascript
复制
<wxs module="m1">
    var parse = function(str) {
        return parseInt(str);
    };
    module.exports.parse = parse;
</wxs>
<view wx:for="{{['1.22', '2.22', '3.222']}}" wx:for-item="i">
  {{m1.parse(i)}}
</view>

结语

以上是整理出来的一部分,开发中其实遇到的不止这么些问题,当时遇到时没有做好记录,所以一时也不能全部想起来。好像还有个订阅消息的坑,到时候放后面再说,今天就到这里吧~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端技术专栏 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档