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

7 回复

解決了吗 同样的问题

更多关于uni-app 微信小程序嵌套循环内不能使用作用域插槽的实战教程也可以访问 https://www.itying.com/category-93-b0.html


大佬这个issue里面貌似也没有解决,我这边也是遇到这个问题

大佬解决了吗

就小程序端渲染不出内容

微信小程序依然不支持作用于插槽,而且slot标签上只能设置name属性,设置了其他的属性直接编译不通过。。。

uni-app 开发微信小程序时,嵌套循环内使用作用域插槽(Scoped Slots)可能会遇到一些问题。这是因为微信小程序的原生模板语法和 Vue 的作用域插槽机制在某些情况下并不完全兼容,尤其是在嵌套循环中。

问题描述

Vue 中,作用域插槽允许父组件向子组件传递模板内容,并且可以在子组件中访问父组件的数据。然而,在微信小程序中,嵌套循环内的作用域插槽可能会导致数据绑定失效或渲染异常。

解决方案

以下是一些可能的解决方案:

1. 使用 v-forv-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>
回到顶部