• vue购物车和地址选配(三)


    • 参考资料:vue.js官网
    • 项目演示:

    • 项目源代码:
    • 核心代码及踩坑

    删除:

    new Vue({
        el:'#app',
        data:{
          productlist:[],
          totalMoney:0,
          checkAllFrag:false,//默认没有全选
          deFlag:false,
          //当前的存起来
          curProduct:''
        },
        //必须加mounted函数,这是页面初加载,如果不写这个函数,network中将请求不到数据
        mounted:function(){
              this.cartView();
        },
    
        //局部过滤器
        filters:{
    
            formatMoney:function(value){
                return "$" + value.toFixed(2);
            }
        },
        
        methods:{
    
            cartView:function(){
                
            var _this=this;    //要保存这个this,
            this.$http.get('data/cartData.json',{'id':'123'}).then(function(res){
                      
              _this.productlist=res.data.result.list;   //这里的this已经不是实例对象了
            });
    
            },
    
            changeMoney:function(product,way){
             
             if(way>=1){
              product.productQuantity++;
             }else{
                   product.productQuantity--;
                 if(product.productQuantity<1){
                     product.productQuantity=1;
                 }
             }
              this.calcTotalPrice();
    
            },
    
            selectedProduct:function(item){
    
                //每次选中的时候先判断当前这个item.checked属性是否存在
                if(typeof item.check=="undefined"){
                    this.$set(item,'check',true);//如果不存在就先给他设置一个
                }else{
                    item.check=!item.check;
                }
    
                this.calcTotalPrice();
            },
    
            //
            checkAll:function(flag){
    
               
                this.checkAllFrag=flag; //将前面传来的标志记录下来,全选=true,不全选=false
                 var _this=this;
             
                  _this.productlist.forEach(function(item,index){ //就把上面的单选按钮的check都设置为true
    
                    if(typeof item.check =="undefined"){
                      _this.$set(item,'check',_this.checkAllFrag); //把单选按钮设置成和全选时=true,不全选时=false
                    }else{
                      item.check=_this.checkAllFrag;
                    }
                  });
    
                  this.calcTotalPrice();
            },
    
            calcTotalPrice:function(){
    
              var _this=this;
              _this.totalMoney=0;//每次计算都要清零处理
    
              _this.productlist.forEach(function(item,index){
    
                if(item.check){//如果被选中,就计算总金额,并且把每一项累加
                   _this.totalMoney+=item.productPrice*item.productQuantity;
                }
             
    
              });
            },
    
            delProduct:function(){
               //
             //  this.productlist.indexOf(this.curProduct);
    
               this.productlist.splice(this.index,1);
               this.deFlag=false;
             
            }
    
        }
    
        
       
    });
    
    Vue.filter('money',function(value,type){
        return '$' + value.toFixed(2)+type;
    });
    删除的实例.js

    点击删除按钮要弹出那个确定框:

    第一步:同样用v-bind绑定一个属性,当点击删除按钮时,deFlag=true,弹出确定框

     
    //这是显示那个确定框的
    <div class="md-modal modal-msg md-modal-transition" id="showModal" v-bind:class="{'md-show':deFlag}">
    
    
    //这是删除按钮
     <a href="javascript:void 0" class="item-edit-btn" @click="deFlag=true">
    
    //在实例data中,定义了deFlag=false,当点击按钮时,deFlag=true框显示

    第二步:定义和调用删除函数

    //yes和no调用的是同一个函数,当传入的参数为1的时候删除,为0的时候不删除
    
    <button class="btn btn--m" id="btnModalConfirm" @click="delProduct(1)">Yes</button>
                    <button class="btn btn--m btn--red" id="btnModalCancel" @click="delProduct(0)">No</button>
                  </div>
     delProduct:function(type){
         
        
               this.productlist.splice(this.index,type);
               this.deFlag=false;
             
            }

    踩坑:踩坑一:在vue1.0中可以用$delete函数来直接删除

               采坑二:确定框的显示,用上面的方式

    地址选配

    地址过滤方式渲染数据,让购物车地址默认只显示三条

    new Vue({
    
        el:'.container',
        data:{
          addresslist:[],
          limitNum:3
         
        },
      filters:function(){
    
      },
        mounted:function(){
         this.$nextTick(function(){
           this.getaddresslist();
         });
        },
        computed:{
           filterAddress: function(){
               return this.addresslist.slice(0,3);
           }
        },
    
        methods:{
         getaddresslist:function(){
             var _this=this
             this.$http.get('data/address.json',{'id':123}).then(function(res){
                
                
                     _this.addresslist=res.data.result;
                 
             });
         }
         
        }
    });
    默认只显示三条.js

    也是用v-for渲染数据,但是与之前的有区别

    //filterAddress 是有computed重新过滤的数组
    <li v-for="(item,index) of filterAddress" >
                    <dl>
                      <dt>{{item.userName}}</dt>
                      <dd class="address">{{item.streetName}}</dd>
                      <dd class="tel">{{item.tel}}</dd>
                    </dl>
    </li>

    computed函数过滤

        computed:{
           filterAddress: function(){
            //只返回数组从0-3的数据
               return this.addresslist.slice(0,3);
           }
        },

    展示更多:直接在默认显示三条的基础上将limitNum,通过loadmore函数改变

     <div class="shipping-addr-more">
                <a class="addr-more-btn up-down-btn" href="javascript:" @click="loadmore()">
                  more
                  <i class="i-up-down">
                    <i class="i-up-down-l"></i>
                    <i class="i-up-down-r"></i>
                  </i>

    loadmore函数:

     loadmore:function(){
          return this.limitNum=this.addresslist.length;
         }

    设为默认地址:“设为默认地址”和“默认地址”之间是一对互斥事件,isDefault是存在数据中的数据项,

    item.isDefault=false,就显示
                      <div class="addr-opration addr-set-default" v-if="item.isDefault">
                      <a href="javascript:;" class="addr-set-default-btn" @click="SetDefault(item.addressId)"><i>设为默认</i></a>
                    </div>
                    <div class="addr-opration addr-default" v-if="!item.isDefault">默认地址</div>

    通过点击SetDefault()函数来实现

    SetDefault:function(addressId){
    
         //遍历
         this.addresslist.forEach(function(obj,index){
             
             //当前遍历的id是否等于我们点击的id,如果相等,就设为默认
             if(obj.addressId==addressId){
              obj.isDefault=true;
             }else{
              obj.isDefault=false;
             }
         });
    
         }

    配送方式的选择,也是两个互斥事件

    <li v-bind:class="{'check':shippingmethod==1}" @click="shippingmethod=1">
                    <div class="name" >标准配送</div>
                    <div class="price">Free</div>
                  </li>
                  <li v-bind:class="{'check':shippingmethod==2}" @click="shippingmethod=2">
                    <div class="name"  >高级配送</div>
                    <div class="price">180</div>
                  </li>
    虽然现在走得很慢,但不会一直这么慢
  • 相关阅读:
    HTTP状态详解
    表锁和行锁
    memcache 加载(对象)所遇到的问题。资源
    php 数据导出csv 注意问题。
    文件不存在的话创建文件 文件上传所遇到的问题、
    获取文件的后缀名。phpinfo
    手机访问pc网站自动跳转手机端网站代码
    计算机网络学习-20180826
    计算机网络学习-20180811
    集线器和交换机的区别
  • 原文地址:https://www.cnblogs.com/xxm980617/p/10498941.html
Copyright © 2020-2023  润新知