购物车

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="./venders/bootstrap-3.3.7-dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="./css/index.css">
    <script src="Vue/vue.js"></script>
    <title>Document</title>
</head>

<body>

    <div class="covers">
    <div class="up-content">
   	<table class="table table-hover">
    <thead>
    <tr id="first">
    <td v-for="item of characters">{
  {item}}</td>
	</tr>
	</thead>
	 <tbody id="app">
     <tr v-for="(item,index) of lists" :key="index">
        <td>{
  {index}}</td>
        <td>{
  {item.bookName}}</td>
        <td>{
  {item.author}}</td>
        <td>
        	<button class="btn btn-primary" @click="minus(lists,index)">-</button>
        	<span class="count">{
  {item.counts}}</span>
        	<button class="btn btn-primary" @click="plus(lists,index)">+</button>
        </td>
                        <td class="price">{
  {item.price}}</td>
                        <td v-if="index%2==0"><button  class="btn btn-success" @click="del(lists,index)">删除</button></td>
                        <td v-if="index%2==1"><button class="btn btn-danger" @click="del(lists,index)">删除</button></td>
                    </tr>
                </tbody>
            </table>
           <p class="total">总价: ¥<span>{
  {sum}}</span></p>

        </div>

<div class="down-content">

            <p class="form-tit">添加书籍</p>
            <div class="form-group">
                <label for="exampleInputEmail1">书名</label>
                <input type="text" class="form-control" v-model="bookName" placeholder="">
            </div>
            <div class="form-group">
                <label for="exampleInputPassword1">作者</label>
                <input type="text" class="form-control" v-model="author" placeholder="">
            </div>
            <div class="form-group">
                <label for="exampleInputPassword1">单价</label>
                <input type="text" class="form-control" v-model.number="single" id="exampleInputPassword1"
                    placeholder="">
            </div>
            <div class="form-group">
                <label for="exampleInputPassword1">数量</label>
                <input type="text" class="form-control" v-model.number="counts" id="exampleInputPassword1"
                    placeholder="">
            </div>
            <button class="btn btn-primary btn-block" @click="add(lists,index)">添加</button>
            <button class="btn btn-success btn-block" @click="reset(lists,index)">重置</button>
        </div>
    </div>
    <script>
        //tr首行
        new Vue({
            el: '#first',         
            data: {
                characters: ["序号", "书名", "作者", "数量", "价格", "操作"]
            }
        })
        //其他行
        new Vue({
            el: ".covers",
         
            data: {
       	        index: 0,
                orders: "",
                bookName: "",
                author: "",
                counts: null,
                price: null,
                single:null,//单价
                singleArr:[],//单价数组
                totals:[],//总价数组
                countsArr :[],//数量数组
                priceArr :[],//小计数组
                lists: []//tr行渲染
            },
            methods: {
                add(val, index) {

                    if (this.bookName === '') {
                        alert('书名不能为空')
                    }
                    if (this.author === '') {
                        alert('作者不能为空')
                    }
                    if (typeof (this.single) != 'number') {
                        alert('价格为必须为数字且不能为空')
                    }
                    if (typeof (this.counts) != 'number') {
                        alert('数量必须为数字且不能为空')
                    }
                    else {
                        this.lists.push({
                            orders: this.index++,
                            bookName: this.bookName,
                            author: this.author,
                            counts: this.counts,
                            single:this.single,
                            price: this.single*this.counts
                        })                   
                        this.reset()
                       this.countsArr.push(this.lists[index].counts)
                       this.priceArr.push(this.lists[index].price)
                       this.singleArr.push(this.lists[index].single)
                         //总价数组 totals
                       var summation  = this.lists[index].counts*this.lists[index].price                                                       }               },
                reset() {
                    this.bookName = " "
                    this.author = " "
                    this.counts = " "
                    this.single = " "
                },
                del(val, index) {

                    this.lists.splice(index, 1)
                    this.priceArr.splice(index,1)
                    this.index--;//下标递减
                    // console.log(this.lists)
                    // console.log(index)

                },
                plus(val, index) {
                    this.lists[index].counts += 1
                    this.lists[index].price =  this.lists[index].counts*this.lists[index].single
                    this.priceArr.splice(index,1, this.lists[index].price)
                    // console.log(this.lists[index].price)
                    // console.log(this.lists[index].counts)
                    // console.log(this.lists[index].single)
                },
                minus(val, index) {
                    if (this.lists[index].counts > 0) {
                        this.lists[index].counts -= 1
                         this.lists[index].price =  this.lists[index].counts*this.lists[index].single
                         this.priceArr.splice(index,1, this.lists[index].price)
                    }
                }
            }, 
            computed:{
             sum(){                   
                    var res=  this.priceArr.reduce(function(accumulator,currentValue){
                        return accumulator+currentValue
                      },0)
                      return res//reduce求和后return出
                      console.log(res)
                }                
           }
        })
    </script>
</body>
</html>

总结与坑:

  • 组件在使用有标签嵌套规则时,被嵌套的组件不能够直接加载或会影响结构需要使用is绑定方式来加载组件,但是不推荐这样去使用 ,所以table下循环嵌套tr这种就别用组件啦

  • vue的组件只能有一个根节点,即*.vue*文件中的 template标签下只能有一个子元素。

  • 数组reduce方法:

    • array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

    • total:必须,初始值,或者计算后的返回值

    • currentValue:必须,当前元素

    • currentIndex:可选,当前元素的索引值

    • arr:可选,当前元素所属的数组对象

    • InitialValue:可选,传递给数组的初始值

      返回值为计算的结果

    • 求数组项之和

      var sum = arr.reduce(function (prev, cur) {
             
          return prev + cur;
      },0);
      
    • 求数组项最大值

      var max = arr.reduce(function (prev, cur) {
             
          return Math.max(prev,cur);
      });
      
    • 数组去重

      var newArr = arr.reduce(function (prev, cur) {
             
          prev.indexOf(cur) === -1 && prev.push(cur);
          return prev;
      },[]);
      
  • computed内的结果记得要return出,特别是函数套函数,都要return

  • del(val, index) {

                    this.lists.splice(index, 1)
                    this.priceArr.splice(index,1)
                    this.index--;//下标递减
                    // console.log(this.lists)
                    // console.log(index)
    
                },
               //下标递减,否则删除项后,其后的索引值会乱
    
  •   <td v-if="index%2==0"><button  class="btn btn-success" @click="del(lists,index)">删除</button></td>
      <td v-if="index%2==1"><button class="btn btn-danger" @click="del(lists,index)">删除</button></td>
                使用了v-if指令,做奇偶变色
    
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务