用vue.js重构订单计算页面
在很久很久以前做过一个很糟糕的订单结算页面,虽然里面各区域(收货地址)使用模块化加载,但是偶尔会遇到某个模块加载失败的问题导致订单提交的数据有误。
大致问题如下:
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重构订单计算页面的更多相关文章
- vue.js初探:计算属性和methods
在vue.js中,计算属性和methods方法的函数相同时,两者的最终执行结果都是相同的.然而不同的是,计算属性是基于它的依赖缓存.计算属性只有在它的相关依赖发生改变时才会重新取值.这就意味着只要 m ...
- Vue.js学习 Item5 -- 计算属性computed与$watch
在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作.模板是为了描述视图的结构.在模板中放入太多的逻辑会让模板过重且难以维护.这就是为什么 Vue.js 将绑定表达式限制为一个表达式.如果需 ...
- vue.js数据可以在页面上渲染成功却总是警告提示某个字段“undefined”未定义
最近在开发公司的一个后端管理系统,用的是比较流行的vue框架.在开发过程中,总是出现各种各样的报错问题,有警告的,有接口不通的,有自己马虎造成的低级错误的等等,这些错误在一些老司机面前分分钟解决,但今 ...
- 使用vue.js + laravel开发单页面应用
最近学了vuejs和laravel,然后顺便就撸了简单的demo,这里将会根据这个demo介绍下如何使用vuejs+laravel开发一个简单的单页面应用,demo的github地址是https:// ...
- Vue.js系列之四计算属性和观察者
一.计算属性 1.模版内的表达式非常便利,但是设计它们的初衷是用于简单计算的.在模版中放入太多的逻辑运算会让模版过重且难以维护,例如如下代码: <div id="example&quo ...
- vue.js使用之计算属性与方法返回的差别
<!DOCTYPE html> <html> <head> <script src="https://unpkg.com/vue@2.4.2&quo ...
- vue.js 使用 vue-router 修改页面标题
module.exports = { name: 'myComponent', data: {} route{ data: function(){ document.title = "页面标 ...
- vue.js 跳转同一页面,传不同值,组件监听路由
watch: { '$route' () { this.type = this.$route.params.type this.loadData() } },
- webpack配合vue.js实现完整的单页面demo
本篇文章主要是我在开发前研究了webpack+vue.js的单页面应用,因为需要用到node的npm,所以确保安装了node,建议官网安装最新的稳定版本.并且在项目中需要加载一些npm包,由于npm的 ...
随机推荐
- PS 图像滤镜— — USM 锐化
这个算法的原理很简单,就是先用高斯模糊获取图像的低频信息,然后用原图减去高斯模糊之后的图,得到图像的高频信息,再将原图与高频信息融合,进一步增强原图的高频信息,看起来,图像的边缘显得特别的sharp. ...
- Oracle中的关键字
NVL和COALESCE的区别: nvl(COMMISSION_PCT,0)如果第一个参数为null,则返回第二个参数如果第一个参数为非null,则返回第一个参数 COALESCE(EXPR1,EXP ...
- 自己实现c++中string 类
class String { public: String(const char *str = NULL);// 普通构造函数 String(const String &other);// 拷 ...
- Mysql数据库--语句整理/提升/进阶/高级使用技巧
一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备 ...
- bzoj 2836 魔法树——树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2836 树剖裸题.然而WA.RE了好久…… 原来是跳 top 的那个地方! top 不相等的时 ...
- Unity4.0配置
关于Unity4.0的使用: 一 安装Unity 在程序包管理器控制台输入命令:Istall-Pckage unity.mvc安装后会在App_Start中生成UnityConfig.cs 和Unit ...
- Hibernate的session.createSQLQuery的几种查询方式
当我们用HQL进行子查询的时候,如select * from Tree where pid in (select id from Tree,此时HIBERANTE就会报错,说什么*号错误之类的.但如果 ...
- 3-3 浮点型字面量 & 3-4浮点型案例
双精度的浮点类型,末尾加d或者D 3-4浮点型案例 如果一个浮点类型的末尾什么也不写 他表示就是一个double类型的.所以这里定义报错了. float f=1234.328; 把一个范围大的数赋值给 ...
- 创建Sitemap文件供搜索引擎使用
以下内容转载自 http://www.cnblogs.com/webtrados/archive/2009/12/29/1635305.html 如何创建Sitemap文件 Sitemap的格式有XM ...
- Uncaught TypeError: window.showModalDialog is not a function 谷歌
//新版本谷歌没有window.showModalDialog,创建一个window.openif(window.showModalDialog == undefined){ window.showM ...