Vue前端开发-Coupon组件

商品在展示时,通常会与一些优惠券一起显示,针对这种需求,Vant 提供了专门用于优惠券展示的组件——Coupon,它用于优惠券的兑换和选择,点击CouponCell组件时,以弹框形式进入选择,在选择时,由CouponList组件显示兑换优惠券列表,当选中某项列表后,再次返回CouponCell组件,显示选中项,并减少结算总金额。

Coupon组件由CouponCell和CouponList两部分组成,其中CouponCell组件的常用属性如下表11-10所示
在这里插入图片描述
CouponList组件的常用属性如下表11-11所示
在这里插入图片描述
接下来通过一个完整的案例来演示使用Coupon组件实现的效果。

实例11-8 Coupon组件

  1. 功能描述

在实例【11-7】的基础之上,添加一个coupon组件,当点击“优惠券”选项时,以弹框形式显示可用优惠券和不可用优惠券的列表,当选中可用优惠券列表中某项优惠时,关闭弹框,并显示选中优惠券的总金额。

  1. 实现代码

在项目的components 文件夹中,添加一个名为“Coupon”的.vue文件,该文件的保存路径是“components/ch11/buis/”,在文件中加入如清单11-8所示代码。

代码清单11-8 Coupon.vue代码

<template>
    <div>
        <h3>Coupon 组件</h3>
        <div class="row">
            <van-card :num="curGoods.num" :tag="curGoods.tag" 
		:price="curGoods.price" 
		:desc="curGoods.desc"
		:title="curGoods.title" 
		:thumb="curGoods.thumb" 
		:origin-price="curGoods.originPrice">
                <template #tags>
                    <van-tag plain type="primary">
			{{ curGoods.tags[0] }}
		      </van-tag>
                    <van-tag plain type="primary">
			{{ curGoods.tags[1] }}
		      </van-tag>
                </template>
                <template #footer>
                    <van-button size="mini" @click="add">
			+
		      </van-button>
                    <van-button size="mini" @click="reduce">
			-
		      </van-button>
                </template>
            </van-card>
        </div>
        <!-- 优惠券单元格 -->
        <van-coupon-cell :coupons="coupons" 
		:chosen-coupon="chosenCoupon" 
		@click="showList = true" />
        <!-- 优惠券列表 -->
        <van-popup :show="showList" round 
		position="bottom" 
		style="height: 70%; padding-top: 4px;">
            <van-coupon-list :show-exchange-bar="false" 
		:coupons="coupons" 
		:chosen-coupon="chosenCoupon"
              :disabled-coupons="disabledCoupons" 
		@change="onChange" />
        </van-popup>
    </div>
</template>
<script>
import goods from "../../../assets/goods.png"
export default {
    data() {
        return {
            curGoods: {
                num: 2, price: 9000,
                desc: "一台笔记本电脑",
                title: "thinkpad X1 系列",
                thumb: goods,
                originPrice: "11000",
                tag: "超薄小巧型",
                tags: ["一代经典", "超低价格"]
            },
            disabledCoupons: [{
                available: 0,
                condition: '满1000元\n再优惠 200 元',
                reason: '',
                value: 20000,
                name: '老客户惊喜',
                startAt: 1489104340,
                endAt: 1514592670,
                valueDesc: '200',
                unitDesc: '元'
            }],
            coupons: [{
                available: 1,
                condition: '无门槛\n最高优惠 100 元',
                reason: '',
                value: 10000,
                name: '新人惊喜',
                startAt: 1589304340,
                endAt: 1634595670,
                valueDesc: '100',
                unitDesc: '元'
            }],
            showList: false,
            chosenCoupon: -1
        }
    },
    methods: {
        add() {
            this.curGoods.num++;
        },
        onChange(index) {
            this.showList = false;
            this.chosenCoupon = index;
        },
        reduce() {
            if (this.curGoods.num > 1)
                this.curGoods.num--;
        }
    }
}
</script>
<style>
.row {
    margin: 10px 0;
    padding: 10px 0;
    border-bottom: solid 1px #eee;
}
.van-image img {
    object-fit: contain !important;
}
</style> 

  1. 页面效果

保存代码后,页面在Chrome浏览器下执行的页面效果如图11-10所示。
在这里插入图片描述
4. 源码分析

在本实例的加粗代码中,van-coupon-cell组件负责显示优惠券的入口,另外一个组件van-coupon-list用于显示优惠券的列表,包括可用和不可用的优惠券,列表的数据来源于coupons和disabled-coupons属性对应的数组。

当点击列表中某项数据时,便触发绑定的change事件,在事件函数中,获取列表中选中项的索引号,且隐藏弹框,并显示优惠金额。

需要说明的是:每个数组对象中的value属性表示优惠券的金额,它的单位是分,例如:如果优惠券是200元,那么,它的值就是20000。
在这里插入图片描述

### 使用 Vue 3 实现前端抢券页面效果 #### 组件设计与布局 为了创建一个功能完整的抢券页面,在组件化的设计上,通常会分为几个部分: - **Header.vue**: 页面头部,用于展示活动标题或其他重要信息。 - **CouponList.vue**: 抢券列表区域,显示可领取的优惠券及其状态(已领/未领)。 - **Footer.vue**: 底部栏,可能放置版权说明或返回首页按钮。 每个组件都应遵循单一职责原则,专注于完成特定的任务。对于 `CouponList` 组件来说,则负责处理用户交互逻辑以及视觉上的变化[^1]。 #### 动画效果的应用 考虑到用户体验的重要性,当用户成功获取到一张新的优惠券时,可以通过淡入淡出的方式让新获得的信息更加醒目;而点击“立即领取”的瞬间也可以加入轻微缩放和平移的效果来增强即时反馈感。这不仅使得界面看起来更生动有趣,同时也提高了用户的参与度和满意度。 ```css /* CSS Transition Example */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .coupon-item { animation-name: fadeIn; animation-duration: .8s; } ``` #### 示例代码实现 下面是一个简单的例子,展示了如何利用 Vue 3 的组合 API 和内置指令构建上述提到的功能模块。这里假设已经按照官方指南完成了项目的初始化工作[^2]。 ```javascript // src/components/CouponItem.vue <template> <div :class="['coupon', statusClass]" @click="handleClick"> {{ coupon.name }} </div> </template> <script setup> import { ref, computed } from 'vue' const props = defineProps({ name: String, }) let isClaimed = ref(false) function handleClick() { if (!isClaimed.value) { alert(`恭喜您获得了${props.name}`) isClaimed.value = true } } const statusClass = computed(() => ({ claimed: isClaimed.value, })) </script> <style scoped> .claimed { background-color: lightgray !important; pointer-events: none; } </style> ``` 此段代码定义了一个名为 `CouponItem` 的子组件,它接收来自父级传递下来的属性 `name` 并据此渲染对应的文本内容。每当用户尝试去点击某个尚未被认领过的优惠项时就会触发弹窗提示并更新其内部的状态变量 `isClaimed` ,从而改变该元素的颜色表示已被占用不可再选中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值