14-案例:购物车

这篇具有很好参考价值的文章主要介绍了14-案例:购物车。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 综合案例-购物车

需求说明:

        1. 渲染功能

                v-if/v-else v-for :class

        2. 删除功能

                点击传参 filter过滤覆盖原数组

        3. 修改个数

                点击传参 find找对象

        4. 全选反选

                计算属性computed 完整写法 get/set

        5. 统计 选中的 总价 和 数量

                计算属性conputed reduce条件求和

        6. 持久化到本地 

                watch监听,localStorage, JSON.stringfiy, JSON.parse文章来源地址https://www.toymoban.com/news/detail-660180.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .active {
            background-color: azure;
        }
    </style>

</head>

<body>
    <div id="app">
        <!-- 顶部banner -->
        <div><img></div>
        <!-- 面包屑 -->
        <div></div>

        <!-- 购物车主体 -->
        <div v-if="fruitList.length > 0">
            <div>
                <!-- 头部 -->
                <div>
                    <div>

                    </div>
                </div>
                <!-- 身体 -->
                <div>
                    <div v-for="(item,index) in fruitList" :key="item.id" :class="{active:item.isChecked}">
                        <div><input type="checkbox" v-model="item.isChecked"></div>
                        <div><img width="100px" height="50px" :src="item.icon"></div>
                        <div>{{item.price}}</div>
                        <div>
                            <div>
                                <!-- :disabled: 禁用 -->
                                <button :disabled="item.num<=1" @click="sub(item.id)">-</button>
                                <span>{{item.num}}</span>
                                <button @click="add(item.id)">+</button>
                            </div>
                        </div>
                        <div>{{ item.num * item.price }}</div>
                        <div><button @click="del(item.id)">删除</button></div>
                    </div>

                </div>
            </div>
            <!-- 底部 -->
            <div>
                <!-- 全选 -->
                <label>
                    <input type="checkbox" v-model="isAll">全选
                </label>
                <div>
                    <!-- 所有商品总价 -->
                    <span>总价:{{totalPrice}} </span>
                    <!-- 结算按钮 -->
                    <button>结算({{totalCount}})</button>
                </div>
            </div>
        </div>
        <!-- 空车 -->
        <div v-else>空空如也</div>

    </div>


    <script src="https://cdn.jsdelivr.net/npm/vue@2.7.14/dist/vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

    <script>
        // 购物车的默认值
        const defaultArr = [
                    {
                        id: 1,
                        icon: 'http://autumnfish.cn/static/火龙果.png',
                        isChecked: true,
                        num: 2,
                        price: 6
                    }, {
                        id: 2,
                        icon: 'http://autumnfish.cn/static/荔枝.png',
                        isChecked: false,
                        num: 7,
                        price: 20
                    }, {
                        id: 3,
                        icon: 'http://autumnfish.cn/static/榴莲.png',
                        isChecked: true,
                        num: 10,
                        price: 50
                    },
                ]
        const app = new Vue({

            el: '#app',
            data: {
                // 水果列表,从本地缓存读取,|| []: 初始值,一般都是空数组
                fruitList:  JSON.parse(localStorage.getItem("list")) || defaultArr,
            },
            computed: {
                // 默认计算属性:只能获取不能设置,要设置需要写完整的写法
                // isAll(){
                //     // 必须所有的小选框都选中,全选按钮才选中 -> every
                //     return  this.fruitList.every(item => item.isChecked === true)
                // }

                // 完整写法 = get + set
                isAll:{
                    get(){
                    return  this.fruitList.every(item => item.isChecked === true)

                    },
                    set(value){
                        // 基于拿到的布尔值,要让所有的小选框,同步状态
                        this.fruitList.forEach(item => item.isChecked = value)
                    }
                },
                // 统计选中的总数 reduce
                totalCount(){
                    return this.fruitList.reduce((sum,item) => {
                        if (item.isChecked){
                            // 选中 -> 需要累加
                            return sum + item.num
                        }else{
                            // 没选中 -> 不需要累加
                            return sum
                        }
                    },0)
                },
                // 统计选中的总价 num * price
                totalPrice(){
                    return this.fruitList.reduce((sum,item) => {
                        if (item.isChecked){
                            return sum + item.num * item.price
                        }else{
                            return sum
                        }
                    },0)
                }

            },

            methods: {
                del(id) {
                    this.fruitList = this.fruitList.filter(item => item.id != id)
                },
                sub(id) {
                    // 1. 根据ID找到数组中的对应项 -> find
                    const fruit = this.fruitList.find(item => item.id === id)

                    //2. 操作 num 数量
                    fruit.num--

                },
                add(id) {
                    // 1. 根据ID找到数组中的对应项 -> find
                    const fruit = this.fruitList.find(item => item.id === id)

                    //2. 操作 num 数量
                    fruit.num++
                }
            },

             // 缓存到本地
             watch:{
                fruitList:{
                    deep: true,
                    handler(newValue){
                        // 需要将变化后的 newValue 存入本地 (转json)
                        localStorage.setItem("list",JSON.stringify(newValue))
                    }
                }
            }
           
        })

    </script>


</body>

</html>

到了这里,关于14-案例:购物车的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue入门三(表单控制|购物车案例|v-model进阶|与后端交互|计算属性|监听属性|Vue生命周期)

    v-model双向数据绑定,还可以对输入框数据进行一定的限定。 v-modle 释义 lazy 等待input框的数据绑定时区焦点之后再变化 number 以数字开头并只保留后面的数字,不保留字母;字母开头都保留 trim 去除首位的空格 与后端交互统一使用json编码格式 与后端交互涉及到跨域问题后,

    2024年01月21日
    浏览(35)
  • itheima苍穹外卖项目学习笔记--Day7:缓存商品 / 购物车

    通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: 每个分类下的菜品保存一份缓存数据 数据库中菜品数据有变更时清理缓存数据 修改用户端接口 DishController 的 list 方法,加入缓存处理逻辑 修改管理端接口 DishController 的相关方法,加入清理缓存的逻辑,需要

    2024年02月16日
    浏览(34)
  • [gtp]购物车案例参考

    react hooks,购物车案例. 在列表上点击+或者-更新数量,调用接口更新单个价格. 点击table的checkbox勾选后,计算总价? 对于React Hooks和购物车案例,您可以使用useState来管理列表中商品的数量和总价。当点击\\\"+“或”-\\\"按钮时,可以更新相应商品的数量,并通过调用接口来更新单个商品

    2024年02月13日
    浏览(22)
  • 基于jQuery------购物车案例

    目录 基于jQuery------购物车案例 案例:购物车案例模块-增减商品数量分析 案例:购物车案例模块-修改商品小计分析  案例:购物车案例模块-计算总计和总额 案例:购物车案例模块-删除商品模块  案例:购物车案例模块-选中商品添加背景 html  js css  效果  ① 核心思路:首

    2024年02月02日
    浏览(26)
  • javascript+css+html购物车案例

    javascript代码部分主要实现三部分功能  1、商品数量增加(减少)同时小计增加(减少) 这部分主要是通过for循环给增加(减少)按钮绑定点击事件 1)点击后计数器自增(自减) 2)计数器数量*对应商品单价 赋值给对应商品小计(涉及到数据类型转换) parseInt(\\\'12ccc\\\' ) →

    2024年02月02日
    浏览(55)
  • JavaWeb(10)——前端综合案例4(购物车示例)

           购物车需要展示一个已加入购物车的商品列表,包含商品名称、商品单价、购买数量和操作 等信息,还需要实时显示购买的总价。其中购买数量可以增加或减少,每类商品还可以从购物车中移除。最终实现的效果大致如图所示。 基础版 plus版              先在

    2024年02月05日
    浏览(31)
  • 微信小程序实现商品加入购物车案例

    思考: 购物车中的数据保存在哪里?用哪种数据结构进行保存? 小程序中可能有多个页面需要对购物车中的数据进行操作,因此我们想到把数据存到全局中。可以使用 wx.setStorageSync() 储存,用 wx.getStorageSync() 进行获取,以数组格式方便对数据进行操作。 一、商品加入购物车

    2024年02月10日
    浏览(31)
  • Vue项目商品购物车前端本地缓存逻辑(适用H5/ipad/PC端)——前端实现购物车删除商品、购物车增减数量,清空购物车功能

    Vue3 + Vite + Ts开源后台管理系统模板 基于ElementUi或AntdUI再次封装基础组件文档 基于Element-plus再次封装基础组件文档(vue3+ts)

    2024年02月12日
    浏览(36)
  • Vue项目(购物车)

    目录 购物车效果展示: 购物车代码: 购物车效果展示: 此项目添加、修改、删除数据的地方都写了浏览器都会把它存储起来 下次运行项目时会把浏览器数据拿出来并在页面展示 Video_20230816145047 购物车代码: 复制完代码,需改下script中引入的vue文件地址; 可直接使用

    2024年02月12日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包