父组件是这样的
<template>
<testSlot :data="item" v-for="item in data" :key="item">
<template v-slot:default="scope">
<view @click="deleteData(scope.info)">{{ scope.info }}</view>
</template>
</testSlot>
<testSlot2 :data="item" v-for="item in data" :key="item"
@deleteData="deleteData">
</testSlot2>
<testSlot3 :data="data">
<template v-slot:default="scope">
<view @click="deleteData(scope.info)">{{ scope.info }}</view>
</template>
</testSlot3>
</template>
<script setup>
import testSlot from './testSlot.vue'
import testSlot2 from './testSlot2.vue'
import testSlot3 from './testSlot3.vue'
const data = ref([])
data.value = Array.from({ length: 30 }, (v, i) => i)
function deleteData(info) {
const index = data.value.findIndex(ele => ele === info)
if(index > -1)
data.value.splice(index, 1)
}
</script>
子组件 testSlot
<template>
<view class="button">
<slot :info="data"></slot>
</view>
</template>
<script setup>
import { toRefs } from 'vue'
const props = defineProps({ data: Number })
const { data } = toRefs(props)
</script>
<style lang="stylus">
.button
width: 100rpx
line-height: 60rpx
text-align: center
border: 1rpx solid #666
border-radius: 8rpx
</style>
子组件 testSlot2
<template>
<view class="button" @click="deleteData(data)">
{{ data }}
</view>
</template>
<script setup>
import { toRefs } from 'vue'
const props = defineProps({ data: Number })
const { data } = toRefs(props)
const emits = defineEmits(['deleteData'])
function deleteData (data) {
emits('deleteData', data)
}
</script>
<style lang="stylus">
.button
width: 100rpx
line-height: 60rpx
text-align: center
border: 1rpx solid #666
border-radius: 8rpx
</style>
子组件 testSlot3
<template>
<view class="button" v-for="item in data" :key="item">
<slot :info="item"></slot>
</view>
</template>
<script setup>
import { toRefs } from 'vue'
const props = defineProps({ data: Array })
const { data } = toRefs(props)
const emits = defineEmits(['deleteData'])
function deleteData (data) {
emits('deleteData', data)
}
</script>
<style lang="stylus">
.button
width: 100rpx
line-height: 60rpx
text-align: center
border: 1rpx solid #666
border-radius: 8rpx
</style>
7***@qq.com (作者)
我实际项目做的时候是用index做删除,同样有问题,我认为和第一种写法差不多,所以没有列出来,但是确实只是在小程序端出现问题
<testSlot :data="item" v-for="(item, index) in data" :key="item">
<template v-slot:default="scope">
<view @click="deleteData(scope.info, index)">{{ scope.info }}</view>
</template>
</testSlot>
2022-07-20 11:41
7***@qq.com (作者)
如果改成这样也没有问题
<testSlot :data="item" :index="index" v-for="(item, index) in data" :key="item">
<template v-slot:default="scope">
<view @click="deleteData(scope.info, scope.index)">{{ scope.info }}</view>
</template>
</testSlot>
2022-07-20 11:42
7***@qq.com (作者)
这个确实不算什么大问题,注意写法就可以避免
2022-07-20 11:46