|  | 本文参考《精通Vue.js:Web前端开发技术详解》,作者:孙卫琴,清华大学出版社出版 
 对于购物网站应用,需要在前端管理购物车。购物车中包含了所选购的商品的名字、数量、单价和小计(数量*单价)的信息,还包含了所有选购商品的总金额的信息。用户可以修改选购商品的数量,还可以删除选购的商品。
 
 例程1的shoppingcart.html实现了购物车。cartItems数组变量表示用户选购的所有商品条目。在模板中通过v-for指令来遍历cartItems数组变量:
 | <tr v-for="(item,index) in cartItems">……</tr> | 
 cartItems数组中的每个商品条目表示一个商品的具体购买信息,在购物车网页上会显示商品的具体购买信息:
 (1)序号:{{index+1}}
 (2)名称:{{item.name}}
 (3)价格:{{ currency(item.price,2) }}
 (4)数量:{{item.count}}
 (5)小计:{{ currency(item.count*item.price,2) }}
 以上currency()方法用于对金额数字进行格式化,保留两位小数,并且会在数字开头加上货币符号“¥”。
 在遍历了cartItems数组中的所有商品后,还会在网页上显示所有选购商品的总金额:
 
 
 | 总金额:{{ currency( total,2 ) }} | 
 以上total是计算属性,它的定义如下:
 
 
 | computed:{ total(){  //计算属性total表示总金额
 var sum=0;
 for(let i=0;i<this.cartItems.length;i++){
 sum+=parseFloat(this.cartItems[i].price)
 *parseFloat(this.cartItems[i].count)
 }
 return sum
 }
 }
 | 
 以上total()函数遍历cartItems数组变量,计算所有选购商品的总金额。由于total()函数依赖cartItems数组变量,因此当用户在网页上修改了cartItems数组变量中商品的购买数量,或者删除了某个商品时,Vue框架就会调用total()函数,从而同步更新total计算属性的值。
 
 例程1  shoppingcart.html
 
 
 | <!DOCTYPE html> <html>
 <head>
 <meta charset="UTF-8">
 <title>购物车</title>
 <script src="vue.js"></script>
 </head>
 
 <body>
 <div id="cart">
 <table border="1" width="600" style="margin: 0 auto;">
 <tr>
 <th>序号</th>
 <th>名称</th>
 <th>价格</th>
 <th>数量</th>
 <th>小计</th>
 <th>操作</th>
 </tr>
 <tr v-for="(item,index) in cartItems">
 <td>{{index+1}}</td>
 <td>{{item.name}}</td>
 <td>{{ currency(item.price,2) }}</td>
 <td>
 <!--  递增数量的按钮 -->
 <button v-on:click="item.count<=0?0:item.count-=1">
 -
 </button>
 
 <!--  设置数量的输入框 -->
 <input type="text" v-model.number="item.count"
 @keyup="item.count=item.count<=0?0:item.count"/>
 
 <!--  递减数量的按钮 -->
 <button v-on:click="item.count+=1">+</button>
 </td>
 <td>{{ currency(item.count*item.price,2) }}</td>
 <td>
 <button @click="remove(index)">移除</button>
 </td>
 </tr>
 <tr>
 <td colspan="6" align="right">
 总金额:{{ currency( total,2 ) }}
 </td>
 </tr>
 </table>
 </div>
 
 <script>
 const vm= Vue.createApp({
 data() {
 return {
 cartItems:[
 {id:10001,name:'足球',price:105.5,count:10},
 {id:10002,name:'跳绳',price:8.8,count:2},
 {id:10003,name:'呼啦圈',price:21.6,count:5},
 ]
 }
 },
 
 computed:{
 total(){  //total计算属性表示总金额
 var sum=0;
 for(let i=0;i<this.cartItems.length;i++){
 sum+=parseFloat(this.cartItems[i].price)
 *parseFloat(this.cartItems[i].count)
 }
 return sum
 }
 },
 
 methods:{
 remove(index){  //删除购物车的一个商品
 if(confirm('你确定要删除吗?')){
 this.cartItems.splice(index,1)
 }
 },
 
 //对金额进行格式化
 //参数v表示需要格式化的金额
 //参数n表示需要保留的小数位数
 currency(v,n){
 if(!v){  //如果v为空,就退出
 return ""
 }
 //增加货币符号"¥",并且保留n位小数,默认保留2位小数
 return "¥"+v.toFixed(n||2)
 }
 }
 }).mount('#cart')
 
 </script>
 </body>
 </html>
 | 
 通过浏览器访问shoppingcart.html,会得到如图1所示的购物车网页。
 
   图1  shoppingcart.html的网页
 
 在shoppingcart.html的网页上增加或删除某个商品的数量,总金额以及小计会同步更新。如果移除某个商品,总金额也会同步更新。
 shoppingcart.html同时运用了插值表达式、方法和计算属性。从这个范例也可以总结出这些方式的使用场合:
 (1)对于简单的运算表达式,可以使用插值表达式,比如用{{ currency(item.count*item.price,2) }}表示商品的小计金额。
 (2)如果运算逻辑复杂,并且运算过程不通用,可以使用计算属性,例如用total计算属性表示总金额。
 (3)如果运算逻辑复杂,并且运算过程很通用,可以使用方法。例如用currency()方法对金额数字进行格式化。它的参数可以是商品单价、小计金额和总金额。
 从语义上来区分,计算属性具有特定的属性特征,例如total计算属性表示总金额。而方法实现了通用的运算功能,例如currency()方法可以对所有金额数字进行通用的格式化。
 
 
 
 
 
 
 
 程序猿的技术大观园:www.javathinker.net
 
 
 
 [这个贴子最后由 sunweiqin 在 2022-08-30 11:40:29 重新编辑]
 |  |