开发笔记:使用 mpvue 开发斗图小程序

之前用过 wepy 框架写了个小程序 GitHub – yshkk/shanbay-mina: 基于 wepy 框架的 “扇贝阅读” 微信小程序 ,感觉写法上类似 vue,但不那么彻底。现在美团点评发布的 mpvue 支持开发者可以用 vue 的语法开发微信小程序,正好有强需求需要一个斗图小程序,所以就尝试了下。

 

扫码体验

(此图片来源于网络,如有侵权,请联系删除! )

截图

(此图片来源于网络,如有侵权,请联系删除! )

开发细节和坑

使用 iView Weapp 组件库

相关代码 pages/index/main.js 第 8 行

将组件库的 dist 目录拷贝到自己项目 static 目录,然后在需要用到组件的页面配置 usingComponents 即可。开发期间可能对组件的样式不太满意,或者一些蜜汁问题(比如 input 下边框突然消失 issue ),要改的话方式非常诡异 相关 issue ,所以粗暴点的方式就是直接改组件库里的 wxss 文件。

v-show 和 v-model 不好使

相关代码 pages/index/index.vue 第 4 行

关于 v-show 相关 issue ,所以只能用 v-if 替代。使用 v-if 会销毁不显示的组件,但有个场景是期望保留原来的组件,因此只能曲线救国在组件外层包一个 < view > 使用 :style=”{display?condition?’block’:’none’}” 的方式(其实最好是用 keep-alive 的方法,可惜 mpvue 不支持)。

v-model 就很奇怪了,好像 input 不能双向绑定,原因是自定义组件就没有支持 v-model ,所以得手动 update data。同理使用组件库 input 后不能使用 v-focus 。(相关 issue )

模板语法里不能调用 methods 方法

相关代码 components/homppage.vue 第 52 行

可以说是血坑了,一直以为我使用姿势有误,费了好长时间。后来才从 articles / 美团小程序框架 mpvue 蹲坑指南. md at master · noahlam/articles · GitHub 看到原来这是 mpvue 不支持。 当时的场景是这样的: 在图片列表里,给被用户 “收藏” 过的图片加个额外的 className,该 className 可以给图片加个粉色边框,这样就能在图片列表中一眼看到哪些是被收藏过的。data 里有一个表示所有图片的数组 imageList 和一个表示收藏列表的数组 favoriteList 。起初的写法是

<image v-for="img in imageList" :src="img.url" :class="isFavorite(img.url)?'image-favorite':'image'"
复制代码

其中 isFavorite 是在 methods 里的一个方法,判断当前图片 url 是否在 favoriteList 里。然而这样写一直不 work,后来只能换个方案:在 computed 里跟据 imageList 和 favoriteList计算出 一个叫 imageListWithFavorite 的数组,遍历这个数据即可:joy: 虽然很丑陋但是还能用。

将用户收藏同步到本地存储

相关代码 components/homppage.vue 第 63 行

用户收藏的表情会放到微信提供的 storage,类似浏览器的 localstorage,这样在关闭小程序以后下次来还能看到自己的收藏,因此在组件需要 watch favoriteList 的变更并调用 wx.setStorage 方法。但是不知为何直接 watch favoriteList 并不会触发相应函数,而 watch ‘favoriteList.length’就能触发,希望有大佬能指点下。

watch: {
    'favoriteList.length': {
      // 将变化更新到本地存储
      handler: function (val, oldval) {
        this.updateStorage({method: val > oldval ? 'ADD' : 'DELETE'})
      }
    }
  }
复制代码

表情包图片制作

相关代码 pages/maker/index.vue

思路是初始化一个 canvas,将表情模版(一张图片,url 从跳转过来的页面的 query 里取得)绘制到 canvas 上,用户打字 / 设置颜色字体 的时候调用 updateCanvas 。最后调用 wx.canvasToTempFilePath 方法输出成图片。 关键代码如下

ctx = wx.createCanvasContext('maker') // 选择当前 canvas
  ...
	updateCanvas () {
      ctx.drawImage(this.path, 0, 0, 300, 300) //path 为当前表情包的路径
      ctx.setTextAlign('center') // 必须每次在 updateCanvas 重新设置,否则模拟器上生效但真机下不会生效
      ctx.setFontSize(this.fontSize)
      ctx.setFillStyle(this.currentColor)
      ctx.fillText(this.txt, this.x, this.y)
      ctx.draw()
    },
复制代码

有几个小坑:

  • 将图片绘制到 canvas 时指定的图片不能是一个远端图床的链接,必须先本地下载下来(调用 wx.getImageInfo 获取图片,得到本地一个临时 path)才能绘制。
  • canvas 指定的大小单位是 px,而用 css 控制的单位是 rpx(mpvue 用了 px2rpx-loader ,就算在 css 里写成 px 也会被编译成 rpx)。
  • 小程序 canvas 的 save 和 restore 功能在这里很鸡肋,每次都需要完全重绘一次。特别是用户拖动文字更新文字坐标的功能, touchmove 事件一直触发,就一直更新 canvas,小程序里没有 requestAnimationFrame 的方法,所以就自己得~~ 从网上找~~ 封装一个,在拖动时起到节流的效果。
  • canvas 输出的图片只支持 jpg 或者 png,因此即使用 gif 图的模版也只能生成静态的表情包,残念。

总结

大体上使用 mpvue 的体验还是挺好的。mpvue 和 wepy 的写法上比较类似,mpvue 对 vue 开发者来说更友好容易上手,wepy 更接近于原生小程序。虽然框架的出现屏蔽了一些原生小程序写起来很丑陋的地方, 但是不管用什么框架,原生小程序的文档还是需要掌握的 ,有一大堆的坑等着要踩,有时候不得不从编译出的文件里面找原因。

免责声明:本站所有文章和图片均来自用户分享和网络收集,文章和图片版权归原作者及原出处所有,仅供学习与参考,请勿用于商业用途,如果损害了您的权利,请联系网站客服处理。

【小程序源码网资源版权风险说明】:
本站为避免不必要的纷争,分享的所有资源中一切可能有版权风险的资源将全部转载自第三方网站或平台,站长只为大家提供相关资源的介绍和跳转引导。 因可能有疏忽大意,所以如有遗漏资源侵犯了您的合法权利,请联系站长删除。
【小程序源码网资源下载使用说明】:
本站所分享的一切QQ小程序源码,thinkphp整站源码,微信小程序源码,图文教程等资源仅供用户学习参考使用,任何人不得作其他用途,违者自行承担所有责任。
【小程序源码网毫无人看的介绍】:
本站又称Z站,原名贼娘网,开站于2018年,换过三任站长,目前站长是第四任站长,本站是一个主要分享免费开源小程序源码/网站源码/免费素材/教程资源的网站,主要小程序资源有用于学习的小程序源码,也有正版原创可商用的小程序源码,是一个公益博客型网站。
【小程序源码网原创源码版权申明】:
未经小程序源码网许可,任何人不得擅自使用本站原创首发源码进行商业行为(除本站VIP用户在期限内,版权无使用限制),否则将依法承担相应赔偿责任。
【小程序源码网转载文章版权申明】:
本站所转载的QQ小程序或微信小程序源码与其他资源仅供学习,任何人不得作其他用途,违者自行承担所有责任。
【小程序源码网站长最后的屁话】:
如有您认为本站有任何侵犯您合法权益的文章,或者您有什么疑问需求,欢迎联系站长QQ,站长24小时在线,备注公司名称和源码版权问题或者需要小程序定制开发等站长业务类型可急速处理,如果您只是交流小程序的一些开发问题或源码问题可以加入QQ群讨论,就不用加站长啦,对于白嫖党,QQ群才是处理问题的天堂,当然站长也欢迎大家骚扰~
小程序源码网 » 开发笔记:使用 mpvue 开发斗图小程序
嘿,投喂下嘛!