【购物车案例】for循环为什么使用key

要做出一个简单的购物车界面。首先,有一个复选框,可以选择商品,后面紧跟的是商品名称,然后,是删除按钮,根据这个需求,先写出一个简单的界面,代码如下:

<template>
	<view class="out">
		<view class="item" >
			<checkbox></checkbox>
			<text class="title" >索尼</text>
			<text class="del" >删除</text>
		</view>
	</view>
</template>

<script setup>


</script>

<style lang="scss" scoped>
	     .out{
			 padding: 10px;
		 }  
		 .item{
			 padding: 10px 0;
			  .del{
				  color: #c00;
				  margin-left: 30px;
			  }
		 }
</style>

实际效果:
在这里插入图片描述
现在,定义一个商品循环体 ,对item进行循环,完成整个界面的制作,代码如下:

<template>
	<view class="out">
		<view class="item" v-for="item in goods">
			<checkbox></checkbox>
			<text class="title" >{{item.name}}</text>
			<text class="del" >删除</text>
		</view>
	</view>
</template>

<script setup>
import {ref} from "vue" ;
const goods = ref([
	{id:1,name:"索尼"},
	{id:2,name:"摩托罗拉"},
	{id:3,name:"诺基亚"},
	{id:4,name:"LG"},
])

</script>

<style lang="scss" scoped>
	     .out{
			 padding: 10px;
		 }  
		 .item{
			 padding: 10px 0;
			  .del{
				  color: #c00;
				  margin-left: 30px;
			  }
		 }
</style>

实际效果:
在这里插入图片描述
页面部分制作完毕,接下来开始逻辑部分,让删除键起作用,先给删除加上click事件,后在script中写入方法,删除的时候我们得知道删除的是哪一项,这里我们用索引值作为标识,代码如下:

<template>
	<view class="out">
		<view class="item" v-for="(item,index) in goods">
			<checkbox></checkbox>
			<text class="title" >{{item.name}}</text>
			<text class="del" @click="remove(index)">删除</text>
		</view>
	</view>
</template>

<script setup>
import {ref} from "vue" ;
const goods = ref([
	{id:1,name:"索尼"},
	{id:2,name:"摩托罗拉"},
	{id:3,name:"诺基亚"},
	{id:4,name:"LG"},
])
function remove(index){
	goods.value.splice(index,1)
}
</script>

<style lang="scss" scoped>
	     .out{
			 padding: 10px;
		 }  
		 .item{
			 padding: 10px 0;
			  .del{
				  color: #c00;
				  margin-left: 30px;
			  }
		 }
</style>

实际效果:
在这里插入图片描述
成功实现删除,但注意看,在动画中,选中“摩托罗拉”,并将其删除后,“诺基亚”被选中了,这是因为没有key的情况下,Vue在数据项顺序改变时会复用错误的DOM元素,导致页面显示错误。我们给它加上key,key需要具有唯一性,这里给key设置为item.id,代码如下:

<template>
	<view class="out">
		<view class="item" v-for="(item,index) in goods":key = "item.id">
			<checkbox></checkbox>
			<text class="title" >{{item.name}}</text>
			<text class="del" @click="remove(index)">删除</text>
		</view>
	</view>
</template>

<script setup>
import {ref} from "vue" ;
const goods = ref([
	{id:1,name:"索尼"},
	{id:2,name:"摩托罗拉"},
	{id:3,name:"诺基亚"},
	{id:4,name:"LG"},
])
function remove(index){
	goods.value.splice(index,1)
}
</script>

<style lang="scss" scoped>
	     .out{
			 padding: 10px;
		 }  
		 .item{
			 padding: 10px 0;
			  .del{
				  color: #c00;
				  margin-left: 30px;
			  }
		 }
</style>

现在,页面错误的情况解决了:
在这里插入图片描述

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值