vue.js实战——购物车练习(包含全选功能)

vue.js实战第5章 54页的练习1

直接放代码好了,全选的部分搞了好久,代码好像有点啰嗦,好在实现功能了(*^▽^*)

HTML:

<!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-UA-Compatible" content="ie=edge">
    <title>购物车示例</title>
    <link rel="stylesheet" href="index.css">
</head>
<body>
    <div id="app" v-cloak>
        <template v-if="list.length">
            <table>
                <thead>
                    <tr>
                        <th>
                            <input type="checkbox" v-model="checkAll">全选
                        </th>
                        <th>商品名称</th>
                        <th>商品单价</th>
                        <th>购买数量</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <tbody>
                    <tr v-for="(item,index) in list">
                        <!-- <td>{{index+1}}</td> -->
                        <td><input type="checkbox" :checked="item.check" @click="isAll(index)"> {{item.check}}</td>
                        <td>{{item.name}}</td>
                        <td>{{item.price}}</td>
                        <td>
                            <button @click="handleReduce(index)" :display="item.count===1">-</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="../vue.js"></script>
    <script src="index.js"></script>
</body>
</html>

JS:

var app=new Vue({
    el:‘#app‘,
    data:{
        list:[
            {
                id:1,
                name:‘iPhone 7‘,
                price:6288,
                count:1,
                check:false
            },{
                id:2,
                name:‘iPad Pro‘,
                price:5888,
                count:1,
                check:false
            },{
                id:3,
                name:‘MacBook Pro‘,
                price:21488,
                count:1,
                check:false
            }
        ],
        checkAll:false,
        smallHand:false
    },
    computed:{
        totalPrice:function(){
           this.newList=this.list.filter(function(item){
                    if(item.check){
                        return item;
                    }
            });
            var total=0;
            for(var i=0;i<this.newList.length;i++){
                var item=this.newList[i];
                total+=item.price*item.count;
            }
            return total.toString().replace(/\B(?=(\d{3})+$)/g,‘,‘);//匹配后面已3个数字结尾的非单词边界,换成“,”
            /* replace:
                用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串
                \B  :匹配非单词边界
                (red|blue|green):查找任何指定的选项
                ?=n :匹配任何其后紧接指定字符串n的字符串(n量词)    提供后面的n找?
                \d  :查找数字
                n{X}:匹配包含X个n的序列字符串
                \d{3}:匹配含有3个数字的字符串
                n$  :匹配任何结尾为n的字符串
                n+  :匹配任何包含至少一个n的字符串
                (\d{3})+$   :匹配至少一个已含有3个数字字符串结尾的字符
             */
        }
    },
    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);
        },
        isAll:function(index){
            console.log(this.list[index].check);
            var indexItem=this.list[index];

            indexItem.check=!indexItem.check;
            var num=0;
            for(var i=0;i<this.list.length;i++){
                var item=this.list[i];
                if(item.check){
                    num++;
                }else{
                    num--;
                }
            }
            console.log(num);////(选中了最后一个)3-全部勾选-勾选全选     (之前全部勾选,取消了任意一个勾选) 1-取消全选的勾选
            if(num==3||(num==1&&indexItem.check==false)){
                this.checkAll=indexItem.check;
                this.smallHand=true;
            }
        }
    },
    watch:{
        checkAll:function(){
            if(this.smallHand){

            }else{
                for(var i=0;i<this.list.length;i++){
                    this.list[i][‘check‘]=this.checkAll;
                }
            }
            this.smallHand=false;
        }
    }
})

css:

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

原文地址:https://www.cnblogs.com/em2464/p/10413181.html

时间: 2024-08-02 10:19:59

vue.js实战——购物车练习(包含全选功能)的相关文章

vue.js实战学习——内置指令(一)

注:此内容摘抄自:梁灏的<Vue.js实战> 注:记得要引入vue.js才能运行哦,文章中贴出的代码直接复制是不行的,html css js 都放在了一起,而且也没有引用vue.js.   1.v-cloak v-cloak不需要表达式,它会在Vue实例结束编译时从绑定的HTML元素上移除,经常和CSS的display:none: 配合使用. <div class="app1" v-cloak> {{message}} </div> var app1

JS全选功能代码优化

最近在看javascript MVC那本书,也感觉到自己写的代码也并不优雅,所以一直在想 用另一种模式来编写JS代码,所以针对之前的简单的JS全选功能来做个简单的demo,使用目前现在的编码方式来重新编码,当然以后会一直用这种方式来编写自己的代码.下面是如下代码: JS所有代码: /** * JS全选 * @class Checkall * @param {Object} cfg * @param {Element|selector} [cfg.container] 限定全选的容器 * @par

js实现全选功能

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

VUE.JS实现购物车功能

购物车是电商必备的功能,可以让用户一次性购买多个商品,常见的购物车实现方式有如下几种: 1. 用户更新购物车里的商品后,页面自动刷新. 2. 使用局部刷新功能,服务器端返回整个购物车的页面html 3. 服务器端返回JSON格式,使用模板引擎+dom操作更新页面 最近新学习了vue.js,一个轻量级的mvvm(Model-View-ViewModel),vue.js是数据驱动无须操作dom,它提供特殊的html语言,把dom和数据绑定在一起,一旦修改了数据,dom将会自动更新更新. 关于vue.

vue.js实战学习——指令与事件

注:此内容摘抄自:梁灏的<Vue.js实战> 1.指令是Vue.js模版中最常用的一项功能,它带有前缀 v- ,比如:v-if , v-html ,v-pre 等.指令的主要职责就是当其表达式的值改变时,相应的将某些行为应用到DOM上. <div class="app1"> <p v-if="show">哈喽?</p> </div> var app=new Vue({ el:'.app1', data:{

vue.js实战学习——v-bind 及class与 style绑定

注:此内容摘抄自:梁灏的<Vue.js实战> 注:记得要引入vue.js才能运行哦,文章中贴出的代码直接复制是不行的,html css js 都放在了一起,而且也没有引用vue.js. DOM元素经常会动态的绑定一些class类名或style样式. 1.了解v-bind指令 它的主要用法是动态更新HTML元素上的属性. 在数据绑定中,最常见的两个需求就是元素的样式名称class和内联样式style的动态绑定,他们也是HTML的属性,因此可以使用v-bind指令.我们只需要用v-bind计算出表

热烈庆祝《Vue.js 实战教程 V2.x(一)基础篇》上线了!

课程简介 课程地址:https://ke.qq.com/course/432961 机构名称:大华软件学院 授课讲师:大强老师 课程名称:Vue.js 实战教程 V2.x(一)基础篇 课程简介:包括前端发展史.Vue.js简介.第一个Vue.js程序.安装环境和Vue.Vue实例.模板语法.计算属性和侦听器.Class与Style绑定.条件渲染.列表渲染.事件处理.表单输入绑定.组件基础等等. 适合人群: 1.初出茅庐,想学习前端开发的同学: 2.没用过Vue.js,想学习更多框架的同学: 3.

js初学—实现checkbox全选功能

布局如下: <p ><input type="checkbox" id="che1"/>全选</p><div id="div1"> <input type="checkbox" /><br /> <input type="checkbox" /><br /> <input type="checkb

Vue的全选功能实现思路

全选功能的实现主要分两步: 1. 点击全选框选中所有选择框. 2. 当所有选择框都被选中时,勾选全选框. 详细思路: 1. 点击全选框选中所有选择框: 给全选框绑定一个值,然后添加change时间,当全选框的值改变时给所有选择框的值赋与全选框的值. 2. 当所有选择框都被选中时,选中全选框: 给所有选择框都添加change事件,当某个选择框的值改变时,检查所有选择框的状态:只要有一个选择框没被选中,则把全选框的值设为false,否则设为true. 注意:两步的关键区别在于,一个是通过事件改变,一