前言

关于小程序,在这里有一句话送给正准备阅读的你-世界上本没有坑,路走的多了就有了;世界上本没有路,坑填的多了就有了。嗯~~~这句话就是作为第一次做仿小程序项目的我,历经‘磨难’得出来的肺腑之言。好了,不多说,进入正题。。

写什么

这一次分享,对象是商城类小程序-仿小米商城Lite
那商城类小程序主要的功能又是什么呢?其实也就这几个点

  • 即点即看(实时查看详情)
  • 即看即买(加入购物车或者立即够买)
  • 即搜即看即买(精准搜索)

详解:

一:实时查看详情

商城类的小程序,因为其性质为网上购物平台,必然罗列大量且繁杂的商品,就形成了多种分类,层层嵌套的结构。如何即点即看?这是我开始想要仿写这个小程序遇到的第一个大问题,难道每一个商品一个一个给它写一个相应的详情页面吗?
来看一下页面


首先,一个一个给它写一个相应的详情页面十分耗时耗力,简洁的代码是每一个程序员追求有的品质;其次,小程序代码包大小限制了你不能过多地重复代码。

  1. 解决方案:

设计一个详情页模板(如效果过图)具体的页面wxml代码就不写了,(后面会给出源码链接)我们主要分析js内的数据传输:

回到商品页:

toDetail:function(e){var index=e.currentTarget.dataset.index;// console.log(index) var detail=this.data.goodsList[index];// console.log(detail)app.globalData.detail=detail;//console.log(app.globalData.detail)this.setData({detail:detail})wx.navigateTo({url: '../../buy/buy',})}
 globalData: {userInfo:null,detail:[],tocartMsg:[]}

每次点击,获取相应的数据值,将获取的值放入app.globalData里的事先设置好的空数组内(detail),注意,这里是直接将获取的值赋给detail,这样就可以保证每一次点击的商品将信息放入detail,而detail内的数据不会保存上一次获取的商品详情信息,这样就做到了数据的实时更新,这一点很重!!因为在详情页获取detail内数据时保证了获取的时最新的数据,从而实现了即点即看的效果。

接下来详情页模板获取数据

onLoad: function (options) {// let id=options.currentTarget.dataset.id;this.setData({goodds:app.globalData.detail})//  console.log(this.data.goodds)

这样就完成了数据的传递

二:加入购物车

效果图:

同样的,在详情页实时获取用户点击查看的信息之后当然就要实现购物的功能,不然整个小程序就没有任何意义。

tocart:function(){this.setData({toCartMsg:this.data.goodds})app.globalData.tocartMsg.push(this.data.toCartMsg);wx.showToast({title: '已加入购物车',icon: 'success',duration: 2000})}

同样的,我们在 app.globalData内设置一个空数组tocartMsg,这里解释一下为什么要放到globalData里面,原因就是app.js文件的作用是监听并处理小程序的生命周期函数、声明全局变量,这样我们就可以极为方便地去引用这个小社区同志们事先无私分享的数据。

 /*** 生命周期函数--监听页面显示*/onShow: function () {this.setData({carMsg:[...app.globalData.tocartMsg]})console.log(this.data.carMsg)}

最后,在每一次页面显示的时候,都将新添加购物车的商品信息获取到,因为不能只获取一次,你购买了商品发现还有一只手指没剁掉,想再来一次,那么你就会回到页面上继续购买,所以放在onShow里面是极为合适的。

三:精准搜索

先看效果


<view class="weui-search-bar" id="searchBar"><view class="weui-search-bar__form"><view class="weui-search-bar__box"><icon class="weui-icon-search_in-box" type="search" size="14"></icon><input type="text" bindinput="input" class="weui-search-bar__input" placeholder="搜索商品" /></view></view><view class="text" bindtap="search" disbaled>搜索</view>
</view>
<view class="result"><view class="" bindtap="toDetail" wx:for="{{newList}}" wx:key="{{id}}" data-index="{{index}}"><view class="list"><image src="{{item.image}}" /><text class="title">{{item.title}}</text><text class="desc">{{item.desc}}</text><text class="price">{{item.price}}元</text></view></view>
</view>
 input:function(e){var inputValue=e.detail.value;// console.log(inputValue)this.setData({inputValue})},search:function(e){var inputValue=this.data.inputValue;//  console.log(inputValue);var goods=this.data.goodsList;//  console.log(goods);// var inputValue1=this.data.inputValue;var re=new RegExp(inputValue);var temp = [];if(inputValue==''){return false}else{for(let i=0;i<goods.length;i++){console.log(re.test(goods[i].title))if(re.test(goods[i].title)){temp.push(goods[i]);}}}// console.log(temp);this.setData({newList:temp})console.log(this.data.newList)},toDetail:function(e){var index=e.currentTarget.dataset.index;// console.log(index) var detail=this.data.newList[index];// console.log(detail)app.globalData.detail=detail;// console.log(app.globalData.detail)wx.navigateTo({url: '../../buy/buy',})}

思路:获取输入框的值,将输入框的值与商品的名称进行匹配,这里用到了正则匹配,循环遍历每一个信息,如果商品名称包含了所输入的值,就放到搜索结果数组,而后页面循环出来,最后调取详情模板--点击购买~~~

总结遇到的问题,希望对你有帮助:

一、页面跳转的多种方法:
  • 1、保留当前页面,跳转到应用内的某个页面,也就是说可以跳转到在当前目录下的所有页面
wx.navigateTo({url:'XXX'
})
  • 2、关闭当前页面,跳转到应用内的某个页面。
wx.redirectTo({url: 'test?id=1'
})
  • 3、使用组件跳转
 <navigator url='XXX'>点击跳转</navigator>
  • 4、跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
wx.switchTab({url: '/index'
})

最后一种跳转,也是踩的坑之一,在当前应用分支下要跳转到另一个tabBar页面应用,使用wx.navigateTo是没有办法实现跳转的,使用wx.switchTab即能跳转到另一个 tabBar 页面,并关闭其他 tabBar下的页面。

二、scroll-view 隐藏滚动条,让界面感官更好
::-webkit-scrollbar{width: 0;height: 0;color:transparent;
}
三、数据的设置

这是犯的最为严重的错误

"desc": "千元全面屏","url": "","price": 1799,"selected": false
getTotalPrice: function (e) {let carMsg = this.data.carMsg;let total = 0;for (let i = 0; i < carMsg.length; i++) {if (carMsg[i].selected) {total+=carMsg[i].price;}}// total=total.toFixed(1)this.setData({totalPrice: total});}

数据的设定时,双引号显得非常重要,boolea值加上双引号显然会报错,而数值类型加上双引号,在计算价格的时候,carMsg[i].price得到的结果时字符串类型,所以这样的细节应当注意

四、小程序代码包大小限制问题及优化
  • 2018年1月15号微信公开课PRO上小程序产品经理angusdu提到,为了保证小程序页面的首次加载时间控制在2秒以内,且打开不出现白页加载,小程序代码包最理想的情况是:不超过1M!又有说现在是2M,但是我遇到的问题是提示不得超过1M!超过限制将无法上传。
  • 原因:代码包过大组要是本地图片太多,因为商城的小程序需要大量的图片向用户进行展示,所以占据代码包很大一部分空间,这就要求尽量不要把图片放到本地,或者将图片进行压缩
  • 优化:1.尽量将图片、音频、数据、甚至页面搬至服务端,需要时再通过网络载入。将非核心非必要的内容移出代码包可以大幅度释放代码包空间。2.压缩。这也是上面提到的最大限度的使用模板,简洁代码

有句话送给你

千里之行始于足下,绝知此事要躬行,万事开头难走到最后发现也不过如此。作为想要走上代码这条不归路的程序员,心浮气躁就是为以后整个项目给自己挖坑奠定了良好的基础。在实施之前,页面的逻辑结构必须清晰,不能抱有走一步看一步的心态,工欲善其事必先利其器,还有就是数据的设置,条理不清晰在后期工作上会遇到非常多的问题,诸如数据的提取,会十分复杂

最后

码字不易,大佬们高抬贵手点个赞,用以鼓励本猿继续愉快踩坑。谢谢!

代码链接:https://github.com/HuanqingDe...

小程序之仿小米商城Lite相关推荐

  1. 基于原生小程序精仿的猫眼电影(可预览)

    最近基于原生小程序精仿猫眼电影,数据API都是在网上抓取的(如何抓包) 由于没有获得猫眼城市ID的API,所有数据接口没有添加城市ID参数,仅靠IP定位,所以数据可能不准确 2019.12.14更新 ...

  2. 微信小程序开发-仿今日头条(二)

    该仿今日头条的文章系列如下: 微信小程序-仿今日头条客户端 微信小程序开发-仿今日头条(二) 转载请标明:https://blog.csdn.net/yangjianbo456/article/det ...

  3. 漂流瓶php源码,微信小程序之仿微信漂流瓶

    [实例简介] 微信小程序之仿微信漂流瓶 [实例截图] [核心代码] a4c6f919-add7-4dc7-bafa-9a884a00f2e3 └── wx_plp ├── app.js ├── app ...

  4. 微信小程序之仿淘宝分类入口 —— 微信小程序实战商城系列(2)

    分类入口,已经成为了商城项目必须的布局之一,这里以仿照淘宝的分类入口来做案例 下图红框部分,就是本文重点讲解部分,另外本文并没有写点击某个入口跳转页面. 如需学习页面跳转的同学,可以参考此文 微信小程 ...

  5. uniapp生成小程序码仿商品小程序码跳转到商品详情

    uniapp生成小程序码仿商品小程序码跳转到商品详情 之前在网上找了下没有相关教程去生成小程序商品小程序码微信扫码直接跳转到小程序详情页面,今天我们就用uniapp来实现这个,其实微信小程序端方法大致 ...

  6. 餐饮小程序首页仿饿了么

    餐饮小程序首页仿饿了么,通常包括以下内容: 商家logo和名称:显示在页面顶部,用于品牌认知. 轮播图:通常位于页面中部,用于展示商家的特色菜品或促销活动. 分类导航:一般位于页面底部,方便用户快速浏 ...

  7. 微信小程序实战-仿盒马鲜生

    盒马鲜生是阿里巴巴对线下超市完全重构的新零售业态,热度十分 项目功能 * 用户信息注册 * 首页几个轮播和界面交互 * 分类商品管理购买 * 购物车界面交互及其操作 * 个人信息界面 小程序设计过程 ...

  8. 21小时精通微信小程序开发(仿猫眼电影App、微信小程序问答)

    21小时精通微信小程序开发(仿猫眼电影App.微信小程序问答) 网盘地址:https://pan.baidu.com/s/1GTpPX4A1U-w_3i6k7lLztQ 密码: 5pcz 备用地址(腾 ...

  9. 微信小程序】仿京东商品分类界面

    微信小程序]仿京东商品分类界面 要点: 1.左右两侧可以各自滑动,互不影响 → absolute布局 2.商品根据不同数量自适应排列 → flex-wrap的应用 3.切换左侧导航后,右侧显示对应变化 ...

最新文章

  1. Linux常用命令速查备忘(包括我)
  2. uwsgi的log日志中出现错误uWSGI listen queue of socket 4 full。
  3. HashTable 解决碰撞(冲突)的方法 —— 分离链接法(separate chaining)
  4. java servlet是接口_JavaWeb:Servlet 接口
  5. risc系统服务器,精简的高端 解析四大RISC服务器处理器
  6. s2sh框架搭建(辅助工具:MyEclipse)及解决一些遇到的问题
  7. python继承语法_python中继承父类的例子(python3的语法)
  8. 董明珠“不让加班了”!格力官宣:实行双休,取消加班
  9. opensuse 14.1设置默认root自动登录
  10. [推荐]HLSL编程实现PhotoShop滤镜效果
  11. 工业互联网(十三)——工业相机相关知识(初学者必备)
  12. keras merged model
  13. 音标课件软件测试,宝宝益智英语字母音标(测试版)
  14. Everything工具设置书签
  15. java ldap 父_Java LDAP操作
  16. 《Composing Programs》学习笔记(1.1)开始(关键词:软件工程/抽象/函数)
  17. win10高危服务_简单教你Win10哪些服务项可禁用关闭,爱纯净官网
  18. 欧冠超级计算机,超级计算机预测欧冠决赛:红军65%概率夺冠 萨拉赫最可能进球...
  19. 网络协议栈TSO/UFO/GSO/LRO/GRO/RSS特性
  20. 如何打开已经 force-push 的 PR (branch was force-pushed or recreated)

热门文章

  1. echart地图加载中国地图,可切换省市地图
  2. 目标端的trail文件损坏或误删除,如何重新进行抽取
  3. 团队作业1——团队展示
  4. 小米200万的新LOGO 一行代码就能修改?
  5. 大数定律与蒙特卡罗法
  6. 职场减压移魂大法几则 (转东转西)
  7. 淘宝店图片尺寸是多少?怎么修改淘宝图片的尺寸?
  8. 双问号??在 js 中的应用
  9. 分享个好用的在线翻译器拍照扫一扫方法
  10. 极度未知HyperX20周年盛惠—HyperX Cloud 2 飓风FPS耳机听音辨位