在很久很久以前做过一个很糟糕的订单结算页面,虽然里面各区域(收货地址)使用模块化加载,但是偶尔会遇到某个模块加载失败的问题导致订单提交的数据有误。

大致问题如下:

1. 每个模块都采用usercontrol(收货地址、配送范围、支付方式、优惠券等等),维护起来很困难。

2. 每个模块的加载都是一个Ajax请求,并且根据前后顺序关系加载多个模块即多个Ajax请求。比如用户修改收货地址后系统重新计算配送方式和支付方式,并刷新配送方式、支付方式、订单总金额等数据,一般情况下没问题,但偶尔会遇到某个模块加载失败导致页面数据显示不正确。

所以必须要重构订单结算页面,使用模版引擎或Vue.js,这里就采用Vue.js重构页面。

订单结算页的页面区域模块大致如下:

<div class="order-form">
<div>收货地址区域</div>
<div>配送范围区域</div>
<div>支付方式区域</div>
<div>优惠券区域</div>
<div>商品列表区域</div>
<div>金额汇总区域</div>
</div>

根据页面区域定义数据模型,大致如下:

AddressList:用户收货地址列表
DeliveryList:配送方式
PaymentList:支付方式
DefaultAddress:用户默认收货地址

其他数据用于提交表单或页面显示金额用,就不介绍了。

初始化Vue对象

var model = {};

var vue = new Vue({
el: '.order-form',
data: model,
computed: {
},
methods : {
}
});

收货地址

view

    <ul>
<template v-if="AddressList.length">
<li v-for="(address,index) in AddressList">
<label>
<input type="radio" name="addressId" :value="address.AddressId" v-model="AddressId" :checked="address.AddressId == AddressId" />
{{ address.Address }}
</label>
</li>
</template>
<template v-else>
暂无收货地址
</template>
<li>
<a href="javascript:;" v-on:click="addressAdd">新建收货地址</a>
</li>
</ul>

其中v-model 采用的是双向数据绑定,它会根据控件类型自动选取正确的方法来更新model.AddressId。

view里绑定事件用v-on:事件名称

vue添加增加收货地址事件,这是Demo就写个简单的例子,建议用Ajax弹出层让用户填写收货地址。

    methods : {
addressAdd : function(){
model.AddressList.push({AddressId : mode.AddressList.length + 1, Address : "随机添加的收货地址" + math.random()});
}
}

效果如下:

配送方式:

View代码:

<li v-for="(delivery,index) in DeliveryList">
<label>
<input type="radio" name="deliveryId" :value="delivery.DeliveryId" v-bind:checked="delivery.DeliveryId == DeliveryId"
v-on:click="deliverySelect(delivery)" />
  {{ delivery.DeliveryName }}(运费:¥{{ delivery.DeliveryFee }})
</label>
</li>

Vue代码:

deliverySelect :function(delivery){
model.DeliveryId = delivery.DeliveryId;
model.DeliveryFee = delivery.DeliveryFee;
},

效果如下:

订单金额显示:

View:

<div class="all_price">
订单总金额:
<b>¥{{ orderAmount }}</b>
= 商品总金额:
<b>¥{{ ProductAmount }}</b>
+ 运费:
<b>¥{{ DeliveryFee }}</b>
- 优惠券:
<b>¥{{ CouponAmount }}</b>
</div>

Vue代码:

computed: {
orderAmount : function(){
return this.ProductAmount + this.DeliveryFee - this.CouponAmount;
}
},

其他部分代码以此类推,就是绑定数据和事件就可以。

用vue.js重构订单计算页面的更多相关文章

  1. vue.js初探:计算属性和methods

    在vue.js中,计算属性和methods方法的函数相同时,两者的最终执行结果都是相同的.然而不同的是,计算属性是基于它的依赖缓存.计算属性只有在它的相关依赖发生改变时才会重新取值.这就意味着只要 m ...

  2. Vue.js学习 Item5 -- 计算属性computed与$watch

    在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护.这就是为什么 Vue.js 将绑定表达式限制为一个表达式.如果需 ...

  3. vue.js数据可以在页面上渲染成功却总是警告提示某个字段“undefined”未定义

    最近在开发公司的一个后端管理系统,用的是比较流行的vue框架.在开发过程中,总是出现各种各样的报错问题,有警告的,有接口不通的,有自己马虎造成的低级错误的等等,这些错误在一些老司机面前分分钟解决,但今 ...

  4. 使用vue.js + laravel开发单页面应用

    最近学了vuejs和laravel,然后顺便就撸了简单的demo,这里将会根据这个demo介绍下如何使用vuejs+laravel开发一个简单的单页面应用,demo的github地址是https:// ...

  5. Vue.js系列之四计算属性和观察者

    一.计算属性 1.模版内的表达式非常便利,但是设计它们的初衷是用于简单计算的.在模版中放入太多的逻辑运算会让模版过重且难以维护,例如如下代码: <div id="example&quo ...

  6. vue.js使用之计算属性与方法返回的差别

    <!DOCTYPE html> <html> <head> <script src="https://unpkg.com/vue@2.4.2&quo ...

  7. vue.js 使用 vue-router 修改页面标题

    module.exports = { name: 'myComponent', data: {} route{ data: function(){ document.title = "页面标 ...

  8. vue.js 跳转同一页面,传不同值,组件监听路由

    watch: { '$route' () { this.type = this.$route.params.type this.loadData() } },

  9. webpack配合vue.js实现完整的单页面demo

    本篇文章主要是我在开发前研究了webpack+vue.js的单页面应用,因为需要用到node的npm,所以确保安装了node,建议官网安装最新的稳定版本.并且在项目中需要加载一些npm包,由于npm的 ...

随机推荐

  1. Opencv— — water wave

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  2. [USACO 2008 MAR] 土地购买

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1597 [算法] 首先将所有土地按长为第一关键字 , 宽为第二关键字排序 显然 , 当 ...

  3. ubuntu 下串口调试工具 minicom安装与配置

    检查系统是否支持USB转串口: lsmod | grep usbserial 如果有usbserial,说明系统支持USB转串口. 识别串口设备: 插上USB转串口,在终端输入命令: #dmesg | ...

  4. 转:ubuntu下安装ssh服务

    本文内容来自 http://www.cnblogs.com/chen1987lei/archive/2010/12/02/1894768.html ========================= ...

  5. npm安装cnpm淘宝镜像

      npm set registry https://registry.npm.taobao.org # 注册模块镜像 npm set disturl https://npm.taobao.org/d ...

  6. bzoj1941

    KD-tree **了这道题 这个估价函数好鬼畜,把min打成max... 关于min的估价函数非常鬼畜,具体我也不知道为什么. #include<bits/stdc++.h> using ...

  7. CodeForces 1098D. Eels

    题目简述:对一个非空正整数(可重)集合$S$,从中选出两个元素$a, b (a \leq b)$,将他们从$S$中删除并将$a+b$加入$S$,重复这个操作直到$S$中只剩下一个元素为止,称为一次[竞 ...

  8. 【Data Structure & Algorithm】字符串全排列

    字符串全排列 题目:输入一个字符串,打印出该字符串的所有排列.例如输入字符串abc,则输出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab.cba. 分析:考察对递归的理 ...

  9. 64位Win7中7zip无法关联文件的问题

    问题1:win7x64中安装了7zip,在解压文件右键打开无法关联文件. 解决方法1:在开始菜单中打开7-zip File Manage->工具 ->选项 ->7-zip 勾选“添加 ...

  10. ZOJ3321,ZOJ3317

    ZOJ3321 //there is at most one edge between two nodes. 因为这句话的局限性,又要满足环,那么一定是每个点度为2,然后为n节点的一个环 //#inc ...