要做出一个简单的购物车界面。首先,有一个复选框,可以选择商品,后面紧跟的是商品名称,然后,是删除按钮,根据这个需求,先写出一个简单的界面,代码如下:
<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>
现在,页面错误的情况解决了: