• 实现单选时的价格,全选时价格
  • 单选效果图

  • 全选效果图

html

<template>
<!-- 淘宝结算购物车 -->
<div class="settlement-bill">
<div class="settlement-group">
<div class="settlement-item" v-for="(item,index) in items" :key="item.id">
<i class="iconfont"
@click="radioCheck(item,index)"
:class=" item.isChecked ? 'icon-yuanyixuan' : 'icon-yuanweixuan'" ></i>
<img :src="item.imgUrl" alt="">
<div class="item-right">
<p>{{item.content}}</p>
<span class="item-money">${{item.money}}</span>
<div class="item-num">
<span @click="reduce(index)">-</span>
<span>{{item.num}}</span>
<span @click="add(index)">+</span>
</div>
</div>
</div>
</div>
<div class="settlement-bottom">
<div class="bottom-left">
<i @click="allCheck" class="iconfont " :class="checked ? 'icon-yuanyixuan' : 'icon-yuanweixuan' "></i>
<p>全选</p>
</div>
<div class="bottom-right">
<p>合计<span class="total-money">{{total}}</span></p>
<div class="bottom-total">结算({{num}})</div>
</div>
<div class="clear"></div>
</div>
</div>
</template>

js

<script>
export default {
data(){
return {
checked: false,
items: [
{
id: 0,
imgUrl: '../../static/timg.jpg',
content: '云南白药牙膏家用去黄去口臭美白口气清新585g牙膏牙刷套装',
money: 99,
num: 1,
},
{
id: 1,
imgUrl: '../../static/maiguo.jpg',
content: '湖南小台芒果带箱10斤小台芒果新鲜水果包邮',
money: 39.9,
num: 1
},
{
id: 2,
imgUrl: '../../static/baixiangguo.jpg',
content: '广西新鲜热带水果百香果西番莲鸡蛋果10斤中果酸爽香甜',
money: 69.8,
num: 1
}
]
}
},
computed: {
total(){
let sum = 0;
this.items.forEach(item=>{
if(item.isChecked == true)sum += (item.money*item.num)
})
return Math.round(sum*100)/100;
},
num() {
let num = 0;
this.items.forEach(item=>{
if(item.isChecked == true)num += item.num
})
return num;
}
},
methods: {
// 减少宝贝
reduce(index) {
if(this.items[index].num === 1) return
this.items[index].num--
},
// 增加宝贝
add(index) {
this.items[index].num++; },
radioCheck(item,index) {
let tmpState = !item.isChecked
//改变单个状态
this.$set(item,'isChecked',tmpState)
//检测选择状态
if(tmpState){
let n = 0;
this.items.forEach(itemu => {
if(itemu.isChecked) n++;
})
if(n == this.items.length)this.checked = true; }else {
this.checked = false;
}
},
allCheck(){
this.checked = !this.checked;
for(let i = 0,len = this.items;i < len.length;i++){
this.$set(this.items[i],'isChecked',this.checked)
}
}
} }
</script>

css

<style lang="less">
* {
padding: 0;
margin: 0;
}
html,body,#app {
height: 100%;
}
.settlement-bill {
width: 100%;
height: 100%;
background:#e9eaeb;
.settlement-group {
padding: 20px;
box-sizing: border-box;
.settlement-item {
position: relative;
width: 100%;
padding: 10px 5px;
margin-bottom: 15px;
box-sizing: border-box;
background: #fff;
.iconfont {
position: absolute;
top: 50%;
left: 10px;
margin-top: -10px;
font-size: 20px;
&.icon-yuanyixuan {
color: orangered;
}
}
img {
display: inline-block;
width: 100px;
height: 100px;
margin-left: 25px;
}
.item-right {
display: inline-block;
vertical-align: top;
width: calc(100% - 130px);
p {
word-break: break-all;
text-overflow: ellipsis;
display: -webkit-box; /** 对象作为伸缩盒子模型显示 **/
-webkit-box-orient: vertical; /** 设置或检索伸缩盒对象的子元素的排列方式 **/
-webkit-line-clamp: 2; /** 显示的行数 **/
overflow: hidden; /** 隐藏超出的内容 **/
margin: 0 0 15px 0;
}
.item-money {
display: inline-block;
float: left;
color: orangered;
}
.item-num {
display: inline-block;
float: right;
span {
display: inline-block;
width: 25px;
border: 1px solid #dcdfe6;
text-align: center;
&:nth-child(2){
width: 50px;
}
}
}
}
}
}
.settlement-bottom {
position: fixed;
bottom: 0;
width: 100%;
height: 60px;
line-height: 60px;
padding-left: 30px;
padding-right: 25px;
box-sizing: border-box;
background: #fff;
.bottom-left {
float: left;
display: inline-block;
.iconfont {
font-size: 20px;
&.icon-yuanyixuan {
color: orangered;
}
}
p {
display: inline-block;
}
}
.bottom-right {
display: inline-block;
float: right;
p {
display: inline-block;
.total-money {
color: orangered;
}
}
.bottom-total {
display: inline-block;
min-width: 80px;
height: 50px;
line-height: 50px;
margin-top:5px;
text-align: center;
border-radius: 20px;
background: orangered;
color: #fff;
}
}
.clear {
clear: both;
}
}
} </style>
  • 想写这个小demo好久啦,终于写好。
遇到的vue3.0写法

import { Watch, Component, Vue, Emit, Prop } from "vue-class-decorator";
// 没有组件
@component
// 有组件
// import children from "./components/children.vue";
// @component({ components:{children} }) export class MyChildren extends Vue{
username = ""; // 名字
//userId 父子之间传值,必传默认是null
@Prop({ type: String, required: true, default: null})
userId: string;
@Emit("changeChildren")
changeChildren(){} created(){}
mounted(){}
// 方法
cancel() {
// 调用自定义函数
this.changeChildren()
}
}

vue实现结算淘宝购物车效果的更多相关文章

  1. vue实现淘宝购物车功能

    淘宝购物车功能,效果如下图 非常简单的逻辑,没有做代码的封装,代码如下 <div class="list-container"> <div class=" ...

  2. 仿淘宝购物车demo---增加和减少商品数量

    在上一篇博客中,小编简单的介绍了如何使用listview来实现购物车,但是仅仅是简单的实现了列表的功能,随之而来一个新的问题,买商品的时候,我们可能不止想买一件商品,想买多个,或许有因为某种原因点错了 ...

  3. jQuery实现淘宝购物车小组件

    我爱撸码,撸码使我感到快乐! 大家好,我是Counter,本章将实现淘宝购物车小组件, 用原生js可以实现吗,当然可以,可是就是任性一回,就是想用jQuery 来实现下.HTML代码不多才4行,CSS ...

  4. Vue实现仿淘宝商品详情属性选择的功能

    Vue实现仿淘宝商品详情属性选择的功能 先看下效果图:(同个属性内部单选,属性与属性之间可以多选) 主要实现过程: 所使用到的数据类型是(一个大数组里面嵌套了另一个数组)具体格式如下:   attrA ...

  5. 淘宝购物车页面 智能搜索框Ajax异步加载数据

    如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...

  6. 淘宝购物车页面 PC端和移动端实战

    最近花了半个月的时间,做了一个淘宝购物车页面的Demo.当然,为了能够更加深入的学习,不仅仅有PC端的固定宽度的布局,还实现了移动端在Media Query为768px以下(也就是实现了ipad,ip ...

  7. android ------ RecyclerView 模仿淘宝购物车

    电商项目中常常有购物车这个功能,做个很多项目了,都有不同的界面,选了一个来讲一下. RecyclerView 模仿淘宝购物车功能(删除选择商品,商品计算,选择, 全选反选,商品数量加减等) 看看效果图 ...

  8. web——自己实现一个淘宝购物车页面

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  9. Vue(小案例_vue+axios仿手机app)_购物车(二模拟淘宝购物车页面,点击加减做出相应变化)

    一.前言 在上篇购物车中,如果用户刷新了当前的页面,底部导航中的数据又会恢复为原来的: 1.解决刷新,购物车上数值不变                                         ...

随机推荐

  1. [UVALive 3902] Network

    图片加载可能有点慢,请跳过题面先看题解,谢谢 一道简单的贪心题,而且根节点已经给你了(\(S\)),这就很好做了. 显然,深度小于等于 \(k\) 的都不用管了(\(S\) 深度为0),那么我们只需要 ...

  2. 洛谷 P3942 将军令 解题报告

    P3942 将军令 题目描述 又想起了四月. 如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房. 凭君莫话封侯事,一将功成万骨枯. 梦里,小\(F\)成了一个给将军 ...

  3. 20135306 2.4 ELF文件格式分析

    2.4   ELF文件格式分析 20135306 黄韧 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标 ...

  4. Android listview与adapter用法(BaseAdapter + getView)

    Android listview与adapter用法http://www.cnblogs.com/zhengbeibei/archive/2013/05/14/3078805.html package ...

  5. 【纪中集训2019.3.13】fft

    题意: 描述 一共有\(n+m\)道题,其中\(n\)道答案是\(A\),\(m\)道答案是\(B\): 你事先知道\(n和m\),问在最优情况下的期望答错次数,对\(998244353\)取模: 范 ...

  6. bzoj1027【JSOI2007】合金

    题目描述 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金 ...

  7. beego 返回 json 响应

    需要注意的是 json 结构体里面的字段必须是大写字母开头,否则是不会返回的. 我们可以起个别名: type person struct { Name string `json:"name& ...

  8. 读论文《BP改进算法在哮喘症状-证型分类预测中的应用》

    总结: 一.研究内容 本文研究了CAL-BP(基于隐层的竞争学习与学习率的自适应的改进BP算法)在症状证型分类预测中的应用. 二.算法思想 1.隐层计算完各节点的误差后,对有最大误差的节点的权值进行正 ...

  9. gulp+webpack配置

    转自:https://www.jianshu.com/p/2549c793bb27 gulp gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开 ...

  10. asp.net 练习 js 调用webservice

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...