用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的 ...
随机推荐
- hdu-4990 Reading comprehension(快速幂+乘法逆元)
题目链接: Reading comprehension Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- python 基础之第十二天(re正则,socket模块)
In [14]: 'hello-wold.tar.gz'.split('.') Out[14]: ['hello-wold', 'tar', 'gz'] In [15]: import re In [ ...
- 深度学习之卷积神经网络(CNN)学习
1.卷积神经网络中卷积的核心意义是什么?每一组卷集核 权重是一个抽特征的滤波器, 从卷集核的角度抽取特征 2.卷积神经网络很好的特性参数共享机制每一个神经元固定一组a x b x c(图像的通道数) ...
- bzoj 5092 分割序列 —— 高维前缀和
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5092 首先,处理出异或前缀和 s[i],i 位置的答案就是 s[j] + s[j]^s[i] ...
- docker容器firewalld端口转发规则
docker容器firewalld端口转发规则 1.配置firewalld端口转发,要先打开端口转发,则需要先 #firewall-cmd --zone=public --add-maspuerade ...
- codevs-1205
1205 单词翻转 题目描述 Description 给出一个英语句子,希望你把句子里的单词顺序都翻转过来 输入描述 Input Description 输入包括一个英语句子. 输出描述 Output ...
- python--flask学习1
1 windows/unix得安装 http://www.pythondoc.com/flask-mega-tutorial/helloworld.html http://www.pythondoc. ...
- 常用模块 re模块与正则表达式
re模块 正则: 正则就是用一些具有特殊含义的符号组合到一起(称之为正则表达式)来描述字符或字符串的方法.或者说:正则就是用描述一类事物的规则.(在python中) 它内嵌在python中,并通过re ...
- 计算机图形学DDA画线法+中点画线法+Bresenham画线法
#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> ...
- E20181001-ts
decorate vt. 装饰; 点缀; 粉刷; 授予(某人)勋章 vi. 装饰; 布置;