14vue学习_经典练习1--循环显示和2--购物车!!!

本文展示了两个Vue.js经典练习:一是使用`v-for`指令实现列表循环显示,点击元素变色;二是实现购物车功能,包括商品列表、数量增减和总价计算。代码中详细定义了数据、方法和计算属性,实现了动态交互和数据绑定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、经典练习一、循环显示,判断索引,点击变色

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title-hellovuejs</title>
    <style>
        .active{
            color:red;
        }
    </style>
</head>
<body>
    <div id ="app">
        <ul>
            <li v-for="(item,index) in movies" 
            :class="{active:currentIndex === index}" @click="liClick(index)">
            {{index}}.{{item}}</li>
        </ul>
    </div>
    <script src="../js/vue.js"></script>
    <script>
        //let(变量) /const(常亮)
        const chen1 = new Vue({
            el: '#app',  //用于挂载要管理的元素
            data:{//定义数据
                movies: ['英雄','当幸福来敲门','阿甘','加勒比海盗'],
                currentIndex: 0
            },
            methods:{
                liClick(index){
                    this.currentIndex = index
                } 
            }

        })
    </script>
</body>

2、经典练习二、购物车

(1)三个项目文件如下

(2)index.html的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title-shooping</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id ="app">
        <div  v-if="books.length">
            <table>
                <thead>
                    <tr>
                        <th></th>
                        <th>书籍名称</th>
                        <th>出版日期</th>
                        <th>价格</th>    
                        <th>购买数量</th>      
                        <th>操作</th>                     
                    </tr>
                </thead>
                <tbody>
                    <tr v-for="(item,index) in books">
                        <td>{{item.id}}</td>
                        <td>{{item.name}}</td>
                        <td>{{item.data}}</td>
                        <td>{{item.price | showPrice}}</td>     
                        <td>
                            <button @click="decrement(index)" v-bind:disabled="item.count<=1">-</button>
                            {{item.count}}
                            <button @click="increment(index)">+</button>
                        </td> 
                        <td><button @click="removeHandle(index)">移除</button></td>                   
                    </tr>
                </tbody>

            </table>
            <h2>总价格{{totalPrice | showPrice}}</h2>
        </div>
        <h2 v-else>购物车为空</h2>
    </div>

    <script src="../js/vue.js"></script>
    <script src="main.js"></script>
</body>

 (3)style.css的代码

table {
    border:1px solid #e9e9e9;
    border-collapse: collapse;
    border-spacing: 0;
}
th,td {
    padding: 8px 16px;
    border: 1px solid #e9e9e9;
    text-align: left;
}
th {
    background-color: #f7f7f7;
    color: #5c6b77;
    font-weight: 600;
}

(4)main.js的代码

//let(变量) /const(常亮)
const chen1 = new Vue({
    el: '#app',  //用于挂载要管理的元素
    data:{//定义数据
        books: [
            {
                id: 1,
                name: '《算法导论》',
                data: '2006-9',
                price: 85.00,
                count: 1
            },
            {
                id: 2,
                name: '《LINUX菜鸟编程》',
                data: '2006-2',
                price: 59.00,
                count: 1
            },
            {
                id: 3,
                name: '《编程珠玑》',
                data: '2008-10',
                price: 39.00,
                count: 1
            },
            {
                id: 4,
                name: '《代码大全》',
                data: '2006-3',
                price: 128.00,
                count: 1
            },
        ]
    },
    methods:{
        // getFinalPrice(price){
        //     return '¥'+price.toFixed(2)
        // }
        increment(index){
            this.books[index].count++
        },
        decrement(index){
            this.books[index].count--
        },
        removeHandle(index){
            this.books.splice(index,1)
        }
    },
    computed: {
        totalPrice(){
            let totalPrice = 0;
            for(let i =0; i<this.books.length; i++){
                totalPrice += this.books[i].price * this.books[i].count;
            }
            return totalPrice
        }
    },
    filters:{
        showPrice(price){
            return '¥'+price.toFixed(2)

        }
    }
})

(5)最后界面

<think>好的,我现在需要帮助用户解决在Vue.js中使用v-for指令创建二维数组的问题。首先,我要回顾一下用户提供的引用内容,特别是引用[4]提到的购物车示例,其中提到将商品列表改为二维数组进行分类。这可能是关键参考点。 用户的问题是如何使用v-for创建二维数组,可能需要展示一个具体的例子。根据Vue的文档,v-for可以嵌套使用来处理多维数组。首先,我需要确定如何正确地在模板中嵌套两个v-for循环,外层遍历一级分类,内层遍历每个分类下的子项。 接下来,考虑数据结构。二维数组通常是一个数组包含多个子数组,例如将商品分为电子产品、生活用品等类别。每个类别下有自己的商品列表。例如: categories: [ { name: '电子产品', items: [...] }, { name: '生活用品', items: [...] } ] 或者可能是一个纯二维数组,如: list: [ ['手机', '电脑'], ['纸巾', '水杯'] ] 根据引用[4]中的练习2,可能需要使用两次v-for,外层遍历分类,内层遍历商品。这时候,数据结构可能是一个对象数组,每个对象包含分类名商品数组。 然后,我需要编写示例代码,展示如何用v-for渲染这样的结构。例如,使用外层v-for循环遍历分类,内层v-for循环遍历该分类下的商品。同时,可能需要绑定key属性,确保Vue的渲染优化。 还要注意Vue的响应式系统,确保在修改二维数组时,视图能正确更新。比如,如果用户需要动态添加或删除分类或商品,可能需要使用Vue.set或数组的变异方法。 另外,用户可能遇到的问题是删除二维数组中的元素,如引用[3]提到的,这时候需要正确操作数组,保持响应性。不过当前问题主要是创建而非删除,但可能需要提及相关的注意事项。 最后,总结步骤:定义二维数据、嵌套v-for、绑定key、处理可能的动态更新。确保示例清晰,符合Vue的最佳实践。</think>### 使用 `v-for` 创建二维数组的示例 在Vue.js中,可以通过**嵌套`v-for`指令**实现二维数组的渲染。以下是一个基于商品分类的示例: #### 1. 数据结构定义 假设需要将商品按类别分类为二维数组: ```javascript data() { return { categories: [ { name: '电子产品', items: ['手机', '笔记本电脑', '耳机'] }, { name: '生活用品', items: ['纸巾', '水杯', '毛巾'] } ] }; } ``` #### 2. 模板中使用嵌套`v-for` 外层遍历分类,内层遍历商品项: ```html <template> <div v-for="(category, index) in categories" :key="index"> <h3>{{ category.name }}</h3> <ul> <li v-for="(item, itemIndex) in category.items" :key="itemIndex"> {{ item }} </li> </ul> </div> </template> ``` #### 3. 纯二维数组的渲染(无分类名) 若数据结构是纯二维数组: ```javascript data() { return { list: [ ['A', 'B', 'C'], ['X', 'Y', 'Z'] ] }; } ``` 模板调整为: ```html <div v-for="(row, rowIndex) in list" :key="rowIndex"> <span v-for="(item, colIndex) in row" :key="colIndex"> {{ item }} </span> </div> ``` ### 关键点说明 1. **嵌套循环**:外层`v-for`遍历第一维度(如分类),内层遍历第二维度(如具体商品)[^4]。 2. **唯一`key`**:必须为每层循环提供唯一标识符(如索引`index`),优化虚拟DOM更新。 3. **响应式更新**:若动态修改二维数组,需使用`Vue.set`或数组变异方法(如`push`、`splice`)保证响应式触发[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值