当前位置:   article > 正文

微信小程序作品实例_微信小程序案例

微信小程序案例

目录

简介

作品详情

作品代码

一、主页界面

1、WXML文件:

2、WXSS文件:

3、JS文件

4、JSON文件:

5、补充 

二、购物车界面

 1、WXML文件

 3、JS文件

 4、JSON文件

三、分类界面和个人中心界面


简介

        这是我在学习完微信小程序后,写的一个小案例,是一个关于女性商品的,数据也是自己通过数组写的死数据。这是学习完vue之后才学习的,感觉和vue很像,导致我自己的懒癌犯了,学不进去了,就大致了解之后就上手了,因为写的比较简单,部分我感觉重复的功能也没有写。所有整体来说写的还是比较顺利。

作品详情

        这个作品我写了四个页面,分别是首页、分类、购物车、个人中心。其中主页和个人中心页面的功能,相对其它两个页面来说更多一点。

        在作品中我使用了一个插件库Lin UI,但是我感觉功能一般,所有大家可以使用其他的

微信小程序插件库

作品代码

一、主页界面

1、WXML文件:
  1. <!--pages/home/home.wxml-->
  2. <!--轮播图-->
  3. <view class="swiper-container">
  4. <swiper indicator-dots="{{true}}" autoplay interval="3000" duration="1500" circular class="swiper">
  5. <swiper-item class="lun">
  6. <image mode="scaleToFill" src="/images/carousel/carousel-1 .jpg"></image>
  7. </swiper-item>
  8. <swiper-item class="lun">
  9. <image mode="scaleToFill" src="/images/carousel/carousel-2.jpg"></image>
  10. </swiper-item>
  11. <swiper-item class="lun">
  12. <image mode="scaleToFill" src="/images/carousel/carousel-3.jpg"></image>
  13. </swiper-item>
  14. </swiper>
  15. </view>
  16. <view class="brand-title">
  17. <text>品牌推荐</text>
  18. </view>
  19. <view class="container">
  20. <!--循环遍历数组grids1中的品牌数据展示到界面上-->
  21. <view wx:for="{{grids1}}" wx:key="idx" wx:for-index="idx" wx:for-item="item" class="container-grid">
  22. <view class="sort-grid">
  23. <image mode="widthFix" src="{{item.src}}"></image>
  24. <view class="">{{item.text}}</view>
  25. </view>
  26. </view>
  27. </view>
  28. <!--商品推荐-->
  29. <view class="">
  30. <image src="/images/fashion/fashion.png" mode="scaleToFill" class="fashion" />
  31. <view class="fashion-brand">
  32. <!--循环遍历数组grids2中的商品数据展示到界面上-->
  33. <view wx:for="{{grids2}}" wx:key="idx" wx:for-item="item" class="brand-holder">
  34. <image mode="widthFix" src="{{item.src1}}" class="holder-src1"></image>
  35. <view class="brand-logo-holder">
  36. <image mode="widthFix" src="{{item.src2}}" class="holder-src2"></image>
  37. </view>
  38. <view class="siding">
  39. <text>2023新款优雅打揽千鸟格舒适显瘦百搭女装</text>
  40. <text style="font-size: 30rpx; padding-top: 10rpx; color: rgb(241, 6, 124); font-weight: 700;">{{item.text2}}</text>
  41. </view>
  42. <view class="brand-price">
  43. <l-price unit="¥" value="666" class="price" color="#000"></l-price>
  44. <button plain="{{falsh}}" class="holder-button" style="width: 110rpx;height: 30rpx; line-height: 10rpx;" bindtap="buy" data-id="{{item.idx}}">
  45. <view style="font-size: 10rpx;">加入购物车</view>
  46. </button>
  47. </view>
  48. </view>
  49. </view>
  50. </view>
2、WXSS文件:
  1. /* pages/home/home.wxss */
  2. .lun image {
  3. width: 750rpx;
  4. height: 300rpx;
  5. }
  6. .swiper-container {
  7. margin-bottom: 14rpx;
  8. }
  9. .brand-title {
  10. font-size: 40rpx;
  11. font-weight: 600;
  12. margin: 25rpx 20rpx;
  13. }
  14. .brand-title text {
  15. display: block;
  16. text-align: center;
  17. }
  18. .container {
  19. width: 95%;
  20. display: flex;
  21. margin: auto;
  22. flex-wrap: wrap;
  23. justify-content: space-around;
  24. border-left: 1rpx solid #dddddd;
  25. border-top: 1rpx solid #dddddd;
  26. }
  27. .container-grid {
  28. width: 33%;
  29. border-bottom: 1rpx solid #dddddd;
  30. border-right: 1rpx solid #dddddd;
  31. }
  32. .sort-grid {
  33. text-align: center;
  34. margin-top: 25rpx;
  35. margin-bottom: 25rpx;
  36. font-size: 16rpx;
  37. }
  38. .sort-grid image {
  39. width: 50%;
  40. }
  41. .fashion {
  42. width: 760rpx;
  43. height: 100rpx;
  44. }
  45. .fashion-brand {
  46. display: flex;
  47. flex-wrap: wrap;
  48. margin: 40rpx;
  49. justify-content: space-around;
  50. font-size: 10rpx;
  51. text-align: center;
  52. }
  53. .brand-holder {
  54. margin: 20rpx;
  55. position: relative;
  56. width: 230rpx;
  57. height: 420rpx;
  58. border: 1px solid #dddddd;
  59. }
  60. .holder-src1 {
  61. width: 230rpx;
  62. }
  63. .brand-logo-holder {
  64. width: 52rpx;
  65. height: 28rpx;
  66. position: absolute;
  67. background-color: #fff;
  68. border: 1px solid #dddddd;
  69. top: 50%;
  70. left: 50%;
  71. transform: translate(-50%, -50%);
  72. }
  73. .holder-src2 {
  74. position: absolute;
  75. width: 60rpx;
  76. /* height: 20rpx; */
  77. top: 50%;
  78. left: 50%;
  79. transform: translate(-50%, -50%);
  80. }
  81. .siding text {
  82. display: block;
  83. margin: auto;
  84. width: 200rpx;
  85. font-size: 20rpx;
  86. color: #818181;
  87. }
  88. .siding text {
  89. display: block;
  90. margin: auto;
  91. width: 200rpx;
  92. font-size: 20rpx;
  93. color: #818181;
  94. }
  95. .holder-button {
  96. color: #ec0973;
  97. width: 60rpx;
  98. height: 18rpx;
  99. line-height: 2rpx;
  100. padding: 10rpx 10rpx;
  101. border: 1rpx solid #ec0973;
  102. }
  103. .brand-price {
  104. display: flex;
  105. margin-top: 10%;
  106. margin-left: 5%;
  107. line-height: -1rpx;
  108. }
  109. .brand-holder:hover {
  110. border: 1rpx solid #ec0973;
  111. }
  112. .brand-holder:hover .holder-button {
  113. color: #fff;
  114. background-color: #ec0973;
  115. }
3、JS文件
  1. // pages/home/home.js
  2. Page({
  3. /**
  4. * 页面的初始数据
  5. */
  6. data: {
  7. grids1: [{
  8. src: "/images/sort/sort-1.png",
  9. text: "恩裳",
  10. idx: 0
  11. },
  12. {
  13. src: "/images/sort/sort-2.png",
  14. text: "音儿",
  15. idx: 1
  16. },
  17. {
  18. src: "/images/sort/sort-3.png",
  19. text: "波司登",
  20. idx: 2
  21. }, {
  22. src: "/images/sort/sort-4.png",
  23. text: "诗篇",
  24. idx: 3
  25. }, {
  26. src: "/images/sort/sort-5.png",
  27. text: "哥弟",
  28. idx: 4
  29. }, {
  30. src: "/images/sort/sort-6.png",
  31. text: "富挺",
  32. idx: 5
  33. }, {
  34. src: "/images/sort/sort-7.png",
  35. text: "罗蒙",
  36. idx: 6
  37. }, {
  38. src: "/images/sort/sort-8.png",
  39. text: "米皇",
  40. idx: 7
  41. }, {
  42. src: "/images/sort/sort-9.png",
  43. text: "天美意",
  44. idx: 8
  45. }
  46. ],
  47. grids2: [{
  48. src1: "/images/fashion/fashion-1.png",
  49. src2: "/images/fashion/fashion-icon-1.png",
  50. text1: "对白女装疯抢专场",
  51. text2: "三折封顶",
  52. idx: 0
  53. }, {
  54. src1: "/images/fashion/fashion-2.png",
  55. src2: "/images/fashion/fashion-icon-2.png",
  56. text1: "对白女装疯抢专场",
  57. text2: "三折封顶",
  58. idx: 1
  59. }, {
  60. src1: "/images/fashion/fashion-3.png",
  61. src2: "/images/fashion/fashion-icon-3.png",
  62. text1: "对白女装疯抢专场",
  63. text2: "三折封顶",
  64. idx: 2
  65. }, {
  66. src1: "/images/fashion/fashion-4.png",
  67. src2: "/images/fashion/fashion-icon-4.png",
  68. text1: "对白女装疯抢专场",
  69. text2: "三折封顶",
  70. idx: 3
  71. }, {
  72. src1: "/images/fashion/fashion-5.png",
  73. src2: "/images/fashion/fashion-icon-5.png",
  74. text1: "对白女装疯抢专场",
  75. text2: "三折封顶",
  76. idx: 4
  77. }, {
  78. src1: "/images/fashion/fashion-6.png",
  79. src2: "/images/fashion/fashion-icon-6.png",
  80. text1: "对白女装疯抢专场",
  81. text2: "三折封顶",
  82. idx: 5
  83. }, {
  84. src1: "/images/fashion/fashion-7.png",
  85. src2: "/images/fashion/fashion-icon-7.png",
  86. text1: "对白女装疯抢专场",
  87. text2: "三折封顶",
  88. idx: 6
  89. }, {
  90. src1: "/images/fashion/fashion-8.png",
  91. src2: "/images/fashion/fashion-icon-8.png",
  92. text1: "对白女装疯抢专场",
  93. text2: "三折封顶",
  94. idx: 7
  95. }, {
  96. src1: "/images/fashion/fashion-9.png",
  97. src2: "/images/fashion/fashion-icon-9.png",
  98. text1: "对白女装疯抢专场",
  99. text2: "三折封顶",
  100. idx: 8
  101. }, {
  102. src1: "/images/fashion/fashion-10.png",
  103. src2: "/images/fashion/fashion-icon-10.png",
  104. text1: "对白女装疯抢专场",
  105. text2: "三折封顶",
  106. idx: 9
  107. }, {
  108. src1: "/images/fashion/fashion-11.png",
  109. src2: "/images/fashion/fashion-icon-11.png",
  110. text1: "对白女装疯抢专场",
  111. text2: "三折封顶",
  112. idx: 10
  113. }, {
  114. src1: "/images/fashion/fashion-12.png",
  115. src2: "/images/fashion/fashion-icon-12.png",
  116. text1: "对白女装疯抢专场",
  117. text2: "三折封顶",
  118. idx: 11
  119. }],
  120. cart: []
  121. },
  122. // 点击事件
  123. buy(event) {
  124. const grids2 = this.data.grids2;
  125. let id = event.currentTarget.dataset.id;
  126. var app = getApp();
  127. const cartData = app.globalData.cartData;
  128. let nums = 0;
  129. for (let i = 0; i < grids2.length; i++) {
  130. // 在循环过程中操作每个数组项
  131. const item = grids2[i];
  132. if (cartData.length != 0 && id == grids2[i].idx) {
  133. for (let i = 0; i < cartData.length; i++) {
  134. console.log("id:" + id, cartData[i].id);
  135. if (id == cartData[i].id) {
  136. //购物车里面有数据,且选中的商品在购物车中,商品数加一
  137. cartData[i].nums += 1;
  138. break;
  139. }
  140. if (id != cartData[i].id && i == cartData.length - 1) {
  141. //购物车里面有数据,且选中的商品不在购物车中,添加商品
  142. cartData.push({
  143. id: id,
  144. isChecked: false,
  145. nums: nums + 1,
  146. item
  147. })
  148. break;
  149. }
  150. }
  151. } else {
  152. if (id == grids2[i].idx) {
  153. cartData.push({
  154. id: id,
  155. isChecked: false,
  156. nums: nums + 1,
  157. item
  158. }); // 向全局数组中添加新的项
  159. }
  160. }
  161. }
  162. console.log(cartData);
  163. },
  164. /**
  165. * 生命周期函数--监听页面加载
  166. */
  167. onLoad(options) {
  168. },
  169. /**
  170. * 生命周期函数--监听页面初次渲染完成
  171. */
  172. onReady() {
  173. },
  174. /**
  175. * 生命周期函数--监听页面显示
  176. */
  177. onShow() {
  178. },
  179. /**
  180. * 生命周期函数--监听页面隐藏
  181. */
  182. onHide() {
  183. },
  184. /**
  185. * 生命周期函数--监听页面卸载
  186. */
  187. onUnload() {
  188. },
  189. /**
  190. * 页面相关事件处理函数--监听用户下拉动作
  191. */
  192. onPullDownRefresh() {
  193. },
  194. /**
  195. * 页面上拉触底事件的处理函数
  196. */
  197. onReachBottom() {
  198. },
  199. /**
  200. * 用户点击右上角分享
  201. */
  202. onShareAppMessage() {
  203. }
  204. })
4、JSON文件:
  1. //注册需要用的的组件
  2. {
  3. "usingComponents": {
  4. "l-button": "/miniprogram_npm/lin-ui/button/index",
  5. "l-icon": "/miniprogram_npm/lin-ui/icon/index",
  6. "l-price": "/miniprogram_npm/lin-ui/price/index",
  7. "l-grid": "/miniprogram_npm/lin-ui/grid/index",
  8. "l-grid-item": "/miniprogram_npm/lin-ui/grid-item/index"
  9. }
  10. }
5、补充 

同时为了和购物车界面发生数据交互,我在app.js中声明了一个数组,用来传递数据

app.js

  1. // app.js
  2. App({
  3. onLaunch() {
  4. // 展示本地存储能力
  5. const logs = wx.getStorageSync('logs') || []
  6. logs.unshift(Date.now())
  7. wx.setStorageSync('logs', logs)
  8. // 登录
  9. wx.login({
  10. success: res => {
  11. // 发送 res.code 到后台换取 openId, sessionKey, unionId
  12. }
  13. })
  14. },
  15. // userInfo: null,
  16. globalData: {
  17. //声明全局数组,传递数据
  18. cartData: []
  19. }
  20. })

二、购物车界面

 

        购物车界面的功能相对来说还是比较好一点的,全选、单选,都有逻辑判断,就是那个件数我用的组件,所以功能只是虚假的并没有改变本地数组里面的值。只是界面自身的渲染,     

 1、WXML文件
  1. <!--pages/cart/cart.wxml-->
  2. <view class="add">
  3. <!--用 wx:if 进行判断,有商品和没有商品展示不同的界面-->
  4. <view wx:if="{{cart}}" class="add-cart">
  5. <!--购物车为空-->
  6. <image src="/images/my/cart-empty.png" mode="widthFix" />
  7. <view class="add-text">
  8. <text>购物车空空如也,去逛逛吧~~</text>
  9. </view>
  10. </view>
  11. <view wx:if="{{!cart}}">
  12. <!--购物车里面有商品-->
  13. <view style="padding-bottom: 12%;">
  14. <l-checkbox-group>
  15. <l-checkbox key="{{item.id}}" checked="{{item.isChecked}}" wx:for="{{cartData}}" wx:key="id" wx:for-item="item" class="product" bindtap="Single" data-id="{{item.id}}" selected-color="blue">
  16. <image src="{{item.item.src1}}" mode="widthFix" />
  17. <l-counter count="{{item.nums}}" min="1" max="10" />
  18. <l-button type="error" shape="semicircle" width="120" height="60" class="sanchu" bindtap="Delete" data-id="{{item.id}}">删除</l-button>
  19. </l-checkbox>
  20. </l-checkbox-group>
  21. </view>
  22. <view class="settle">
  23. <l-checkbox-group bind:linchange="onChangeTap" class="select">
  24. <l-checkbox key="1" selected-color="blue" checked="{{Checked}}">全选</l-checkbox>
  25. </l-checkbox-group>
  26. <view class="total">
  27. 合计:<l-price unit="¥" value="0"></l-price>
  28. </view>
  29. <l-button type="error" shape="semicircle" width="120" height="60">结算</l-button>
  30. </view>
  31. </view>
  32. </view>

 2、WSXX文件

  1. /* pages/cart/cart.wxss */
  2. page {
  3. background-color: #f5f5f5;
  4. }
  5. .add {
  6. width: 100%;
  7. }
  8. .add-cart {
  9. align-items: center;
  10. }
  11. .add-cart image {
  12. width: 400rpx;
  13. margin-left: 50%;
  14. margin-top: 50%;
  15. transform: translate(-50%, -50%);
  16. }
  17. .add-text {
  18. align-items: center;
  19. width: 65%;
  20. }
  21. .add-text text {
  22. display: block;
  23. font-size: 40rpx;
  24. margin-left: 20%;
  25. transform: translate(25%, -100%);
  26. }
  27. .product {
  28. display: flex;
  29. width: 100%;
  30. margin: 15rpx;
  31. border-radius: 20rpx;
  32. background-color: #ffffff;
  33. }
  34. .product image {
  35. width: 200rpx;
  36. margin-left: 5%;
  37. margin-right: 12%;
  38. }
  39. .sanchu {
  40. margin-left: 3%;
  41. }
  42. .settle {
  43. position: fixed;
  44. width: 100%;
  45. padding: 10rpx;
  46. bottom: 0%;
  47. display: flex;
  48. height: 60rpx;
  49. border-top: 1rpx solid #e8e8e8;
  50. background-color: #ffffff;
  51. }
  52. .select {
  53. height: 60rpx;
  54. line-height: 65rpx;
  55. }
  56. .total {
  57. padding: 10rpx;
  58. margin-left: 20rpx;
  59. width: 400rpx;
  60. }
 3、JS文件
  1. // pages/cart/cart.js
  2. Page({
  3. /**
  4. * 页面的初始数据
  5. */
  6. /**
  7. * cartData: [], 用来储存商品数据
  8. * cart: true, 修改展示的内容
  9. * Checked: false 判断商品是否选中
  10. */
  11. data: {
  12. cartData: [],
  13. cart: true,
  14. Checked: false
  15. },
  16. onChangeTap: function (event) {
  17. // 处理 "linchange" 事件的逻辑代码
  18. var app = getApp();
  19. const cartData = app.globalData.cartData;
  20. //获取加入购物车的数据并赋值给cartData
  21. for (let i = 0; i < cartData.length; i++) {
  22. //循环数组,如果按钮选中就改为取消,未选就改为选中
  23. if (this.data.Checked == false) {
  24. cartData[i].isChecked = true;
  25. } else {
  26. cartData[i].isChecked = false;
  27. }
  28. }
  29. //变成响应式数据
  30. this.setData({
  31. Checked: !this.data.Checked,
  32. cartData: cartData
  33. });
  34. },
  35. Single(event) {
  36. //全选按钮
  37. const id = event.currentTarget.dataset.id;
  38. var app = getApp();
  39. const cartData = app.globalData.cartData;
  40. for (let i = 0; i < cartData.length; i++) {
  41. if (id == cartData[i].id) {
  42. cartData[i].isChecked = !cartData[i].isChecked;
  43. }
  44. if (cartData[i].isChecked == false) {
  45. this.data.Checked = false
  46. }
  47. }
  48. // 判断数组中的所有对象的 isChecked 属性是否全部为 true
  49. const allTrue = cartData.every(item => item.isChecked === true);
  50. // 如果所有对象的 isChecked 属性都为false,则将它们的值改为true
  51. if (allTrue) {
  52. cartData.forEach(item => {
  53. this.data.Checked = true;
  54. });
  55. }
  56. this.setData({
  57. Checked: this.data.Checked,
  58. cartData: cartData
  59. });
  60. },
  61. Delete(event) {
  62. const id = event.currentTarget.dataset.id;
  63. var app = getApp();
  64. const cartData = app.globalData.cartData;
  65. for (let i = 0; i < cartData.length; i++) {
  66. if (id == cartData[i].id) {
  67. cartData.splice(i, 1); // 删除索引为i的元素
  68. break; // 停止遍历,因为已经找到并删除了对应的元素
  69. }
  70. }
  71. this.setData({
  72. cartData: cartData
  73. });
  74. },
  75. /**
  76. * 生命周期函数--监听页面加载
  77. */
  78. onLoad(options) {
  79. },
  80. /**
  81. * 生命周期函数--监听页面初次渲染完成
  82. */
  83. onReady() {},
  84. /**
  85. * 生命周期函数--监听页面显示
  86. */
  87. onShow() {
  88. //进入界面的时候进行判断,看看满足不满足全选条件
  89. var app = getApp();
  90. const cartData = app.globalData.cartData;
  91. if (cartData.length === 0) {
  92. this.data.cart = true;
  93. } else {
  94. this.data.cart = false;
  95. }
  96. for (let i = 0; i < cartData.length; i++) {
  97. if (cartData[i].isChecked == false) {
  98. this.data.Checked = false
  99. }
  100. }
  101. this.setData({
  102. cartData,
  103. Checked: this.data.Checked,
  104. cart: this.data.cart
  105. })
  106. },
  107. /**
  108. * 生命周期函数--监听页面隐藏
  109. */
  110. onHide() {
  111. },
  112. /**
  113. * 生命周期函数--监听页面卸载
  114. */
  115. onUnload() {
  116. },
  117. /**
  118. * 页面相关事件处理函数--监听用户下拉动作
  119. */
  120. onPullDownRefresh() {
  121. },
  122. /**
  123. * 页面上拉触底事件的处理函数
  124. */
  125. onReachBottom() {
  126. },
  127. /**
  128. * 用户点击右上角分享
  129. */
  130. onShareAppMessage() {
  131. }
  132. })
 4、JSON文件
  1. {
  2. "usingComponents": {
  3. "l-search-bar": "/miniprogram_npm/lin-ui/search-bar/index",
  4. "l-icon": "/miniprogram_npm/lin-ui/icon/index",
  5. "l-index-list": "/miniprogram_npm/lin-ui/index-list/index"
  6. }
  7. }

三、分类界面和个人中心界面

     这两个界面写的比较简单个人中心界面上没有啥功能,分类上面实现一个功能我还是比较满意的,就是分类商品的展示问题,这个我思考了好一会,想找个组件用但是没有找到,然后就想到了一个办法,就是点击分类的名称时在JS中处理数据,将对应的数据放到一个新的空数组里面,然后进行展示。

        分类界面:红框包裹起来的部分循环的是两个不同的数组

 代码比较简单,就不展示啦

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/542716
推荐阅读
相关标签
  

闽ICP备14008679号