vue实现CheckBox与数组对象绑定

实现需求:

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

分析:

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

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

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

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

代码实现:

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

HTML:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset=utf-8>
 5         <title>Test page</title>
 6         <link rel="stylesheet" type="text/css" href="style.css">
 7     </head>
 8     <body>
 9         <div id="app" v-cloak>
10             <template v-if=‘list.length‘>
11                 <table>
12                     <thead>
13                         <tr>
14                             <th>
15                                 <input type="checkbox" v-model="checkAll" :checked="checkAll" @change="handleCheckAll">选择
16                             </th>
17                             <th></th>
18                             <th>商品名称</th>
19                             <th>商品单价</th>
20                             <th>购买数量</th>
21                             <th>操作</th>
22                         </tr>
23                     </thead>
24                     <tbody>
25                         <tr v-for=‘(item, index) in list‘>
26                             <td>
27                                 <input type="checkbox" v-model="item.checked" :checked="item.checked">
28                             </td>
29                             <td>{{index + 1}}</td>
30                             <td>{{item.name}}</td>
31                             <td>{{item.price}}</td>
32                             <td>
33                                 <button :disabled=‘item.count === 1‘ @click=‘handleReduce(index)‘>-</button>
34                                 {{item.count}}
35                                 <button @click=‘handleAdd(index)‘>+</button>
36                             </td>
37                             <td>
38                                 <button @click=‘handleRemove(index)‘>移除</button>
39                             </td>
40                         </tr>
41                     </tbody>
42                 </table>
43                 <div>总价: {{totalPrice}}</div>
44             </template>
45             <div v-else>购物车为空</div>
46
47         </div>
48
49         <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
50         <script src="index.js"></script>
51     </body>
52 </html>

index.js

 1 var app = new Vue({
 2     el: ‘#app‘,
 3     data: {
 4         list: [
 5             {
 6                 id: 1,
 7                 name: ‘iPhone 7‘,
 8                 price: 6188,
 9                 count: 1,
10                 checked: false
11             },
12             {
13                 id: 2,
14                 name: ‘iPad Pro‘,
15                 price: 5888,
16                 count: 1,
17                 checked: true
18             },
19             {
20                 id: 3,
21                 name: ‘Macbook Pro‘,
22                 price: 21488,
23                 count: 1,
24                 checked: false
25             }
26         ]
27     },
28     computed: {
29         totalPrice: function () {
30             var total = 0;
31             for (var i = 0; i < this.list.length; i++) {
32                 total += this.list[i].checked ? this.list[i].price * this.list[i].count : 0;
33             }
34             return total.toString().replace(/\B(?=(\d{3})+$)/g, ‘,‘);
35         },
36         checkAll: {
37             get() {
38                 var result = true;
39                 for (var i = 0; i < this.list.length; i++) {
40                     if (!this.list[i].checked)
41                         result = false;
42                 }
43                 return result;
44             },
45             set(val) {
46                 for (var i = 0; i < this.list.length; i++) {
47                     this.list[i].checked = val;
48                 }
49             }
50         }
51     },
52     methods: {
53         handleReduce: function (index) {
54             if (this.list[index].count === 1) return;
55             this.list[index].count--;
56         },
57
58         handleAdd: function (index) {
59             this.list[index].count++;
60         },
61
62         handleRemove: function (index) {
63             this.list.splice(index, 1);
64         },
65
66         handleCheckAll: function () {
67             var setCheck = this.checkAll;
68             for (var i = 0; i < this.list.length; i++) {
69                 var tmpObj = this.list[i];
70                 tmpObj.checked = setCheck;
71                 this.$set(this.list, i, tmpObj);
72             }
73         }
74     }
75 })

style.css

 1 [v-cloak]{
 2     display: none;
 3 }
 4
 5 table {
 6     border: 1px solid #e9e9e9;
 7     border-collapse: collapse;
 8     border-spacing: 0px;
 9     empty-cells: show;
10 }
11
12 th, td{
13     padding: 8px 16px;
14     border: 1px solid #e9e9e9;
15     text-align: left;
16 }
17
18 th{
19     background: #f7f7f7;
20     color: #5c6b77;
21     font-weight: 600;
22     white-space: nowrap;
23 }

原文地址:https://www.cnblogs.com/zheng-hong-bo/p/12253055.html

时间: 2024-11-13 18:39:58

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

Vue数组双向绑定内幕

在Vue使用期间,我们经常会遇到对于数组的操作,但是Vue中如何实现数组双向绑定的呢,在这篇PPT中,首先回顾Vue双向绑定原理,之后再去研究Vue对于数组的特殊处理. ppt:Vue数组双向绑定内幕 参考:https://ustbhuangyi.github.io/vue-analysis/ 原文地址:https://www.cnblogs.com/MarphyDemon/p/11487764.html

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

一.为什么需要使用Vue.set? vue中不能检测到数组和对象的两种变化: 1.数组长度的变化 vm.arr.length = 4 2.数组通过索引值修改内容 vm.arr[1] = ‘aa’ Vue.$set(target,key,value):可以动态的给数组.对象添加和修改数据,并更新视图中数据的显示. vue在构造函数new Vue()时,就通过Object.defineProperty中的getter和setter 这两个方法,完成了对数据的绑定.所以直接通过vm.arr[1] =

select绑定json数组对象 asp.net

ashx处理页 string JsonList = "["; IList<Models.Channel> ilist = BLL.ChannelManager.GetAllChannels(); List<Models.Channel> list = PublicCS.IListToList(ilist);/// IList转化为List JsonList += "{id:0,ChannelName:'顶级栏目'},"; foreach (M

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

直接修改数组元素是无法触发视图更新的,如 this.array[0] = { name: 'meng', age: 22 } 修改array的length也无法触发视图更新,如 this.array.length = 2; 触发视图更新的方法有如下几种 1. Vue.set 可以设置对象或数组的值,通过key或数组索引,可以触发视图更新 数组修改 Vue.set(array, indexOfItem, newValue) this.array.$set(indexOfItem, newValue

vue 数组对象取对象的属性: Cannot read property &#39;xxxx&#39; of undefined

{{ list[0].name }} list[0]没有定义 能正确打印出想要的结果,但就是报错,外面套个v-for就没错了 很费解 与异步有关,解决办法: <template v-if=list[0]> {{ list[0].name }} </template> https://www.v2ex.com/amp/t/402145 vue 数组对象取对象的属性: Cannot read property 'xxxx' of undefined 原文地址:https://www.c

使用vue实现数组对象排序

从网上找到的例子用vue来实现数组对象排序 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-U

vue的watcher 关于数组和对象

数组 不能被监听到的情况 1.直接下标赋值(但对象直接修改原有属性值可以渲染视图,虽然也监听不到) 2.修改数组length 解决方法: this.$set(this.arr,index,val) push或splice等修改原数组的方法 直接赋值数组 对象 不能被监听的情况 1.直接修改.添加.删除属性(修改虽然监听不到,但可以重新渲染视图,删除.添加不会重新渲染视图:设置deep:true则可以监听) 2.this.$set()修改原有属性 解决方法: 1.obj:{ handler(){}

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

1.VUE 前端简单介绍  VUE JS是一个简洁的双向数据绑定框架,他的性能超过ANGULARJS,原因是实现的机制和ANGULARJS 不同,他在初始化时对数据增加了get和set方法,在数据set时,在数据属性上添加监控,这样数据发生改变时,就会触发他上面的watcher,而ANGULARJS 是使用脏数据检查来实现的. 另外VUEJS 入门比ANGULARJS 简单,中文文档也很齐全. 2.组件实现    在使用vue开发过程中,我们会需要扩展一些组件,在表单中使用,比如一个用户选择器.

Vue.2.0.5-Class 与 Style 绑定

Class 与 Style 绑定 数据绑定一个常见需求是操作元素的 class 列表和它的内联样式.因为它们都是属性 ,我们可以用v-bind 处理它们:只需要计算出表达式最终的字符串.不过,字符串拼接麻烦又易错.因此,在 v-bind 用于 class 和 style 时, Vue.js 专门增强了它.表达式的结果类型除了字符串之外,还可以是对象或数组. 绑定 HTML Class 对象语法 我们可以传给 v-bind:class 一个对象,以动态地切换 class . <div v-bind