uni-app 微信小程序嵌套循环内不能使用作用域插槽
uni-app 微信小程序嵌套循环内不能使用作用域插槽
示例代码:
<view v-for="( item, index ) in items" :key="index">
<view>
<view v-for="( i, k ) in item" :key="k">
<slot :haha="i"></slot>
</view>
</view>
</view>
这是使用组件
<todo-list :items="[[1,2],[3,4]]">
<template v-slot="{haha}">
<view>{{haha}}</view>
</template>
</todo-list>
操作步骤:
按照上面的代码示例就能复现
预期结果:
预期结果为展示1,2,3,4的列表
实际结果:
实际结果是空白,什么都没展示
bug描述:
嵌套的循环内使用作用域插槽不能正常显示,H5是正常的,我用的开发工具都是最新版本,使用的是vue3.0
| 项目信息 | 值 |
|------------------|--------------|
| 产品分类 | uniapp/小程序/微信 |
| PC开发环境操作系统 | Mac |
| PC开发环境操作系统版本号 | 12.3.1 |
| HBuilderX类型 | 正式 |
| HBuilderX版本号 | 3.4.10 |
| 第三方开发者工具版本号 | 1.05.2204180 |
| 基础库版本号 | 2.24.2 |
| 项目创建方式 | HBuilderX |
更多关于uni-app 微信小程序嵌套循环内不能使用作用域插槽的实战教程也可以访问 https://www.itying.com/category-93-b0.html
大佬这个issue里面貌似也没有解决,我这边也是遇到这个问题
大佬解决了吗
就小程序端渲染不出内容
微信小程序依然不支持作用于插槽,而且slot标签上只能设置name属性,设置了其他的属性直接编译不通过。。。
在 uni-app
开发微信小程序时,嵌套循环内使用作用域插槽(Scoped Slots)可能会遇到一些问题。这是因为微信小程序的原生模板语法和 Vue
的作用域插槽机制在某些情况下并不完全兼容,尤其是在嵌套循环中。
问题描述
在 Vue
中,作用域插槽允许父组件向子组件传递模板内容,并且可以在子组件中访问父组件的数据。然而,在微信小程序中,嵌套循环内的作用域插槽可能会导致数据绑定失效或渲染异常。
解决方案
以下是一些可能的解决方案:
1. 使用 v-for
和 v-slot
结合
确保你在 v-for
循环中正确使用 v-slot
来传递作用域插槽的数据。例如:
<template>
<view>
<block v-for="(item, index) in list" :key="index">
<child-component>
<template v-slot:default="slotProps">
<view>{{ slotProps.data }}</view>
</template>
</child-component>
</block>
</view>
</template>
<script>
export default {
data() {
return {
list: [
{ data: 'Item 1' },
{ data: 'Item 2' },
{ data: 'Item 3' }
]
};
}
};
</script>
2. 避免在嵌套循环中使用作用域插槽
如果可能,尽量避免在嵌套循环中使用作用域插槽。你可以通过将数据提前处理,或者将嵌套循环拆分为多个组件来简化逻辑。
3. 使用 slot
而不是作用域插槽
如果作用域插槽在嵌套循环中无法正常工作,可以尝试使用普通的 slot
,并通过 props
传递数据。
<template>
<view>
<block v-for="(item, index) in list" :key="index">
<child-component :data="item.data">
<template #default>
<view>{{ item.data }}</view>
</template>
</child-component>
</block>
</view>
</template>
<script>
export default {
data() {
return {
list: [
{ data: 'Item 1' },
{ data: 'Item 2' },
{ data: 'Item 3' }
]
};
}
};
</script>
4. 使用 wx:for
替代 v-for
在某些情况下,使用微信小程序原生的 wx:for
循环可能比 v-for
更稳定。你可以在 uni-app
中混合使用 Vue
和小程序的原生语法。
<template>
<view>
<block wx:for="{{list}}" wx:key="index">
<child-component>
<template v-slot:default="slotProps">
<view>{{ slotProps.data }}</view>
</template>
</child-component>
</block>
</view>
</template>
<script>
export default {
data() {
return {
list: [
{ data: 'Item 1' },
{ data: 'Item 2' },
{ data: 'Item 3' }
]
};
}
};
</script>