【踩坑记】微信小程序这两个坑,踩的那叫一个意外啊!(+1)

558 阅读3分钟

最近在微信小程序开发的过程中,不经意间又踩了两个坑。

这两个坑吧,踩的那叫一个意外啊。

一、value的长度居然大于maxlength,什么鬼?

事情是这样的。

一个input/textarea输入框,产品要求限制最大输入字数为50。看,多么简单的一个需求,加一个maxlength=50就搞定了。

但是,真的搞定了吗?

是的,一般场景下,的确搞定了。用户最多只能输入50个字,多一个都不能。

但是,非一般场景来了。

测试小姐姐为了方便测试,复制了一大段文字(远多于50字)到上述输入框内。从页面上看,的确只有50个字。但是一保存,传给后端的内容却远超50字,导致接口报错。

输入框value的实际长度居然大于maxlength, 这是为什么?

百思不得其解!只能曲线救国了。

也就是,传给后端时,截取字符串,保证传给后端的值,最多只有50字。

value.slice(0,50)

所以,以后遇到需要限制字数的输入框,在设置maxlength的同时,截取一下字符串,相当于上了一个双保险。

二、被fixed在屏幕底部的按钮,居然上下滚动了?

一般情况下,被fixed在屏幕底部的按钮(就是简单的fixed,没有加其他效果),是不会随着页面滚动的。

一直以来,我们也没有发现,该按钮可以滚动。

但是,就在昨天,一个很偶然的操作,我们那个被固定在屏幕底部的按钮,居然上下滚动了。

我们来场景重现下:

一个页面长度超过一屏的表单,一个被固定在屏幕底部的按钮,我们进入该页面,一直往上滚动,按钮是不动的,但是一旦编辑某个表单,然后再上下来回滚动,按钮就随之滚动了。

该页面的原代码结构如下:

 <view class="main-form">
   ... 此处省略n个表单
 </view>
  
<view class="footer-btn-box">
  <view class="btn-class" bindtap="handleSave">保存</view>
</view>

后来,将代码调整了一下:

<scroll-view scroll-y="true" scroll-with-animation="true" style="height: 100vh;">
  <view class="main-form">
   ... 此处省略n个表单
 </view>
</scroll-view>
<view class="footer-btn-box">
  <view class="btn-class" bindtap="handleSave">保存</view>
</view>

这样,无论怎么操作,按钮都不动了!

就在写此段文字的时候,我又按原代码想重现一下昨天的场景,结果按钮无论怎么操作,也是不动的。明明昨天按钮在那个场景下是会动的呀,难道眼花了?

哎,不管眼花不花,以后还是采取下面写法吧!

======= 以下是2023年4月17日更新 ========

三、弹框中的textarea,placeholder样式初次加载不生效?

最近在弹框中,写了一个textarea文本域,都是按之前的写法写的,肯定没问题。结果,就发现,弹框初次加载的时候,textarea里的placeholder样式是不生效的,也就是不是那种浅灰色,而是我们正常输入内容后的字体颜色。

而当在textarea 输入了内容后,再删掉,placeholder显示的样式就正常了。

真是奇怪,好在找到了解决办法,如下:

showPop(){
    if(!this.content){
       this.setData({
         content: '占位符'
       })
       setTimeout(()=>{
           this.setData({
              content: ''
           })
        },50);
    }
    this.setData({
        isShowPop: true
    })
}