Vue框架开辟一个简单的购物车(Vue.js)

瑞星  金牌会员 | 2024-12-2 11:39:35 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 802|帖子 802|积分 2406

让我们使用所学知识来开辟一个简单的购物车
(记得暴露属性和方法!!!)
起首来看一下最基本的一个html框架
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>实战小项目:购物车</title>
  7.     <style>
  8.       body {
  9.           font-family: Arial, sans-serif;
  10.       }
  11.       .cart-item {
  12.           width: 50%;
  13.           margin-bottom: 15px;
  14.           padding: 10px;
  15.           border: 2px solid gray;
  16.           border-radius: 10px;
  17.           background-color: #ddd;
  18.       }
  19.       .buttons {
  20.           margin-top: 5px;
  21.       }
  22.       .buttons button {
  23.           padding: 5px 10px;
  24.           margin-right: 5px;
  25.           font-size: 16px;
  26.           cursor: pointer;
  27.           border: none;
  28.           border-radius: 3px;
  29.           background-color: pink;
  30.       }
  31.       .buttons input {
  32.           width: 25px;
  33.       }
  34.       .buttons button:hover {
  35.           background-color: yellow;
  36.       }
  37.       .quantity {
  38.           font-size: 18px;
  39.           font-weight: bold;
  40.           margin-left: 10px;
  41.       }
  42.       h1, h2 {
  43.           color: #333;
  44.       }
  45.   </style>
  46. </head>
  47. <body>
  48.     <div id="app">
  49.       <h1>实战小项目:购物车</h1>
  50.     <!-- 提示:可以使用v-for指令,假设有n个品类,则生成n个商品项-->
  51.     <div class="cart-item">
  52.         <div class="buttons">
  53.             <span>苹果 &nbsp;&nbsp;</span>
  54.             <button>-</button>
  55.             <span class="quantity">1&nbsp;&nbsp;</span>
  56.             <button>+</button>
  57.             <p>
  58.             请输入价格:
  59.             <input type="text"/> 元/斤 <br>
  60.             单价:
  61.             1 元/斤
  62.             </p>
  63.         </div>
  64.     </div>
  65.     <!-- 提示:可以用计算属性或数据变动侦听器,跟踪商品数和单价的变化,进而求出总数和总价-->
  66.     <h3>商品总数:  <ins> 1 </ins> 件</h3>
  67.     <h3>商品总价:  <ins> 1 </ins> 元</h3>
  68.     </div>
  69.     <script type="module">
  70.       import { createApp, reactive, computed } from './vue.esm-browser.js'
  71.         createApp({
  72.             setup() {
  73.                 // 1.定义属性:存储商品的(响应式)数组
  74.                 // 2.定义方法:增加商品数
  75.                 // 3.定义方法:减少商品数
  76.                 // 4.定义方法:计算商品总数
  77.                 // 5.定义方法:计算商品总价
  78.                 // 6.暴露属性和方法
  79.             }
  80.         }).mount('#app');
  81.     </script>
  82. </body>
  83. </html>
复制代码
结果如下:

目前是一个静态的一个网页
起首界说属性:存储商品的(响应式)数组(使用v-for遍历
  1.   <div class="cart-item" v-for="(item,index) in cartItems">
  2. const cartItems = reactive([
  3.                     { name: '苹果', quantity: 1, unit_price: 1 },
  4.                     { name: '香蕉', quantity: 1, unit_price: 1 },
  5.                     { name: '菠萝', quantity: 1, unit_price: 1 },
  6.                     
  7.                 ]);
复制代码

我们可以发现我们已经做出了三个链接,但是名字都是苹果,这个时候我们添加一个插值即可
  1. <span>{{item.name}}&nbsp;&nbsp;</span>
复制代码

那么我们如何控制商品的增长和淘汰呢
我们只必要界说一个函数 而且使用v-on的方法绑定即可,事件触发为点击
留意:在做淘汰按钮时,我们要通过if判定限定一下商品数,否则会出现负数
  1. <button v-on:click = "pre(index)">-</button>
  2. <span class="quantity">{{cartItems[index].quantity}} &nbsp;&nbsp;</span>
  3.   <button v-on:click = "next(index)">+</button>
  4. // 2.定义方法:增加商品数
  5.                   const next = (index) =>{
  6.                     cartItems[index].quantity ++;
  7.                     
  8.                  
  9.                   }                             
  10.                 // 3.定义方法:减少商品数
  11.                 const pre = (index) => {
  12.                     if ( cartItems[index].quantity>1) {
  13.                         cartItems[index].quantity --;
  14.                     }
  15.                     
  16.                                                }
复制代码

接着我们要计算商品的总数,那么该如何计算呢
可以用计算属性数据变更侦听器,跟踪商品数和单价的变化,进而求出总数和总价
  1.    <h3>商品总数:  <ins> {{totalItem()}} </ins> 件</h3>
  2. // 4.定义方法:计算商品总数
  3.                 const totalItem = () =>{
  4.                     let total_items = 0 ;
  5.                     for(const item of cartItems){
  6.                     total_items +=item.quantity;
  7.                    }
  8.                    return total_items
  9.                 }
复制代码

计算完总数,我们就该来计算总价了,同理可得使用computer计算属性,界说一个变量,在函数内里写一个for遍历即可(输入框内里属于写一个双向绑定v-model从而实现单价变化总价随着变化)
  1.         <input type="text" v-model="cartItems[index].unit_price"> 元/斤 <br>
  2. <h3>商品总价:  <ins> {{totalprice}} </ins> 元</h3>
  3.    // 5.定义方法:计算商品总价
  4.                const totalprice = computed(()=>
  5.                     {
  6.                     let total_price = 0;  
  7.                     for(const money of cartItems){  
  8.                         total_price += money.unit_price*money.quantity;  
  9.                     }
  10.                     return total_price  
  11.                 })
复制代码

如许我们一个简单的购物车便开辟成功啦
完备代码如下:

  1. <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>实战小项目:购物车</title>    <style>      body {          font-family: Arial, sans-serif;      }      .cart-item {          width: 50%;          margin-bottom: 15px;          padding: 10px;          border: 2px solid gray;          border-radius: 10px;          background-color: #ddd;      }      .buttons {          margin-top: 5px;      }      .buttons button {          padding: 5px 10px;          margin-right: 5px;          font-size: 16px;          cursor: pointer;          border: none;          border-radius: 3px;          background-color: pink;      }      .buttons input {          width: 25px;      }      .buttons button:hover {          background-color: yellow;      }      .quantity {          font-size: 18px;          font-weight: bold;          margin-left: 10px;      }      h1, h2 {          color: #333;      }  </style></head><body>    <div id="app">      <h1>实战小项目:购物车</h1>    <!-- 提示:可以使用v-for指令,假设有n个品类,则天生n个商品项-->    <div class="cart-item" v-for="(item,index) in cartItems">        <div class="buttons">            <span>{{item.name}}&nbsp;&nbsp;</span>            <button v-on:click = "pre(index)">-</button>            <span class="quantity">{{cartItems[index].quantity}}   </span>            <button v-on:click = "next(index)">+</button>            <p>            请输入价格:            <input type="text" v-model="cartItems[index].unit_price"> 元/斤 <br>             单价:            1 元/斤            </p>        </div>    </div>    <!-- 提示:可以用计算属性或数据变更侦听器,跟踪商品数和单价的变化,进而求出总数和总价-->    <h3>商品总数:  <ins> {{totalItem()}} </ins> 件</h3>    <h3>商品总价:  <ins> {{totalprice}}</ins> 元</h3>    </div>    <script type="module">      import { createApp, reactive, computed } from './vue.esm-browser.js'        createApp({            setup() {                // 1.界说属性:存储商品的(响应式)数组                 const cartItems = reactive([                    { name: '苹果', quantity: 1, unit_price: 1 },                    { name: '香蕉', quantity: 1, unit_price: 1 },                    { name: '菠萝', quantity: 1, unit_price: 1 },                                    ]);                // 2.界说方法:增长商品数                  const next = (index) =>{                    cartItems[index].quantity ++;                                                       }                                             // 3.界说方法:淘汰商品数                const pre = (index) => {                    if ( cartItems[index].quantity>1) {                        cartItems[index].quantity --;                    }                                                                   }                // 4.界说方法:计算商品总数                   const totalItem = () =>{                    let total_items = 0 ;                    for(const item of cartItems){                    total_items +=item.quantity;                    }                   return total_items                }                // 5.界说方法:计算商品总价                const totalprice = computed(()=>                    {                    let total_price = 0;                     for(const money of cartItems){                          total_price += money.unit_price*money.quantity;                      }                    return total_price                   })                         // 6.暴露属性和方法                return {                    cartItems,                    pre,                    next,                    totalItem,                    totalprice,                };            },        }).mount('#app');    </script></body></html>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表