微信小程序商品列表

1.分支创建

定义请求参数对象

1.为了方便发起请求获取商品列表的数据,根据接口要求,事先定义一个请求参数对象:

javascript 复制代码
data() {
  return {
    //请求参数对象
    queryObj: {
      //查询关键词
      query:'',
      //商品分类ID
      cid:'',
      //页码值
      pagenum: 1,
      //每页显示多少条数据
      pagesize: 10
    }
  }
}

2.通过 v-for 指令,循环渲染出商品的UI结构

javascript 复制代码
<template>
  <view>
    <view class="goods-list">
      <block v-for="(goods,i)in goodsList" :key="i">
        <view class="goods-item">
          <!-- 商品左侧图片区域 -->
          <view class="goods-item-left">
            <image :src="goods.goods_small_logo || defaultapic" class="goods-pic">
            </image>
          </view>
          <!-- 商品右侧图片区域 -->
          <view class="goods-item-left">
            <!-- 商品标题 -->
            <view class="goods-name">{{goods.goods-name}}</view>
            <view class="goods-info-box">
              <!-- 商品价格 -->
              <view class="goods-price">¥{{goods.goods-price}}</view>
            </view>
          </view>
        </view>
      </view>
    </view>
  </view>
</template>

通过节流阀防止发起额外的请求

1.在data中定义 isloading 节流阀

javascript 复制代码
data() {
  return {
    // 是否正在请求数据
    isloading: false
  }
}

2.修改 getGoodsList 方法,在请求数据前后,分别打开和关闭节流阀

javascript 复制代码
async getGoodsList() {
  // 打开节流阀
  this.isloading=true
  // 发起请求
  const { data: res } = await uni.$http.get('/api/public/v1/goods/search',this.queryObj)
  // 关闭节流阀
  this.isloading=false
}

下拉刷新

监听页面的 onPullDownRefresh 事件处理函数

javascript 复制代码
onPullDownRefresh() {
  // 重置关键数据
  this.queryObj.pagenum=1
  this.total=0
  this.isloading=false
  this.goodsList=[]
  
  //重新发起请求
  this.getGoodsList(() => uni.stopPullDownRefresh()
}

渲染轮播图区域

javascript 复制代码
<!-- 轮播图区域 -->
<swiper :indicator-dots="true" :autoplay="true" :interval="3000" :duration="1000">
  <swiper-item v-for="(item,i) in goods_info.pics" :key="i">
    <image :src="item.pics_big"></image>
  </swiper-item>
</swiper>

实现轮播图预览效果

1.为轮播图中 image 图片绑定 click 事件处理函数:

javascript 复制代码
<swiper-item v-for="(item,i) in goods_info.pics" :key="i">
    <!-- 把当前图片的索引传递到 preview() 处理函数中 -->
    <image :src="item.pics_big"@click="preview(i)"></image>
</swiper-item>

2.在 methods 中定义 preview 事件处理函数:

javascript 复制代码
//实现轮播图的预览效果
preview(i) {
  //调用 uni.previewImage() 方法预览图片
  uni.previewImage({
    //预览时,默认显示图片的索引
    current: i,
    //所有图片 url 地址的数组
    urls: this.goods_info.pics.map(x=> x.pics_big)
  })
}

配置 vuex

按如下4个步骤初始化Store的实例对象:

javascript 复制代码
//导入 Vue 和 Vuex
import Vue from 'vue'
import Vuex from 'vuex'

//将vuex 安装为 Vue 的插件
Vue.use(Vuex)

// 创建 Store 的实例对象
const store = new Vuex.Store({
    // TODO:挂载 store 模块
    modules:{},
})
// 向外共享 Store 的实例对象
export default store

为商品导航组件绑定事件处理函数:

javascript 复制代码
buttonClick(e) {
  // 判断是否点击了 "加入购物车" 按钮
  if (e.content.text---'加入购物车') {
    const goods={
        goods_id: this.goods_info.goods_id,
        goods_name: this.goods_info.goods_name,
        goods_price: this.goods_info.goods_price,
        goods_small_loge: this.goods_info.goods_small_logo,
        goods_state: true
    }
    //信息储存
    this.addToCart(goods)
  }
}

持久化储存数据

在js模块中,声明一个mutations方法

javascript 复制代码
// 将数据持久化储存到本地
saveToStorage(state) {
    uni.setStorageSync('cart',JSON.stringify(state.cart))
}

修改mutations节点中 addToCart 方法,在处理完信息后调用 saveToStoreage 方法:

javascript 复制代码
addToCart(state,goods) {
  //根据提交的商品Id,查询是否存在商品
  //如果不存在,则 findResult 为 underfined,否则,为查找到的商品信息对象
  const findResult = state.cart.find(x=> x.goods_id===goods.goods_id)
  
  if(!findResult) {
    state.cate.push(goods)
  } else {
    findResult.goods_count++
  }

  //通过 commit 方法,调用 m_cart 命名的 saveToStorage 方法
  this.commit('m_cart/saveToStorage')
}

total侦听器

使用普通函数的形式定义的watch侦听器,在页面首次加载后不会被调用。(错误形式)

javascript 复制代码
watch: {
  // 页面首次加载完毕后,不会调用这个侦听器
  total(newVal) {
    const findResult = this.options.find(x => x.text ==='购物车')
    if (findResult) {
       findResult.info = newVal
    }
  }  
}

使用对象形式来定义watch侦听器。(正确示例)

javascript 复制代码
watch: {
  //定义 total 侦听器,指向一个配置对象
  total: {
    //handler 属性用来定义侦听器的 function 处理函数
    handler(newVal) {
      const findResult= this.option.find(x=> x.text === '购物车')
      if (findResult) {
         findResult.info = newVal
      }
    },
    immediate: true
  }
}
相关推荐
李纲明4 小时前
微信小程序真机预览白屏或 request 失败:先核 request 合法域名与 TLS,再查体验版与本地缓存
缓存·微信小程序·小程序·小程序开发·devdiy·真机预览·合法域名
klfdgl6 小时前
线上商城小程序投入测算,有成熟开发经验服务商的长期收益对比
小程序
一木 之林19 小时前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
赵小哥要冲啦1 天前
社区邻里互助小程序从 0 到 1 复盘:需求拆解与信任机制设计
java·小程序·需求分析
河北清兮网络科技1 天前
石家庄做一套企业知识库系统多少钱?2026 报价明细
小程序·短剧app·广告联盟
Ai-_Man1 天前
Coze扣子还是不可以导出左侧所有对话,只能点进去单条内容导出,方法不对吗?
开发语言·人工智能·ai·小程序·1024程序员节
微订校园外卖平台1 天前
新手做校园外卖平台:小程序启动顺序与订单链路验收
小程序·外卖系统·本地生活·微订
计算机毕设定制辅导-无忧学长1 天前
《基于物品协同过滤的闲置书换购微信小程序设计开发》
java·vue.js·spring boot·微信小程序·uniapp·闲置书换购微信小程序·物品协同过滤算法
ngaiwe2 天前
AA我来算小程序实践:把付款人、承担人和结算状态分开建模
微信小程序
FX1317887KP_2 天前
KET口语Part 2看图对话怎么练?“观察—提问—回应”;三步法讲透
小程序·ket口语·pet口语·fce备考·剑桥英语