实现需求:

实现一个简易的购物车,页面的表格展示data数据中的一个数组对象,并提供选中商品和全选商品checkbox复选框,页面实时显示选中商品的总金额:

分析:

1:使用v-for循环渲染arraylist对象;

2:使用computed计算属性计算总价;

3:使用computed计算全选复选框是否应该被选中(商品列表如果都被勾选,则设置全选复选框的状态为选中,否则设置全选复选框状态为取消选中);

4:根据数组中元素的初始选中状态,设置页面商品复选框是否选中。

代码实现:

使用html文件作为页面显示,引入js文件,Vue代码写在index.js中,页面样式保存在style.css中。

HTML:

 <!DOCTYPE html>
<html>
<head>
<meta charset=utf-8>
<title>Test page</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div id="app" v-cloak>
<template v-if='list.length'>
<table>
<thead>
<tr>
<th>
<input type="checkbox" v-model="checkAll" :checked="checkAll" @change="handleCheckAll">选择
</th>
<th></th>
<th>商品名称</th>
<th>商品单价</th>
<th>购买数量</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr v-for='(item, index) in list'>
<td>
<input type="checkbox" v-model="item.checked" :checked="item.checked">
</td>
<td>{{index + 1}}</td>
<td>{{item.name}}</td>
<td>{{item.price}}</td>
<td>
<button :disabled='item.count === 1' @click='handleReduce(index)'>-</button>
{{item.count}}
<button @click='handleAdd(index)'>+</button>
</td>
<td>
<button @click='handleRemove(index)'>移除</button>
</td>
</tr>
</tbody>
</table>
<div>总价: {{totalPrice}}</div>
</template>
<div v-else>购物车为空</div> </div> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="index.js"></script>
</body>
</html>

index.js

 var app = new Vue({
el: '#app',
data: {
list: [
{
id: 1,
name: 'iPhone 7',
price: 6188,
count: 1,
checked: false
},
{
id: 2,
name: 'iPad Pro',
price: 5888,
count: 1,
checked: true
},
{
id: 3,
name: 'Macbook Pro',
price: 21488,
count: 1,
checked: false
}
]
},
computed: {
totalPrice: function () {
var total = 0;
for (var i = 0; i < this.list.length; i++) {
total += this.list[i].checked ? this.list[i].price * this.list[i].count : 0;
}
return total.toString().replace(/\B(?=(\d{3})+$)/g, ',');
},
checkAll: {
get() {
var result = true;
for (var i = 0; i < this.list.length; i++) {
if (!this.list[i].checked)
result = false;
}
return result;
},
set(val) {
for (var i = 0; i < this.list.length; i++) {
this.list[i].checked = val;
}
}
}
},
methods: {
handleReduce: function (index) {
if (this.list[index].count === 1) return;
this.list[index].count--;
}, handleAdd: function (index) {
this.list[index].count++;
}, handleRemove: function (index) {
this.list.splice(index, 1);
}, handleCheckAll: function () {
var setCheck = this.checkAll;
for (var i = 0; i < this.list.length; i++) {
var tmpObj = this.list[i];
tmpObj.checked = setCheck;
this.$set(this.list, i, tmpObj);
}
}
}
})

style.css

 [v-cloak]{
display: none;
} table {
border: 1px solid #e9e9e9;
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
} th, td{
padding: 8px 16px;
border: 1px solid #e9e9e9;
text-align: left;
} th{
background: #f7f7f7;
color: #5c6b77;
font-weight:;
white-space: nowrap;
}

vue实现CheckBox与数组对象绑定的更多相关文章

  1. Vue.set 向响应式对象中添加响应式属性,及设置数组元素触发视图更新

    一.为什么需要使用Vue.set? vue中不能检测到数组和对象的两种变化: 1.数组长度的变化 vm.arr.length = 4 2.数组通过索引值修改内容 vm.arr[1] = ‘aa’ Vu ...

  2. select绑定json数组对象 asp.net

    ashx处理页 string JsonList = "["; IList<Models.Channel> ilist = BLL.ChannelManager.GetA ...

  3. vue数组对象修改触发视图更新

    直接修改数组元素是无法触发视图更新的,如 this.array[0] = { name: 'meng', age: 22 } 修改array的length也无法触发视图更新,如 this.array. ...

  4. Opengl_入门学习分享和记录_03_渲染管线(三)借助顶点数组对象VAO提高绑定属性效率

    目前我们已经知道了,如果想要顶点着色器解释理解我们的输入数据,就必须要按照以下繁琐的步骤:第一步:将输入的数据复制一份到缓冲区,供OpenGL使用.而这块新出现的区域由VBO管理和表示.(若有多个输入 ...

  5. 仵航说 Vue用replace修改数组中对象的键值或者字段名 仵老大

    仵航说 Vue用replace修改数组中对象的键值或者字段名 仵老大 1.介绍 先看图 ​ 今天在项目中遇到了一个问题,例如我现在需要传一些数据到后端,数组例如是 let arr = [ {" ...

  6. vue的watcher 关于数组和对象

    数组 不能被监听到的情况 1.直接下标赋值(但对象直接修改原有属性值可以渲染视图,虽然也监听不到) 2.修改数组length 解决方法: this.$set(this.arr,index,val) p ...

  7. VUE JS 使用组件实现双向绑定

    1.VUE 前端简单介绍  VUE JS是一个简洁的双向数据绑定框架,他的性能超过ANGULARJS,原因是实现的机制和ANGULARJS 不同,他在初始化时对数据增加了get和set方法,在数据se ...

  8. 关于vue.js中class与style绑定的学习

    练习代码: html: <!DOCTYPE html><html lang="en"><head> <meta charset=" ...

  9. ASP.NET MVC数组模型绑定

    在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type="text" name ...

随机推荐

  1. Ternsorflow 学习:006-MNIST进阶 深入MNIST

    前言 这篇文章适合实践过MNIST入门的人学习观看.没有看过MNIST基础的人请移步这里 深入MNIST TensorFlow是一个非常强大的用来做大规模数值计算的库.其所擅长的任务之一就是实现以及训 ...

  2. springboot2.1以javabean整合rabbitmq及自动注入rabbitmqTemplate为空问题

    springboot集成rabbitmq之前也写过,这次再来个总结,总体来讲比较简单 主要就是配置属性文件,将属性以javabean的形式注入,配置工厂,对象等原来以xml<bean>形式 ...

  3. C语言中指针和取地址符&的关系

    一 概念定义: 严格说起来,应该这么讲:指针存的是地址,而&运算符是取变量的地址. 指针原理: 其实计算机中的内存就像一个个抽屉(一兆内存就相当于1百万个抽屉),每个抽屉都有一个编号,用于存放 ...

  4. 最初步的.NET MvcApi + Vue 前后端分离IIS部署

    一.完成项目,各个项目部署在IIS上 1.前端项目部署     完成项目后在控制台npm run build 生成了dist文件夹 主要是部署这个文件夹 打开IIS  和部署AspNet MVC项目一 ...

  5. MongoDB_02简介

    MongoDB简介 MongoDB是一个开源,高性能,无模式的文档型数据库. 它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以他既可以存储比较复杂的数据类型,又相当的灵活. Mon ...

  6. POJ1014:Dividing

    Dividing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 63013   Accepted: 16315 Descri ...

  7. Gauss列主消元

    问题:1.列主消元为什么精度高? 2.fabs函数精确度 #include<iostream> #include<cstdio> #include<cstring> ...

  8. 杭电oj3306:Another kind of Fibonacci(矩阵快速幂)

    Another kind of Fibonacci 题目链接 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (J ...

  9. 【踩坑记录】记录一次使用Python logging库多进程打印日志的填坑过程

    背景: 项目使用Python自带的logging库来打印日志 项目部署在一台Centos7的机器上 项目采用gunicorn多进程部署 过程: 1.LOG日志代码封装: 采用logging库,并设置w ...

  10. 140-PHP类的抽象方法和继承

    <?php abstract class father{ //定义一个抽象类 abstract public function test(); //定义抽象方法 } class son exte ...