欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Vue.js搭建移动端购物车界面

程序员文章站 2022-03-20 21:54:36
本文介绍了如何使用vue搭建一个移动端购物车界面,最终实现的功能包括: 1. 选择要最终购买的物品 2. 选择每件物品购买的数量 3.&nbs...

本文介绍了如何使用vue搭建一个移动端购物车界面,最终实现的功能包括:

1. 选择要最终购买的物品
2. 选择每件物品购买的数量
3.  实时更新所选择物品的总价格 

html部分

首先给出html部分代码和注释,显示了整个界面的结构。

<body> 
  <div class="checkout"> 
   <div id="app"> 
    <div class="container"> 
     <div class="cart"> 
      <div class="checkout-title"> 
       <span>购物车</span> 
      </div> 
  
      <!-- table --> 
      <div class="item-list-wrap"> 
       <divclassdivclass="cart-item"> 
        <divclassdivclass="cart-item-head"> 
         <ul> 
          <li>商品信息</li> 
          <li>商品金额</li> 
          <li>商品数量</li> 
          <li>总金额</li> 
          <li>编辑</li> 
         </ul> 
        </div> 
        <ulclassulclass="cart-item-list"> 
         <!--productlist在vue组件中的data定义,包含全部数据,使用v-for进行遍历显示--> 
         <li v-for="item inproductlist"> 
          <divclassdivclass="cart-tab-1"> 
           <divclassdivclass="cart-item-check"> 
            <!--vue2.0中想为html标签绑定属性,必须使用v-bind:,绑定内容为对象,这里为a标签绑定check属性,属性值为item中的checked值--> 
            <!--@click是v-on:click的缩写,为这个按钮绑定了点击事件,对应vue组件methods中定义的方法selectproduct--> 
            <ahrefahref="javascript:void 0" class="item-check-btn"v-bind:class="{'check': item.checked}"@click="selectedproduct(item)"> 
             <svgclasssvgclass="icon icon-ok"><usexlink:hrefusexlink:href="#icon-ok"></use></svg> 
            </a> 
           </div> 
           <divclassdivclass="cart-item-pic"> 
            <imgv-bind:srcimgv-bind:src="item.productimage" alt="烟"> 
           </div> 
           <divclassdivclass="cart-item-title"> 
            <divclassdivclass="item-name">{{ item.productname }}</div> 
           </div> 
           <divclassdivclass="item-include"> 
            <dl> 
             <dt>赠送:</dt> 
             <ddv-forddv-for="part in item.parts"v-text="part.partsname"></dd> 
            </dl> 
           </div> 
          </div> 
          <divclassdivclass="cart-tab-2"> 
           <!--使用过滤器,|后面加vue组件filter中定义的过滤器名称--> 
           <divclassdivclass="item-price">{{ item.productprice |formatmoney}}</div> 
          </div> 
          <divclassdivclass="cart-tab-3"> 
           <divclassdivclass="item-quantity"> 
            <divclassdivclass="select-self select-self-open"> 
             <divclassdivclass="quantity"> 
              <!--绑定changemoney()方法,调整商品数量--> 
              <ahrefahref="javascript:;"@click="changemoney(item,-1)">-</a> 
              <inputtypeinputtype="text" :value="item.productquantity" disabled> 
              <ahrefahref="javascript:;"@click="changemoney(item,1)">+</a> 
             </div> 
            </div> 
            <divclassdivclass="item-stock">有货</div> 
           </div> 
          </div> 
          <divclassdivclass="cart-tab-4"> 
           <divclassdivclass="item-price-total">{{ item.productprice*item.productquantity| money('元')}}</div> 
          </div> 
          <div class="cart-tab-5"> 
           <divclassdivclass="cart-item-operation"> 
            <!--delconfirm方法控制删除时的弹框显示状态--> 
            <ahrefahref="javascript:void 0" class="item-edit-btn"@click="delconfirm(item)"> 
             <svg class="iconicon-del"><use xlink:href="#icon-del"></use></svg> 
            </a> 
           </div> 
          </div> 
         </li> 
        </ul> 
       </div> 
      </div> 
  
      <!-- footer --> 
      <div class="cart-foot-wrap"> 
       <divclassdivclass="cart-foot-l"> 
        <divclassdivclass="item-all-check"> 
         <ahrefahref="javascript:void 0"> 
          <spanclassspanclass="item-check-btn" :class="{'check':checkallflag}"@click="checkall(true)"> 
           <svg class="iconicon-ok"><usexlink:hrefusexlink:href="#icon-ok"></use></svg> 
          </span> 
          <span v-show="!checkallflag">全选</span> 
         </a> 
        </div> 
        <divclassdivclass="item-all-del"> 
         <ahrefahref="javascript:void 0" class="item-del-btn"@click="checkall(false)"> 
          <spanv-showspanv-show="checkallflag">取消全选</span> 
         </a> 
        </div> 
       </div> 
       <divclassdivclass="cart-foot-r"> 
        <divclassdivclass="item-total"> 
         <!--totalmoney是商品总金额,在vue组件中通过方法被修改--> 
         item total: <span class="total-price">{{totalmoney| money('元')}}</span> 
        </div> 
        <divclassdivclass="next-btn-wrap"> 
         <ahrefahref="address.html" class="btn btn--red" style="width:200px">结账</a> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
  
    <!--绑定一个md-show类,通过delflag变量控制这个类,这个类可以让弹框显示或隐藏--> 
    <div class="md-modal modal-msg md-modal-transition"id="showmodal" v-bind:class="{'md-show':delflag}"> 
     <div class="md-modal-inner"> 
      <div class="md-top"> 
       <!--关闭按钮,通过改变delflag值控制弹框状态--> 
       <buttonclassbuttonclass="md-close" @click="delflag = false">关闭</button> 
      </div> 
      <div class="md-content"> 
       <divclassdivclass="confirm-tips"> 
        <pidpid="cuslaninfo">你确认删除此订单信息吗?</p> 
       </div> 
       <div class="btn-wrapcol-2"> 
        <!--选择yes则调用delproduct删除元素--> 
        <button class="btnbtn--m" id="btnmodalconfirm"@click="delproduct">yes</button> 
        <button class="btnbtn--m btn--red" id="btnmodalcancel"@click="delflag=false">no</button> 
       </div> 
      </div> 
     </div> 
    </div> 
    <!--遮罩层,整个都是通过delflag进行控制的,v-if根据表达式的真假条件渲染元素--> 
    <div class="md-overlay"v-if="delflag"></div> 
  
   </div> 
  </div> 
</body> 

对应的关键注释在代码中给出,下面结合vue.js的代码,对主要部分进行解释。 

一、vue组件基本格式

一个vue组件的基本代码如下:

new vue({ 
 el:'#app', 
 data: {}, 
 filters: {}, 
 mounted: function() {}, 
 methods: {} 
}); 

在js代码中,使用new vue即可声明一个vue组件。vue组件主要包括以下几个字段。
1.  el字段:el字段用来定义该组件在html中的哪个位置生效,需要传入html中某个元素的id值。这里传入了#app,表示html中id为app的元素内部都是这个vue组件的作用范围。
2. data字段:data字段定义了vue组件中的数据,可能在html中进行渲染。在本应用中,商品的价格、名称、图片链接等信息,都是使用vue组件中data字段内的数据进行渲染的。
3. filter字段:filter字段是一个过滤器,在本应用中,针对价格等需要格式化的文本,就可以使用filter进行过滤。
4. mounted字段:mounted字段通常定义一个方法,这个方法将在页面加载完成时自动执行,在react等框架中都有类似的机制。
5. method字段:method字段用来定义vue组件中需要用到的方法,这个字段的内容往往是需要投入时间最多的部分,例如页面中选择商品、增加数量等逻辑,都是在这个字段中进行编辑的。
以上就是一个vue组件的主要组成部分,下面对各个部分功能的代码编写进行简要介绍。 

二、数据渲染

数据渲染部分,要渲染的数据都存放在data中。每一个商品的信息都被模拟存储在了cart.json的文件中。我们可以实现数据自动加载,基本思路是:在method字段中定义一个方法,用来加载cart.json中的数据,并将其存放到data字段中定义的对应变量中。在mouted字段中,自动调用这个方法。这样就实现了页面加载完成后自动加载数据。对应的js代码和注释如下:

data: { 
  //存放商品json数据信息 
  productlist: [] 
 } 
methods: { 
   //cartview()方法用来加载数据,并将数据存储在这个vue组件中的productlist变量中 
   cartview: function() { 
    var _this = this; 
    //使用vue-resource模块加载数据,类似jquery中的ajax,返回数据存放在res.body中 
    this.$http.get("data/cartdata.json", {"id":123}).then(function(res) { 
     _this.productlist =res.body.result.list; 
     // _this.totalmoney = res.body.result.totalmoney; 
    }); 
} 
 } 
 mounted: function() {  
  //执行代码放在$nexttick中,保证页面结构加载完毕后再执行函数 
  this.$nexttick(function() { 
   this.cartview();  //使用this调用methods中定义的cartview()方法 
  }) 
 } 

完成了这部分代码,所有商品的数据就存放在了组件中变量名为productlist的字段中。
在前端html部分的进行调用,需要使用v-for指令。这个指令用来循环遍历vue中的数据,代码如下:

<ul class="cart-item-list"> 
 <li v-for="item in productlist"> 
  <div class="cart-tab-1"> 
   <div class="cart-item-check"> 
   </div> 
   <div class="cart-item-pic"> 
    <img v-bind:src="item.productimage" alt="烟"> 
   </div> 
   <div class="cart-item-title"> 
    <div class="item-name">{{ item.productname}}</div> 
   </div> 
   <div class="item-include"> 
    <dl> 
     <dt>赠送:</dt> 
     <dd v-for="part in item.parts"v-text="part.partsname"></dd> 
    </dl> 
   </div> 
  </div> 
</ul> 

通过v-for指令,遍历了变量productlist中的数据,并在内部的html中调用。利润item.productimage获取对应图片url地址;item.productname获取商品名称等。这样,就自动生成了一个商品信息列表。

下一部分将介绍逻辑代码的编写。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。