小程序「轻算账」:解决拼单购物后费用难算问题的实用工具

2024-11-18
来源:网络整理

本文主要记录我在制作小程序“轻记账”过程中遇到的一些问题及解决方案。这只是一个总结,希望它包含的信息可以帮助其他人。

需要

作为像我这样省吃俭用(穷)的人,我经常点外卖或者和别人一起去逛街。但由于每个人购买的商品价值不同,使用各种优惠券或参加满减活动后,很难计算出多少钱。例如:同事有书满100元减50元的优惠券,但她想买的书只要80元。这时候她问你有没有想买的书。你挑一本20元的书结账。最后你一共花了50元。这个时候你需要给同事多少钱?最合理的方式当然是按照您购买的商品价值4:1(80:20)平分优惠券,也就是说您可以获得50*(1/5)=10元的折扣,并且最后你需要给你的同事20-10=10元!上面例子中的商品价格是比较容易计算的,但是在实际情况下这个计算特别麻烦,所以我开发了这个小程序,可以帮助你轻松计算一个人的实际支出。 (PS:如果想快速了解如何使用,建议观看视频版说明书)

准备

去逛逛,找到一个自己喜欢的页面设计,参考一下它的风格、颜色等(我知道它不好看,但我终于过关了……)

我以前用过,规则很多,所以这次不打算用了。我觉得写起来会比较灵活。我还查了多个小程序组件库:像组件库demo、WeUI组件库demo、组件库、Vant组件库demo、组件库、ZANE组件库、组件库等(可以通过关键词搜索小程序)组件',会有一系列组件库示例)。看了这么多组件库,我觉得最满意的就是组件库了。里面组件很多,我想要的都有,所以可以少写很多代码。选择使用组件库后,我发现它不仅仅是一个组件库,而且还是一个轻量级的开发框架。最突出的一点是,在编写代码时,将原来将小程序的一页分成四个文件的方法改为单个文件的方法。详细内容请参见WX开发文档。

代码

遇到的问题:

#1:可以用在小程序中吗?

好吧,我在这里用它来复制账单信息,我认为添加它更有趣。具体实现是:我直接在这个网站上复制我需要的内容,粘贴到代码中,结合计费信息拼接需要的字符串,使用API​​ wx.()将内容设置到剪贴板,就可以看到了粘贴的时候~

#2:如何优化性能?

最消耗渲染性能的代码行是this.()。在实际编码过程中,凡是没有绑定到wxml页面的数据都会被汇总到this下面。 与 this.data 完全区别。不必要的字段不得使用 this.() 进行更新。示例如下:

  1. Page({

  2.   _data: {

  3.    priceValue: ''

  4.  },

  5.  data: {

  6.    ...

  7.  },

  8.  bindPriceInput(e) {

  9.    // 在使用 input 组件的过程中我将其值暂存在 this._data 中

  10.    this._data.priceValue = e.detail.value.trim();

  11.  },

  12.  confirmPriceInput() {

  13.    // 需要的时候获取即可,无需使用到 this.setData() 函数

  14.    let priceValue = this._data.priceValue;

  15.    ...

  16.  }

  17. })

#3:如何实现清算功能?

  1. // wxml

  2. <input class="input" value="{{someValue}}"/>


  3. // js

  4. Page({

  5.  data: {

  6.    someValue: ''

  7.  },

  8.  clearInput() {

  9.    this.setData({

  10.      someValue: ''

  11.    })

  12.  }

  13. })

#4:如何引用?

我知道有两种方法,一种是转换ttf文件,详细说明可以在这里找到;另一种是参考的网上链接,详细说明可以参见这篇文章。您可以根据自己的需要选择其中之一。区别在于,一种资源是本地资源,另一种资源是托管资源。我个人更喜欢使用后一种方法,这样我就不用每次更新的时候都转换ttf文件了...

#5:如何实现自动对焦功能?

实现自动对焦功能并不难,但是我在使用场景中遇到了一个问题:我的组件放置在一个弹出组件中。我希望能够在弹出窗口出现后自动聚焦,并在弹出窗口关闭后重置控件。聚焦值,代码如下:

  1. // .wxml

  2. <ui-popup bindshow="focusInput" bindhide="blurInput">

  3.  <input focus="{{inputFocus}}"/>

  4. ui-popup>


  5. // .js

  6. focusInput() {

  7.  setTimeout(() => {

  8.    this.setData({

  9.      inputFocus: true

  10.    })

  11.  }, 300) // 300ms 是 ui-popup 组件出现时的动画时长

  12. },

  13. blurInput() {

  14.  this.setData({

  15.    inputFocus: false

  16.  })

  17. }

经过多次尝试,发现执行css动画时无法实现自动对焦。我需要在动画结束后将该值设置为 true。

#6:如何获得奖励?

个人开发者总是希望用户能够欣赏他们花费时间构建的工具,无论如何,研究如何获得欣赏总是没有坏处的。我参考了这篇文章和一些资料,了解到可以使用鉴赏码来获得奖励。但小程序组件中的二维码/小程序码图片不支持长按识别。仅wx中支持长按识别。所以我的最终计划是:

  1. // 保存了自己的赞赏码,托管在码云上,点击某个按钮后直接进入图片预览,此时赞赏码长按可识别

  2. handleLikeButton() {

  3.  wx.previewImage({

  4.    current: '', // 赞赏码图片的 http 链接

  5.    urls: [] // 需要预览的图片 http 链接列表

  6.  })

  7. }

#7: 如何在其他项目中使用组件?

我真的很喜欢这些组件,节省了我很多时间。我还想在不使用任何框架的小程序项目中使用它的组件。经过几次尝试,我的总结如下:

  1. // 当你基于 touchui 构建了一个项目,启动开发服务后(执行 `tui dev` 命令)

  2. // 可以在项目中使用它的任意组件(直接使用,不需要任何引入)

  3. // 保存代码后,框架会将修改后的 .wx 文件

  4. // 编译成 index.html、index.js、index.json、index.wxss 至对应 dist 目录中

  5. // 同时,使用到的组件也将被编译到 dist/packages/touchui-wx-components

  6. // 这些编译过后的代码就是小程序能够使用的组件代码

  7. // 可以直接将相应的文件夹复制到自己的项目中使用

  8. //(如果有缺少什么依赖的 util 文件,根据需要都复制过去就好了)


  9. // pages/home/index.wx

  10. <ui-popup>

  11.  ...

  12. ui-popup>

分享