uni-app 【报Bug】vue2+cli创建的项目设置"scopedSlotsCompiler": "augmented"后,抖音和小红书小程序循环渲染slot异常,只渲染第一个
uni-app 【报Bug】vue2+cli创建的项目设置"scopedSlotsCompiler": "augmented"后,抖音和小红书小程序循环渲染slot异常,只渲染第一个
操作步骤:
<template>
<view>
<view v-for="(item, index) in list" :key="index">
<slot :item="item"></slot>
</view>
</view>
</template>
<template>
<view class="content">
<Test :list="[1, 2, 4]">
<template v-slot:default="{ item }">{{ item }}</template>
</Test>
</view>
</template>
{
"mp-toutiao": {
"scopedSlotsCompiler": "augmented",
"usingComponents": true
}
}
预期结果:
父组件显示传入的数组内容1,2,4,
实际结果:
只渲染了传入数组的第一个值:1,1,1
bug描述:
“scopedSlotsCompiler"默认为auto的时候会报错“主包不能引用分包文件”,看了论坛之后改成了"scopedSlotsCompiler”: “augmented”,这样的话编译确实通过了,但是实际打包头条和小红书小程序后,插槽传值始终都是1个;具体如图
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Windows | WIN10,22H2 | CLI |
第三方开发者工具 | vscode 1.91.1 | - |
基础库版本号 | 2.0.2-4020420240722003 | - |
CLI版本号 | 5.0.8 | - |
社区是凉了吗
收到,感谢反馈
在uni-app中使用Vue 2结合CLI创建项目时,如果遇到在特定小程序平台(如抖音和小红书)上,设置了"scopedSlotsCompiler": "augmented"
后,循环渲染slot只渲染第一个的问题,这通常是由于这些平台对Vue scoped slots的支持不完全或者存在bug。
为了绕过这个问题,可以考虑以下几种方法,这里主要提供一个通过编程方式动态生成内容的替代方案,而不是直接使用scoped slots。这种方案可以避免对scoped slots的依赖,从而可能解决渲染问题。
解决方案:使用组件和v-for动态渲染内容
- 创建一个通用的渲染组件:这个组件接受一个数组作为输入,并基于这个数组动态渲染内容。
<!-- RenderItem.vue -->
<template>
<div v-for="(item, index) in items" :key="index">
<slot :name="'item-' + index" :item="item"></slot>
</div>
</template>
<script>
export default {
props: {
items: {
type: Array,
required: true
}
}
}
</script>
- 在主组件中使用这个渲染组件:
<template>
<view>
<RenderItem :items="list">
<template v-for="(item, index) in list">
<template #[`item-${index}`]="{ item }">
<!-- 这里可以自定义每个item的渲染逻辑 -->
<view>{{ item.name }}</view>
</template>
</template>
</RenderItem>
</view>
</template>
<script>
import RenderItem from './RenderItem.vue';
export default {
components: {
RenderItem
},
data() {
return {
list: [
{ name: 'Item 1' },
{ name: 'Item 2' },
{ name: 'Item 3' }
]
};
}
}
</script>
在这个解决方案中,我们创建了一个RenderItem
组件,它接受一个items
数组,并使用v-for
循环渲染每个项目。主组件通过v-for
为每个item
动态生成一个具名slot,并通过RenderItem
组件的上下文插槽(<slot>
)来渲染这些内容。
这种方法避免了直接使用scoped slots,并且利用了Vue的动态组件和插槽功能来实现类似的效果。虽然这种方法增加了一些模板的复杂性,但它提供了一种可行的替代方案,特别是在遇到特定平台对scoped slots支持不佳的情况下。