服务器之家:专注于服务器技术及软件下载分享
分类导航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服务器之家 - 编程语言 - JavaScript - js教程 - 微信小程序开发篇之踩坑记录

微信小程序开发篇之踩坑记录

2022-02-16 17:36孙梦舸 js教程

这篇文章主要给大家介绍了关于微信小程序开发篇之踩坑记录的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

最近参与开发了公司的第一款小程序,开发体验基本类似于基于webview的混合式开发,可以调用官方强大的api,但也有一些坑或者说不习惯的地方。这篇文章从实用性出发,记录了开发过程中的一些问题:

1. 样式优先级混乱

在使用button组件时,发现在class中设置width不生效,下面贴上代码:

.my-button{
 width: 140rpx;
 height: 60rpx;
 line-height: 60rpx;
 padding: 0;
}

经过微信调试工具排查后,发现user agent的样式优先级居然大于我们自己写的样式类,这在浏览器中基本是不可能发生的事情

微信小程序开发篇之踩坑记录

解决方案其实比较简单,给width添加!important的后缀或者style="width:140rpx"即可,修改后我们再看一下效果:

微信小程序开发篇之踩坑记录

微信小程序开发篇之踩坑记录

加上!important之后,其实宽度的实际效果已经符合我们的预期了,但是微信调试工具却仍然显示user agent样式优先,这应该算是调试工具的一个bug吧。

2. 普通UI组件封装,参数定义繁琐

一般UI视觉稿中的基础组件,例如button,是有特定样式的:比方说背景色/字体。利用小程序的Component函数封装成组件,编写默认样式并接收外部传入的class,可以方便后续开发。

React有<tag {...props}></tag>这种写法,即组件接收props不做处理,只透传给下一个组件,但小程序不支持这种写法(苦搜无果,官方文档也没有说明)。

这就意味着我们需要把所有button组件支持的参数都罗列在properties中:

properties: {
  classes: {
   type: String,
   value: "",
  },
  type: {
   type: String,
   value: "default",
  },
  plain: {
   type: Boolean,
   value: false,
  },
  size: {
   type: String,
   value: "default",
  },
  ......
 },

3. 全局样式选择器*被禁用

*{
 box-sizing: border-box;
}

上面的代码在编译的时候就会报错,因为小程序禁用了这类选择器。大胆猜测具体原因:这类作用范围比较广的选择器和自定义组件的样式隔离产生了冲突??

那怎么去给小程序添加全局通用样式?看来只能自己把用到的标签都手动写一遍了,还好网上有现成的代码可以贴:

view,scroll-view,swiper,swiper-item,movable-area,movable-view,cover-view,cover-image,icon,text,rich-text,progress,button,checkbox-group,checkbox,form,input,label,picker,picker-view,radio-group,radio,slider,switch,textarea,navigator,functional-page-navigator,image,video,camera,live-player,live-pusher,map,canvas,open-data,web-view,ad{
 box-sizing: border-box;
}

4. 自定义组件,bind:tap调用两次

封装基础组件时,例如button,下面的写法应当避免:

onTap(e) {
 if (!this.data.disabled && !this.data.loading) {
  this.triggerEvent("tap", e.detail)
 }
},
<button bindtap="onTap"></button>

这样封装出来的组件,会触发两次tap事件,一次是小程序自身触发的,一次是通过triggerEvent触发。

可以换一个非小程序内置的事件类型,比如click:

onTap(e) {
 if (!this.data.disabled && !this.data.loading) {
  this.triggerEvent("click", e.detail)
 }
},

阻止tap事件冒泡也可以解决:

<button catchtap="onTap"></button>

5. 在wxml中用Boolean()做类型转换

例如在一个组件中,监听一个String类型的参数,如果不为空则显示text标签,否则不显示:

// player.wxml
<text class="text1" wx:if="{{ Boolean(leftText) }}">{{ leftText }}</text>
// index.wxml
<player leftText="范读"></player>

这种写法,leftText字段很明显已经传递了,但是依旧不显示text标签,当换一种写法后:

// player.wxml
<text class="text1" wx:if="{{ leftText }}">{{ leftText }}</text>

这样就是正确的,符合我们的期望。

神奇吧?

6. InnerAudioContext调用seek方法后,onTimeUpdate回调失效

InnerAudioContext用于播放音频,给它传入onTimeUpdate回调从而获取当前的播放进度。

但是当调用seek方法跳转到指定位置播放时,onTimeUpdate就不再被调用了。

小程序社区其实很多人已经提过这个问题,大概经历了1年半的时间可微信团队迟迟没有修复,只能暂时使用折中的办法来修复,解决方案其实很简单:

progressOnChange(e) {
 if (this.properties.src && this.data.innerAudioContext) {
  const innerAudioContext = this.data.innerAudioContext;
  innerAudioContext.pause();
  innerAudioContext.seek(innerAudioContext.duration * e.detail.value / 100);
  setTimeout(() => {
   innerAudioContext.play();
  }, 500);
 }
},

先暂停播放,再执行seek方法,然后设置大概500ms的延时调用play方法。

7. InnerAudioContext获取duration的时机问题

本想在音频播放前拿到duration应该是实现不了了,网上关于调用onPlay、onCanplay的说法都不太靠谱,其中一个方案是这样的:

innerAudioContext.onCanplay(() => {
 setTimeout(() => {
  this.setData({
   durationStr: secondToTimeStr(innerAudioContext.duration) || "--:--",
  });
 }, 500);
});

且不说setTimeout设置多少毫秒合适,真机上是无效的。

因此还是老老实实的用onTimeUpdate:

innerAudioContext.onTimeUpdate(() => {
 this.setData({
  durationStr: secondToTimeStr(innerAudioContext.duration) || "--:--"
 })
});

如果说觉得每次onTimeUpdate都要计算一次很耗性能的话,可以自行实现只计算一次。

8. 设置页面背景色

当前页面的json文件中有个backgroundColor字段,但是设置后无效,后面发现这个字段表示的不是可见区域的背景色,而是页面下拉时窗口的背景色。

微信小程序开发篇之踩坑记录

如果需要设置页面背景色,可以通过page标签的样式设置:

page{
 background: #f9fafb;
}

总结

到此这篇关于微信小程序开发篇之踩坑记录的文章就介绍到这了,更多相关微信小程序开发踩坑内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/6884089615700426766

延伸 · 阅读

精彩推荐
  • js教程javascript实现简单留言板案例

    javascript实现简单留言板案例

    这篇文章主要为大家详细介绍了javascript实现简单留言板案例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    爱前端的茂茂8052022-01-20
  • js教程JavaScript 绘制饼图的示例

    JavaScript 绘制饼图的示例

    这篇文章主要介绍了JavaScript 绘制饼图的示例,帮助大家更好的利用JavaScript绘制图表,感兴趣的朋友可以了解下...

    MwqgKG11392022-01-21
  • js教程JavaScript实现4位随机验证码的生成

    JavaScript实现4位随机验证码的生成

    这篇文章主要为大家详细介绍了JavaScript实现4位随机验证码的生成,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    weixin_4202683110452022-01-10
  • js教程js编写轮播图效果

    js编写轮播图效果

    这篇文章主要为大家详细介绍了js编写轮播图效果的代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    晚咹4802022-02-16
  • js教程JavaScript 实现继承的几种方式

    JavaScript 实现继承的几种方式

    这篇文章主要介绍了JavaScript 实现继承的几种方式,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下...

    him89802022-01-21
  • js教程通过滑动翻页效果实现和移动端click事件问题

    通过滑动翻页效果实现和移动端click事件问题

    这篇文章主要介绍了滑动翻页效果实现和移动端click事件问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需...

    行舟客5412022-01-07
  • js教程js实现电灯开关效果

    js实现电灯开关效果

    这篇文章主要为大家详细介绍了js实现电灯开关效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    小苏(º﹃º )7162022-01-04
  • js教程微信小程序视频弹幕发送功能的实现

    微信小程序视频弹幕发送功能的实现

    这篇文章主要介绍了微信小程序视频弹幕发送功能的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的...

    保护我方豆豆5052021-12-21