119.【Uniapp】(十八)

简介: 119.【Uniapp】

9.配置页面 - 商品列表区域

(1).渲染购物车商品列表的标题区域

cart.vue

<template>
  <view>
    <!-- 商品列表的标题区域 -->
    <view class="cart-title">
      <!-- 左侧的图标 -->
      <uni-icons type="shop" size="18"></uni-icons>
      <!-- 描述文本 -->
      <text class="cart-title-text">购物车</text>
    </view>
  </view>
</template>
<style lang="scss">
  .cart-title {
    height: 40px;
    display: flex;
    align-items: center;
    padding-left: 5px;
    border-bottom: 1px solid #efefef;
    .cart-title-text {
      font-size: 14px;
      margin-left: 10px;
    }
  }
</style>

(2).渲染商品列表区域的基本结构

1.通过 mapState 辅助函数,将 Store 中的 cart 数组映射到当前页面中使用:

<script>
  import badgeMix from '@/mixins/tabbar-badge.js'
  // 引入辅助函数
  import {
    mapState
  } from "vuex"
  export default {
    mixins: [badgeMix],
    // 使用辅助函数
    computed: {
      ...mapState('m_cart', ['cart']),
    },
    data() {
      return {
      };
    },
  }
</script>

2.在 UI 结构中,通过 v-for 指令循环渲染自定义的 my-goods 组件:

这里调用了子组件并传递参数

<!-- 循环渲染购物车中的数据 -->
    <block v-for="(item,index) in cart" :key="index">
      <my-goods :item="item"></my-goods>
    </block>

(3).my-goods 组件封装 radio 勾选状态

1.打开 my-goods.vue 组件的源代码,为商品的左侧图片区域添加 radio 组件:

<!-- 商品左侧图片区域 -->
<view class="goods-item-left">
  <radio checked color="#C00000"></radio>
  <image :src="goods.goods_small_logo || defaultPic" class="goods-pic"></image>
</view>

2.给类名为 goods-item-left 的 view 组件添加样式,实现 radio 组件和 image 组件的左右布局:

.goods-item-left {
  margin-right: 5px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  .goods-pic {
    width: 100px;
    height: 100px;
    display: block;
  }
}

3.封装名称为 showRadio 的 props 属性,来控制当前组件中是否显示 radio 组件:

// 儿子接受父亲传递过来的数据
    props: {
      item: {
        type: Object,
        default: {}
      },
      showRadio: {
        type: Boolean,
        default: false
      }
    },

4.使用v-show控制是否显示

<radio checked color="#C00000" v-show="showRadio"></radio>

5.需要展示的组件修改元素为true

<!-- 商品列表区域 -->
<block v-for="(goods, i) in cart" :key="i">
  <my-goods :goods="goods" :show-radio="true"></my-goods>
</block>

6.修改 my-goods.vue 组件,动态为 radio 绑定选中状态:

<!-- 商品左侧图片区域 -->
<view class="goods-item-left">
  <!-- 存储在购物车中的商品,包含 goods_state 属性,表示商品的勾选状态 -->
  <radio :checked="goods.goods_state" color="#C00000" v-if="showRadio"></radio>
  <image :src="goods.goods_small_logo || defaultPic" class="goods-pic"></image>
</view>

(4). 为 my-goods 组件封装 radio-change 事件
  1. 当用户点击 radio 组件,希望修改当前商品的勾选状态,此时用户可以为 my-goods 组件绑定 @radio-change 事件,从而获取当前商品的 goods_idgoods_state
<!-- 商品列表区域 -->
<block v-for="(goods, i) in cart" :key="i">
  <!-- 在 radioChangeHandler 事件处理函数中,通过事件对象 e,得到商品的 goods_id 和 goods_state -->
  <my-goods :goods="goods" :show-radio="true" @radio-change="radioChangeHandler"></my-goods>
</block>
  1. 定义 radioChangeHandler 事件处理函数如下:
methods: {
  // 商品的勾选状态发生了变化
  radioChangeHandler(e) {
    console.log(e) // 输出得到的数据 -> {goods_id: 395, goods_state: false}
  }
}
  1. my-goods.vue 组件中,为 radio 组件绑定 @click 事件处理函数如下:
<!-- 商品左侧图片区域 -->
<view class="goods-item-left">
  <radio :checked="goods.goods_state" color="#C00000" v-if="showRadio" @click="radioClickHandler"></radio>
  <image :src="goods.goods_small_logo || defaultPic" class="goods-pic"></image>
</view>
  1. 在 my-goods.vue 组件的 methods 节点中,定义 radioClickHandler 事件处理函数:
methods: {
      radioChangeHandler() {
      // 这里传递的是一个对象
        this.$emit('radio-change', {
          goods_id: this.item.goods_id,
          goods_state: this.item.goods_state
        })
      }
    }

(5).修改购物车中商品的勾选状态
  1. store/cart.js 模块中,声明如下的 mutations 方法,用来修改对应商品的勾选状态:
// 更新购物车中商品的勾选状态
updateGoodsState(state, goods) {
  // 根据 goods_id 查询购物车中对应商品的信息对象
  const findResult = state.cart.find(x => x.goods_id === goods.goods_id)
  // 有对应的商品信息对象
  if (findResult) {
    // 更新对应商品的勾选状态
    findResult.goods_state = goods.goods_state
    // 持久化存储到本地
    this.commit('m_cart/saveToStorage')
  }
  1. 在 cart.vue 页面中,导入 mapMutations 这个辅助函数,从而将需要的 mutations 方法映射到当前页面中使用:
import badgeMix from '@/mixins/tabbar-badge.js'
import { mapState, mapMutations } from 'vuex'
export default {
  mixins: [badgeMix],
  computed: {
    ...mapState('m_cart', ['cart']),
  },
  data() {
    return {}
  },
  methods: {
    ...mapMutations('m_cart', ['updateGoodsState']),
    // 商品的勾选状态发生了变化
    radioChangeHandler(e) {
      this.updateGoodsState(e)
    },
  },
}



相关文章
|
机器学习/深度学习 存储 人工智能
DeepSpeed ZeRO++:降低4倍网络通信,显著提高大模型及类ChatGPT模型训练效率
DeepSpeed ZeRO++:降低4倍网络通信,显著提高大模型及类ChatGPT模型训练效率
669 0
DeepSpeed ZeRO++:降低4倍网络通信,显著提高大模型及类ChatGPT模型训练效率
|
应用服务中间件 网络安全 nginx
./configure: error: SSL modules require the OpenSSL library.
CentOS 6.5 下 安装 Tengine 执行配置命令./configure  时提示以下错误: ./configure: error: SSL modules require the OpenSSL library.
2293 0
|
移动开发 JavaScript HTML5
HTML5实现2025雪花飘新年倒计时源码
2025年即将到来,此源码页为单html纯代码,新年倒计时,背景雪花飘落效果,倒计时时间日期在JS/app.js文件第21行代码自行修改即可!
572 7
|
存储 容器
Flutter 有状态Widget 和 无状态Widget
Flutter 有状态Widget 和 无状态Widget
400 0
|
JavaScript 前端开发 开发者
摸鱼必备!!10个你不知道的 Vue 3 组件库...
摸鱼必备!!10个你不知道的 Vue 3 组件库...
|
数据处理 计算机视觉 索引
NumPy中的布尔索引与花式索引详解
【4月更文挑战第17天】本文介绍了NumPy中的布尔索引和花式索引,这两种高级索引方式增强了数组操作的灵活性。布尔索引利用布尔数组过滤数据,如`array[bool_array]`用于根据条件筛选元素;在数据分析中,这对条件筛选非常有用。花式索引包括切片、数组和元组索引,允许非整数位置访问元素。例如,数组索引`array[index_array]`按指定位置选取元素,元组索引适用于多维数组的选择。掌握这两种索引能提升数组数据处理的效率。
|
存储 Windows
技术好文共享:(翻译)libusb
技术好文共享:(翻译)libusb
373 0
|
存储 SQL 数据挖掘
数据模型概述与数据库基础
数据模型是描述现实世界数据对象结构的形式化、真实和易理解的表示。分为概念模型(信息模型)和数据模型,前者面向用户,后者关注计算机实现。数据库是结构化、共享、低冗余的数据集合,提供数据独立性。数据库管理系统(DBMS)负责数据的存储、访问和管理,而数据库系统(DBS)包括数据库、DBMS、应用系统、DBA和用户。数据库系统开发涉及需求分析、系统设计(概念设计、逻辑设计、物理设计)、系统实现和运行维护(数据更新、备份、分析等)。
487 0
|
测试技术 算法 Android开发
干货分享:Totoro 在自动化测试领域的深耕与收获
Totoro经历了从 0 到 1,从 1 到 2,并逐步演进为阿里集团内使用面最广、性能最为稳定的自动化测试框架之一。本文将围绕 Totoro 一路踩坑、迭代完善成熟的过程,从沉淀总结的一些方法论和解决方案展开分享。
4673 0
干货分享:Totoro 在自动化测试领域的深耕与收获
|
自然语言处理
字符范围
字符范围
624 2