美文网首页
项目第二天购物车

项目第二天购物车

作者: 蜗牛和曼巴 | 来源:发表于2018-10-19 21:47 被阅读0次

    一。点击购物车存放在本地
    1.给添加购物车按钮绑定一个监听@click事件
    2.发送请求
    3.在发送请求里创建一个对象来存储加入购物车需要的字段,字段看购物车页面里有什么,然后根据请求数据打印出来的添加,比如下面的代码

    let tempObj = {
                id: this.id,
                title: this.goodsDesc.title,
                price: this.goodsDesc.sell_price,
                img: 'res.message.thumb_path',
                selectState: true,
                num: 1
              }    //写在请求数据中
    

    4.先从localStorage里拿到购物车的数据,然后再看当前要添加的商品ID有没有存放在里面,如果有直接给那个商品的num+1,如果没有就存到本地中

     let cartlist = JSON.parse(localStorage.getItem('cartlist') || '[]')   //因为本地存储的都是字符串,所以先把它转出对象
    

    5.findIndex方法会去数组中找满足条件的数组项的索引,如果找到就返回数组项在数组中对应的索引值,如果没有找到就返回-1

    let idx = cartlist.findIndex(item => item.id === this.id)
              if (idx === -1) {
                // 不存在就直接存到数组中
                cartlist.push(tempObj)
                localStorage.setItem('cartlist', JSON.stringify(cartlist))
              } else {
                // 给找到的那个数组项中的num + 1
                cartlist[idx].num += 1
                localStorage.setItem('cartlist', JSON.stringify(cartlist))
              }
    

    二。购物车页面结算
    1.先将本地存储中的数据取出来放到页面中

     created () {
        // 1.先将本地存储中的数据取出来放到页面上
        this.cartlist = JSON.parse(localStorage.getItem('cartlist') || '[]')
      }
    return {
          cartlist: []
        }
    

    2.渲染

     <div class="empty-cart" v-if="cartlist.leght===0">
     <div class="cart-container" v-else>
    然后循环要循环的
    
    3. 搜狗截图20181019225343.png

    3.1在data外面定义一个计算函数

     computed: {
      //  2.创建获取结算总数量的计算属性
        totalNum () {
          let total = 0
          return total
        }
      }
    结算({{totalNum}})   //记得在结算结构中加上这些
    

    3.2增加结算那里的数字

      // 1.2.1 循环数组,将数组中selectState为true的那些项的num取出来,加给total这个变量
          this.cartList.map(item => {
            if (item.selectState) {
              total = total + item.num
            }
     })
    
    4. 02.png

    跟3.1一样写在计算属性中

    totalPrice () {
          let price = 0
          // 1.3.1 循环数组,将数组中selectState为true的那些项的总价取出来,加给price这个变量
          this.cartList.map(item => {
            if (item.selectState) {
              price = price + item.num * item.price
            }
          })
          return price
        }
    

    5.给是否选中按钮添加点击事件,切换其选中状态

    <span class="iconfont toogle" :class="item.selectState ? 'icon-checkbox-marked-circ' : 'icon-checkbox-blank-circle-outline'" @click="toggleState(index)"></span>
    

    5.1定义方法

    methods: {
        // 切换选中状态
        toggleState (idx) {
          // 1.4 根据索引切换数组项中的选中状态
          this.cartList[idx].selectState = !this.cartList[idx].selectState
        }}
    

    6.创建一个是否能够全选的计算属性

        isSelectAll () {
          // 循环数组,只要有一个为false,那就将这个计算属性设置为false
          let slectAll = true
          this.cartList.map(item => {
            if (item.selectState === false) {
              slectAll = false
            }
          })
          return slectAll
        }
    

    6.1根据计算属性isSelectAll动态添加全选的样式

     <span class="iconfont toogle" :class="isSelectAll ? 'icon-checkbox-marked-circ' : 'icon-checkbox-blank-circle-outline'"></span>
    

    6.2给全选按钮绑定事件,点击时让它全选

    //  全部选中
        handleSelectAll () {
          // 1.9 将isSelectAll 用一个变量缓存起来
          let isAll = this.isSelectAll
          this.cartList.map(item => {
            item.selectState = !isAll
          })
        }
    

    三.商品的增加和减少
    1.给相加相减添加函数

    @click="handleNum(index, -1, 'minus')  //减的加‘minus’
    

    2.函数

     handleNum (index, count, type) {
          // 根据索引找到操作的那一项,将传递进来的num加给对应数组项的num
          // 当在操作减数量的时候,如果num为1,要将这一项删掉
          if (this.cartList[index].num === 1 && type === 'minus') {
            MessageBox.confirm('确定执行此操作?').then(action => {
              // 点击确定,删除那一项
              this.cartList.splice(index, 1)
              return false
            }).catch(err => {
              console.log(err)
            })
          } else {
            this.cartList[index].num += count
          }
        }
    

    四。购物车数量
    1.在底部导航那个组件中,定义一个计算属性

    computed: {
          totalNum () {
            let total = 0
            // 1.2.1 循环数组,将数组中selectState为true的那些项的num取出来,加给total这个变量
            this.cartlist.map(item => {
              if (item.selectState) {
                total = total + item.num
              }
            })
            return total
          }
        }
    

    2.在结构数量那里插值

    {{totalNum}}
    

    3.将本地存储的数据拿到页面中来

    // 这里不能用created,因为在cart组件中beforeDestroy要晚,用mounted
    created () {
        // 1.先将本地存储中的数据取出来放到页面上
        this.cartlist = JSON.parse(localStorage.getItem('cartlist') || '[]')
      }
    

    4.在data中定义一个空的数组

    cartlist:[]
    

    5.在cart组件中

    // 在beforeDestroy生命周期函数中,统一处理更新后的数据,将他们更新到本地中
      beforeDestroy () {
        localStorage.setItem('cartlist', JSON.stringify(this.cartlist))
      }
    

    五。商品详情的购物车数量

    定义一个计算属性//
     computed: {
        totalNum () {
          let total = 0
          // 1.2.1 循环数组,将数组中selectState为true的那些项的num取出来,加给total这个变量
          this.cartlist.map(item => {
            if (item.selectState) {
              total = total + item.num
            }
          })
          return total
        }
      }
    

    2.在相应的地方插值

    {{totalNum}}
    

    3.在findIDex方法中

    this.cartlist.push(tempObj)   //如果没有就存进去
    this.cartlist[idx].num += 1   //如果有就+1
    

    相关文章

      网友评论

          本文标题:项目第二天购物车

          本文链接:https://www.haomeiwen.com/subject/aanuzftx.html