全栈之路-微信小程序-SKU开发(代码)

  SKU开发是小程序中最难的一部分,思路在分析中已经记录过了,这里主要看一下代码的实现,感觉老师写的代码太棒了,很优雅!主要想记录一下写代码的思路,对面向对象编程的实践。

一、代码结构的分析

1、说明几个关键词

搞清楚sku的概念,搞清楚我们抽象出来的realm组件、fence组件、cell组件以及他们对应的模型类,这里模型类放到models文件夹中

realm组件 --- fence-group.js中的FenceGroup模型

fence组件 --- fence.js中的Fence模型

cell组件 --- cell.js中Cell模型

除此之外,还有

矩阵的处理模型:matrix.js中的Matrix模型

总控制模型(负责方法的调用):judger.js中的Judger模型

sku-code处理模型:sku-code.js中的SkuCode模型

2019年12月10日11:04:41截止,可能后续还会有处理sku规格值的状态的模型,后续再补充...

2、分析他们之间的联系(做的图示)

说明:

图中所示的箭头的流向是从用户的角度来看,当点击规格值进行选择时,数据的流向

感想总结:这个结构这样抽象出来,感觉太清晰了,彼此之前是独立的,可扩展的,但是彼此之间是有联系的,各司其职,哇,感觉这样写出来的代码太美好了,原来写代码可以这么舒服,好的代码,好的架构真的让人耳目一新,回味无穷啊!今后奋斗的方向,写出好的代码,优雅而强大!

二、代码的编写

这也不是完整的SKU代码,只是一部分的代码,只是用来记录一下整个SKU开发的代码的结构,看一下简单的代码(从realm组件到cell组件),实现SKU规格值的提取(SKU状态的确定代码就不记录了,太复杂了,不过之后可能记录一下其中编码思路),顺序是按照图示的顺序(开发的过程,并不是严格按照这个顺序进行编码的,开发是按照从fence-group出发,细化,抽象出fence,再进一步细化,抽象出cell)  

1、cell组件

这里不考虑SKU规格值的状态的确定,所以cell组件的代码就相对来说特别简单,只是来负责将规格值显示出来(代码中没有样式代码)

 1 // index.wxml代码
 2 <!--规格值组件-->
 3 <view bind:tap="onTap" class="container">
 4     <view class="inner-container">
 5         <text>{{cell.title}}</text>
 6     </view>
 7 </view>
 8
 9 // index.js代码 创建cell属性
10 properties: {
11     cell:Object
12 },

2、cell模型(cell.js)

创建Cell类,有构造方法以及id(规格值id)和title(规格值名称)两个属性

 1 class Cell{
 2     id // 规格值的主键id
 3     title // 规格值的名字
 4
 5     constructor(spec){
 6         this.title = spec.value
 7         this.id = spec.value_id
 8     }
 9 }
10
11 export {
12     Cell
13 }

3、fence组件

fence组件需要引入cell组件,需要用fence属性来传递数据

 1 // index.wxml
 2 <view class="container">
 3     <!--规格名-->
 4     <view class="title">{{fence.title}}</view>
 5     <!--规格名下的所有规格值-->
 6     <view class="row-container">
 7         <block wx:for="{{fence.cells}}" wx:key="{{index}}">
 8             <!--规格值组件-->
 9             <s-cell class="cell" cell="{{item}}"></s-cell>
10         </block>
11         <view class="hr"></view>
12     </view>
13 </view>
14
15 // index.js
16 properties: {
17     fence: Object
18 },
19
20 // index.json
21 {
22   "component": true,
23   "usingComponents": {
24       "s-cell":"/components/cell/index"
25   }
26 }

4、fence模型(fence,js)

创建Fence类,有构造方法,cells属性(存放一个规格名下的一组规格值),specs属性(spu(商品)的一个确定的规格值的组合,比如:金属灰-七龙珠-小号 S),title(规格名名称)以及id(规格名id)以及初始化cell的方法

 1 import {Cell} from "./cell";
 2
 3 class Fence {
 4
 5     cells = []
 6     specs
 7     title // 规格名的名字
 8     id // 规格名的主键id
 9
10     constructor(specs) {
11         this.specs = specs
12         this.title = specs[0].key
13         this.id = specs[0].key_id
14     }
15
16     init() {
17         this._initCells()
18     }
19
20     _initCells(){
21         this.specs.forEach(s=>{
22             // 去重判断
23             const existed = this.cells.some(c=>{
24                 return c.id === s.value_id
25             })
26             if(existed){
27                 return
28             }
29             const cell = new Cell(s)
30             this.cells.push(cell)
31         })
32     }
33 }
34
35 export {
36     Fence
37 }

补充说明数组(Array)中的some方法:

链接地址详解:https://www.runoob.com/jsref/jsref-some.html

some() 方法用于检测数组中的元素是否满足指定条件(函数提供)。

some() 方法会依次执行数组的每个元素:

  • 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
  • 如果没有满足条件的元素,则返回false。

注意: some() 不会对空数组进行检测。

注意: some() 不会改变原始数组。

5、realm组件(对应着fence-group.js)

realm组件需要引用fence组件,需要通过spu属性来传递数据,并且需要监听spu

 1 // index.wxml代码
 2 <view class="container">
 3     <view>
 4         <image></image>
 5     </view>
 6     <block wx:for="{{fences}}" wx:key="{{index}}">
 7         <s-fence fence="{{item}}"></s-fence>
 8     </block>
 9     <view class="counter-container">
10         <!--<l-counter></l-counter>-->
11     </view>
12 </view>
13
14 // index.js代码
15     properties: {
16         spu: Object
17     },
18
19     data: {
20         judger:Object
21     },
22
23     observers: {
24         ‘spu‘: function (spu) {
25             if (!spu) {
26                 return
27             }
28             const fenceGroup = new FenceGroup(spu)
29             fenceGroup.initFences()
30             // judge在这里并没有用到
31             // const judger = new Judger(fenceGroup)
32             // this.data.judger = judger
33             this.bindInitData(fenceGroup)
34         }
35     },
36     methods: {
37         bindInitData(fenceGroup) {
38             this.setData({
39                 fences:fenceGroup.fences
40             })
41         },
42     }
43
44 // index.json
45 {
46   "component": true,
47   "usingComponents": {
48     "s-fence":"/components/fence/index"
49   }
50 }

补充说明一下,小程序中的observer监听函数的详解:

组件数据字段监听器,用于监听 properties 和 data 的变化,参见 数据监听器

数据监听器链接地址:https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/observer.html

6、fence-group模型(fence-group.js)

创建FenceGroup类,创建spu属性、skuList属性以及fences属性,还有初始化的fence方法(这里用到了矩阵中的转置方法,具体就不记录了)

 1 import {Matrix} from "./matrix";
 2 import {Fence} from "./fence";
 3
 4 class FenceGroup {
 5     spu
 6     skuList = []
 7     fences
 8
 9     constructor(spu) {
10         this.spu = spu
11         this.skuList = spu.sku_list
12     }
13
14     initFences() {
15         const matrix = this._createMatrix(this.skuList)
16         const fences = []
17         // 进行矩阵的转置操作
18         const AT = matrix.transpose()
19         AT.forEach(r => {
20             const fence = new Fence(r)
21             fence.init()
22             fences.push(fence)
23         })
24         this.fences = fences
25     }
26
27     _createMatrix(skuList) {
28         const m = []
29         skuList.forEach(sku => {
30             m.push(sku.specs)
31         })
32         return new Matrix(m)
33     }
34
35 }
36
37 export {
38     FenceGroup
39 }

说明:矩阵的思想其实在这里简化了实现思路,可以看一下具体的矩阵是如何进行装置操作的,可看一下百度百科中的说明:

链接地址:https://baike.baidu.com/item/转置矩阵

三、重要总结

数据的流向问题在啰嗦一下:

  一切都是从商品的详情页面进行发起的,当用户点击商品的时候,跳转到详情页面,用户点击加入购物车的功能,商品的规格信息进行显示,初始化商品的规格信息,这里触发了realm组件的监听spu的方法,从而引发多米诺骨效应,从FenceGroup模型的创建,到Fence模型的创建,再到Cell模型的创建,当数据最终创建之后,在通过组件一步一步的渲染。最终呈现在用户的面前就是可选的一组规格(当然这个功能完善之后,用户看到的是一组选择好的规格路径,这里没实现),这就是完整的一个过程,当然仅仅只是一个规格值的处理提取的过程。

内容出处:七月老师《从Java后端到全栈》视频课程

七月老师课程链接:https://class.imooc.com/sale/javafullstack

原文地址:https://www.cnblogs.com/ssh-html/p/12011842.html

时间: 2024-11-10 01:51:44

全栈之路-微信小程序-SKU开发(代码)的相关文章

微信小程序云开发-从0打造云音乐全栈小程序

第1章 首门小程序“云开发”课程,你值得学习本章主要介绍什么是小程序云开发以及学习云开发的重要性,并介绍项目的整体架构,真机演示项目功能,详细介绍整体课程安排.课程适用人群以及需要掌握的前置知识.通过本章的学习,能够使大家对本门课程有一个整体的了解.... 第2章 云开发介绍以及从0构建项目本章会详细介绍小程序云开发与Serverless,并介绍如何开通小程序云开发及控制台的功能,并且初始化项目代码,讲解airbnb/javascript代码规范. 第3章 播放列表功能实现本章完成歌单列表与歌曲

微信公众号开发三级分销微商城,微信小程序定制开发

10年的技术开发团队,提供网站建设,APP开发,网站推广等服务,专业微信小程序定制开发,需要这方面的朋友,可以咨询一下. 案例演示: 成功案例: 联系方式:8582-36016 ,微信号:luenmicro ,电话:131-1221-5717

【小程序源码案例】微信小程序项目开发案例分享

作者:web小二本文标签: 微信小程序 小程序源码案例 小程序项目小程序的开发,并不是适合所有公司,我今天跟大家分享小程序方面的教程,主要是供大家学习使用.学习这种东西,有时候则是单纯的喜欢,没有任何目的,很单纯的为了好玩,记得很早之前学flash,没有想法,就是觉得好玩,纯娱乐爱好而已.到后来玩视频剪辑也是出于同样的原因,不图钱财名利,只是图自己个人爱好娱乐. 但是,学习,有时候则是需要有明确目的,特别是关系到自己吃饭问题的时候,你就需要非常有目的去学习,并且还需要制定好学习的计划与目标,希望

Mac上微信小程序官方开发工具卡死的问题

Mac上微信小程序官方开发工具打开后卡死,无法操作,也关不掉,解决方案: 三步: 1.在应用中删除"微信web开发者工具" 2.删除一下几个配置和缓存文件: 1.-/Library/Application Support/微信web开发者工具 2.~/Library/Preferences/com.tencent.wechat.devtools.plist 3.~/Library/Caches/微信web开发者工具 3.重新安装"微信web开发者工具"

微信小程序最新开发资源汇总,对学习微信小程序的新手有一定帮助

微信小程序最新开发资源汇总,希望给想学习或正在学习微信小程序开发的同学们带来一定帮助,汇总的小程序资源有点繁杂,各种类型的小程序demo都有,大家可以选择自己想要的demo进行下载学习.这些微信小程序资源大多是整理自github,如果可以,希望大家能够给github上的原作者一颗star,感谢原作者的无私奉献. 这里整理的是资源的原帖子,下载链接也在帖子里,当然本人也只体验了部分demo,有兴趣的同学可以都下载试试. 下载地址: 仿微信聊天,朋友圈小程序源码wepy框架开发的小程序商城源码,功能

微信小程序云开发

使用微信小程序云开发,可以不需要后端的参与,前端直接使用数据库. 第一步,新建一个空的云开发项目 在project.config.json 文件可以看见 "miniprogramRoot": "miniprogram/",   表示为小程序页面的文件 "cloudfunctionRoot": "cloudfunctions/", 表示云函数文件,即 在云端定义一些函数,运行环境为 nodejs, 可以做一些运算操作,然后将结果

微信小程序的开发有什么用?有什么优势?

现如今,科技发展迅速个我们带来的便利性还是很大的.而微信小程序正是依赖科技进行发展的软件.那么微信小程序的开发究竟有什么用呢?又有哪些优势呢?小程序的定义是为商家做服务的,小程序的每个功能都在为商家获客做服务,从2017年至今,不过两年时间,小程序完成了上百次的更新升级,如今,小程序的需求越来越贴近用户.可以毫不夸张的说,小程序是当下互联网最大的流量聚集地.那么小程序究竟有哪些优势呢?1.无需安装,即开即用现如今,智能手机普及,不仅可以随时随地上网,还可以使用各种便利的软件.而微信作为当下流行的

微信小程序快速开发上手

介绍: 从实战开发角度,完整系统地介绍了小程序的开发环境.小程序的结构.小程序的组件与小程序的API,并提供了多个开发实例帮助读者快速掌握小程序的开发技能,并能自己动手开发出小程序.本书的特色是突出实战,动手操作,快速开发,适合想上手小程序开发的各类人员. 本书特色: 从实战出发,介绍小程序开发的方方面面,提供丰富的开发实例,帮助读者快速上手,开发出自己的小程序. 本书是编者实际开发小程序的经验总结,书中从实战角度出版,介绍了小程序开发的所有知识和开发技能,提供了丰富的开发范例,帮助读者快速上手

一.微信小程序(开发中遇到的问题)

最近,接触了一段时间的微信小程序,在小程序的开发过程中,遇到了不少坑,再次总结一下: 1.小程序所有接口域名必须为https,而且不能加端口号: 比如:在小程序后台设置时无端口号,调用时再加入,会出现本地调试可用,线上版本不可用的情况. 2.wx.request 请求最大并发数为5,如果超过此限制,可能会出现开发工具卡死等情况: 3.wx.navigateTo 页面路径最多5层,超过5层会出现跳转失败的情况. 尽量配合wx.redirectTo和wx.navigateBack使用,其中wx.na