Vue-购物车实战

computed 计算属性

 

 

正则

 

css部分

[v-cloak] { 
	display : none ; 
}
table{ 
	border : lpx solid #e9e9e9 ; 
	border- collapse: collapse ; 
	border-spacing : 0; 
	empty-cells : show ; 
}
th , td{ 
	padding : Spx 16px ; 
	border : lpx solid #e9e9e9 ; 
	text-align : left; 
}
th{ 
	background: #f7f7f7 ; 
	color : #5c6b77 ; 
	font-weight: 600 ; 
	wh te-space: nowrap ;
}
.checks {
  font-size: 16px;
  text-align: center;
}

  

Js部分

var app = new Vue({
el: '#app',
data:{
checkall: false,
list:[
{
title_name: '手机',
content: [
{ id: 1, name: '小米9', price: 3099, count: 9, check: false,
},
{ id: 2, name: '华为30', price: 4888, count: 1, check: false,
},
{ id: 3, name: 'Vivo20', price: 3199, count: 1, check: false,
},
]
},
{
title_name: '日常用品',
content: [
{ id: 1, name: '牙刷', price: 88, count: 1, check: false,
},
{ id: 2, name: '毛巾', price: 58, count: 1, check: false,
},
{ id: 3, name: '口杯', price: 28, count: 1, check: false,
},
]
},
{
title_name: '学习用品',
content: [
{ id: 1, name: '签字笔', price: 18, count: 1, check: false,
},
{ id: 2, name: '橡皮', price: 8, count: 1, check: false,
},
{ id: 3, name: '笔记本', price: 2, count: 1, check: false,
},
]
},
],
},
computed:{
totalPrice: function(){
var total = 0;
for( var i = 0; i < this.list.length; i++){
var item = this.list[i];
for(var j = 0; j<item.content.length; j++){
var items = item.content[j];
if(items.check === true){
total += items.price * items.count;
}
}
}
return total.toString().replace(/B(?=(d{3})+$)/g,','); //3位式显示金额
},
},
methods:{
handleReduce: function(index1, index2){
if(this.list[index1].content[index2].count === 1) return; //商品数量等于‘1’时,关闭按钮
this.list[index1].content[index2].count--; //商品数量减一
},
handleAdd: function(index1, index2){
this.list[index1].content[index2].count++; //商品数量加一
},
handleRemove: function(index1, index2){
this.list[index1].content.splice(index2, 1);
},
handleChecked:function(index1,index2){
this.list[index1].content[index2].check = !this.list[index1].content[index2].check
if(this.list[index1].content[index2].check === false){
this.checkall = false;
};
var checkallkey = true;
for(var i=0;i<this.list.length;i++){
for(var j=0;j<this.list[i].content.length;j++){
if(this.list[i].content[j].check === false) checkallkey = false;
}
}
this.checkall = checkallkey;
},
handleAllChecked: function(){ //全选 or 取消全选
if(this.checkall === false){
for(var i=0; i<this.list.length; i++){
for(var j=0; j<this.list[i].content.length; j++){
this.list[i].content[j].check = true;
}
}
this.checkall = true;
}
else if(this.checkall === true){
for(var i=0; i<this.list.length; i++){
for(var j=0; j<this.list[i].content.length; j++){
this.list[i].content[j].check = false;
}
}
this.checkall = false;
}
},
},
});

  

HTML 部分

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>购物车实战</title>
		<link rel="stylesheet" type="text/css" href="css/style.css"/>
		<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
	
	</head>
	<body>
		<div id="app" v-cloak>
			<template v-if="list.length">
				
				<!-- <template>里的代码分两部分, 一部分是商品列表信息,我们用表格 table 来展现:
				另一部分就是带有千位分隔符的商品总价(每隔三位数加进一个逗号〉。这部分代码如下: -->
				<table border="" cellspacing="" cellpadding="">
					<thead>
						<tr>
							<th><input type="checkbox" id="checkbox" v-model="checked" @change="changeAllChecked()" /></th>
							<th>商品编号</th>
							<th>商品价格</th>
							<th>商品单价</th>
							<th>购买数量</th>
							<th>操作</th>
						</tr>
					</thead>
					<tbody>
						<!-- 循环list -->
						
						<tr v-for="(item,index) in list">
							
							<td><input type="checkbox" :value="item" v-model="checkedData" /></td>
							<td>{{ index + 1 }}</td>
							<td>{{ item.name }}</td>
							<td>{{ item.price }}</td>
							<td>
								<button @click="handleReduce(index)"
								:disabled="item.count === 1">-</button>
								{{ item.count }}
								<button @click="handleAdd(index)">+</button>
							</td>
							<td>
								<button @click="handleRemove(index)">移除</button>
							</td>
						</tr>
					</tbody>
				</table>
				<div class="checks">
					<div>总价:¥ {{ totalPrice }}</div>
					<br>
				      <span >
						  选择的值为:
						  <tr >
							 <td>{{ checkedData }}</td>
						  </tr>
				      </span>
				    </div>
				
			</template>
			<div v-else>购物车空了,添加一些商品吧</div>
		</div>
		<!-- 注意,这里将vue.min. js ,index.js 
		文件写在<body 的最底部,如果写在<head>里 Vue 实例将无法创建,
		因为此时 DOM 还没有被解析完成,除非通过异步或在事件 
		DOMContentLoaded (IE 是onreadystatechange )
		触发时再创建 Vue 实例,这有点像 jQuery 的$(document).ready()方法。 -->
		<script src="https://unpkg.com/vue/dist/vue.js"></script>
		  <!-- import JavaScript -->
		  <script src="https://unpkg.com/element-ui/lib/index.js"></script>
		<script src="./js/index.js"></script>
	</body>
</html>

  

新鲜刺激的东西永远都有,玩之前掂量掂量自己几斤几两
原文地址:https://www.cnblogs.com/banxianer/p/14396165.html