实现需求:

实现一个简易的购物车,页面的表格展示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. 第1课 VMware的NSX全面落地软件定义网络SDN

    SDN的定义: 即软件定义网络(Software Defined Network)的缩写,它是一种基于网络架构的创新,一种在已存在物理传输网络之上的抽象形态,它是一种体系结构,它是众多网络虚拟化技术中 ...

  2. Linux基础命令、软件安装

    常用命令 查看当前系统中存在哪些shell cat /etc/shells [root@** ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /us ...

  3. vue的自定义

    自定义组件 组件是可以被复用的页面的零件,其实就是一个插件,只是在vue里叫组件 先看看别人的组件 vant element Mint iView 去试试上面的组件,都是有脚手架版和直接引入使用的版本 ...

  4. Day6 - D - Tree 园丁的烦恼 HYSBZ - 1935

    很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: “最近我在思索一个问题, ...

  5. 014.CI4框架CodeIgniter数据库操作之:查询数据库,并让数据以对象的方式返回查询结果

    01. 我们在CI4框架中的Model文件夹新建一个User_model.php的文件,使用的是getResultArray,表示并让数据以数组的方式返回查询结果,代码如下: <?php nam ...

  6. 如何让你的学术Essay写作看起来更高级?

    学术风格不仅是使用某些特定的词汇或者特定的表达方式.学术风格还会涉及到你的思考方式.推理方式以及你如何利用某个领域内已知的发现.学术风格是英国大学学习的核心.所以在平时的学习中,英国环球论文小编建议大 ...

  7. POJ 1961:Period

    Period Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 14280 Accepted: 6773 Description F ...

  8. 使用 Exchange 命令行管理程序查看动态通讯组的成员

    本示例返回名为 "全职员工" 的动态通讯组的成员列表. 第一个命令将动态通讯组对象存储在变量$FTE中. 第二个命令使用 Get-Recipient cmdlet 列出与为动态通讯 ...

  9. eclipse 安装spring tools suite插件

    之前使用idea进行springboot项目的开发学习,但是由于idea是收费的,总是用着用着说验证码到期之类的,总之还是很不爽,于是就想重新采用eclipse开发springboot项目,为了方便s ...

  10. JavaWeb面试题(转)

    1.Tomcat的优化经验 答:去掉对web.xml的监视,把JSP提前编辑成Servlet:有富余物理内存的情况下,加大Tomcat使用的 JVM内存. 2.什么是Servlet? 答:可以从两个方 ...