vue3简单购物车

简介: vue3简单购物车

css样式:

           * {
        padding: 0;
        margin: 0;
      }
      #shopping {
        width: 50%;
        height: 50px;
        border: 1px solid black;
        display: flex;
      }
      .shopping_inner {
        width: 25%;
        height: 100%;
        border: 1px solid black;
        display: flex;
        align-items: center;
        justify-content: center;
      }
      #commodity div {
        width: 50%;
        height: 50px;
        border: 1px solid black;
        display: flex;
      }
      .shopping_inner button {
        width: 25%;
        height: 55%;
      }
      #num {
        width: 100%;
        height: 100px;
      }
      #add {
        width: 100%;
        height: 100px;
      }
      #add button {
        width: 100px;
        height: 60%;
      }
      #hide input {
        width: 45%;
        height: 100%;
      }
      #hide button {
        width: 10%;
        border: none;
        outline: none;
      }
      #delete_inner input {
        width: 45%;
        height: 100%;
      }
      #delete_inner button {
        width: 10%;
        border: none;
        outline: none;
      }

html结构

<div id="shopping">
      <div class="shopping_inner">
        <b>名称</b>
      </div>
      <div class="shopping_inner">
        <b>价格</b>
      </div>
      <div class="shopping_inner">
        <b>数量</b>
      </div>
      <div class="shopping_inner">
        <b>操作</b>
      </div>
    </div>
    <div id="commodity">
      <div v-for="(item,index) in array" class="border_inner" :style="{'background-color':(item.number!=0?'red':'white')}">
        <div class="shopping_inner">
          {{item.name}}
        </div>
        <div class="shopping_inner">
          {{item.Price}}
        </div>
        <div class="shopping_inner">
          <button class="but" @click="cut(index)" v-show="item.number>0">-</button>
          {{item.number}}
          <button @click="add(index)">+</button>
        </div>
        <div class="shopping_inner">
          <button @click="edit(index)">编辑</button>&nbsp;
          <button @click="dele(index)">删除</button>
        </div>
      </div>
      <div id="num">
        <div class="shopping_inner">
        </div>
        <div class="shopping_inner">
          <span>总价格:</span>
          {{price_inner}}
        </div>
        <div class="shopping_inner">
          <span>总数量:</span>
          {{number_inner}}
        </div>
        <div class="shopping_inner">
        </div>
      </div>
      <button @click="hid">添加商品</button>
      <div id="hide" v-show="hi" style="width: 50%;height: 30px;">
        <input type="text" v-model="name">
        <input type="text" v-model="Price">
        <button @click="add_edd">添加</button>
        <button @click="cancel">取消</button>
      </div>
      <div id="delete_inner" style="width: 50%;height: 30px;background-color: red;" v-show="nonets">
        <input type="text" v-model="inner_name">
        <input type="text" v-model="Price_inner">
        <button @click="con(index)">确认</button>
        <button @click="del">取消</button>
      </div>
    </div>

js,vue行为:

<script type="text/javascript">
      let arr = Vue.createApp({
        data() {
          return {
            array: [{
              name: '商品一',
              Price: 14,
              number: 0
            }, {
              name: '商品二',
              Price: 15,
              number: 0
            }, {
              name: '商品三',
              Price: 20,
              number: 0
            }],
            price_inner: '0',
            number_inner: '0',
            hi: false,
            nonets: false,
            inde_inner: '0',
            Price_inner:'',
            inner_name:''
          };
        },
        methods: {
          // 加
          add(i) {
            arr.array[i].number++;
            arr.number_inner++;
            let arr_arr = 0;
            for (let p = 0; p < this.array.length; p++) {
              arr_arr += this.array[p].Price * this.array[p].number;
            }
            arr.price_inner = arr_arr;
            // console.log(arr_arr);
            if (this.array[i].number > 0) {
              this.array[i].backgroundColor = "rgba(255, 0, 0, 0.3)";
              console.log(i);
            }
          },
          // 减
          cut(p) {
            arr.array[p].number--;
            arr.number_inner--;
            let arr_arr = 0;
            for (let p = 0; p < this.array.length; p++) {
              arr_arr += this.array[p].Price * this.array[p].number
            }
            arr.price_inner = arr_arr;
            console.log(arr_arr);
          },
          hid() {
            this.hi = true;
          },
          // 添加
          add_edd() {
            // console.log(this.name);
            if (this.name != undefined && this.Price != undefined && this.name != '' && this.Price != '') {
              this.array.unshift({
                name: this.name,
                Price: this.Price,
                number: 0,
              })
              this.name = '';
              this.Price = '';
              this.hi = false;
            } else {
              alert('请输入商品');
              this.name = '';
              this.Price = '';
              this.hi = false;
            }
          },
          cancel() {
            this.name = '';
            this.Price = '';
            this.hi = false;
          },
          // 删除
          dele(a) {
            console.log(a);
            this.array.splice(a, 1)
            console.log(this.array);
            let arr_arr = 0;
            let arr_num = 0;
            for (let p = 0; p < this.array.length; p++) {
              arr_arr += this.array[p].Price * this.array[p].number;
              arr_num += this.array[p].number;
            }
            arr.price_inner = arr_arr;
            arr.number_inner = arr_num;
            console.log(arr_arr);
            console.log(arr_num);
            this.nonets = false;
          },
          // 编辑
          edit(a) {
            console.log(this.array[a]);
            this.nonets = true;
            this.inner_name = this.array[a].name;
            this.Price_inner = this.array[a].Price;
            this.inde_inner = a;
          },
          del() {
            this.nonets = false;
          },
          // 编辑确认
          con() {
            // console.log(this.inde_inner);
            this.array[this.inde_inner].name = this.inner_name;
            this.array[this.inde_inner].Price = this.Price_inner;
            this.nonets = false;
            let arr_arr = 0;
            let arr_num = 0;
            // for (let p = 0; p < this.array.length; p++) {
            //  arr_arr += this.array[p].Price * this.array[p].number;
            //  arr_num += this.array[p].number;
            // }
            for (let k in this.array) {
              console.log(this.array[k]);
                arr_arr += this.array[k].Price * this.array[k].number;
                arr_num += this.array[k].number;
            }
            arr.price_inner = arr_arr;
            arr.number_inner = arr_num;
            console.log(arr_arr);
            console.log(arr_num);
          }
        }
      }).mount('#commodity')
    </script>
相关文章
|
2月前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
147 64
|
2月前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
117 60
|
13天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
45 3
|
2月前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
41 8
|
2月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
34 1
|
2月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
45 1
|
2月前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
2月前
|
分布式计算 JavaScript 前端开发
vue学习第8章(vue的购物车案例)
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,正向全栈进发。本篇分享一个综合练习小demo,包括目录结构、HTML、JS及CSS代码,通过增删商品实现总价计算。关注我,获取更多前端知识!🎉🎉🎉
39 1
|
2月前
|
JavaScript 索引
Vue 3.x 版本中双向数据绑定的底层实现有哪些变化
从Vue 2.x的`Object.defineProperty`到Vue 3.x的`Proxy`,实现了更高效的数据劫持与响应式处理。`Proxy`不仅能够代理整个对象,动态响应属性的增删,还优化了嵌套对象的处理和依赖追踪,减少了不必要的视图更新,提升了性能。同时,Vue 3.x对数组的响应式处理也更加灵活,简化了开发流程。
|
2月前
|
JavaScript 前端开发 API
从Vue 2到Vue 3的演进
从Vue 2到Vue 3的演进
48 0

热门文章

最新文章