uni-app中v-for循环渲染带有slot的vue自定义组件时slot中数据内容无效

发布于 1周前 作者 phonegap100 来自 uni-app

uni-app中v-for循环渲染带有slot的vue自定义组件时slot中数据内容无效

uni-app中v-for循环渲染带有slot的vue自定义组件渲染slot中数据内容无效

uni-app中如果引入单个组件正常渲染,一旦在外边添加一层block或view的v-for循环如: (item,index) in list ,slot下的数据如item.xxx,item.text等是渲染不出来的。

示例代码

单个组件的渲染没有问题,一切正常

<uni-swipeout2 operate-width="210">  
    <view slot="content">  
        <view class="swipe-item2">  
            <view class="title">猛虫过江</view>  
            <view class="label">侏罗纪世界主题公园及豪华度假村被失控的恐龙们摧毁已有四年</view>  
        </view>  
    </view>  

    <view slot="button">  
        <view class="i-swipeout-demo-button-group">  
            <view class="i-swipeout-demo-button">点赞</view>  
            <view class="i-swipeout-demo-button">分享</view>  
            <view class="i-swipeout-demo-button">删除</view>  
        </view>  
    </view>  
</uni-swipeout2>

slot=content和slot=button中的数据内容无法正常显示,类似数据丢了一样

<block v-for="(item,index) in swipeoutList" :key="index">  
    <uni-swipeout2 operate-width="185">  
        <view slot="content">  
            <view class="swipe-item2">  
                <view class="title">猛虫过江</view>  
                <view class="label">{{item.text}}</view>  
            </view>  
        </view>  

        <view slot="button">  
            <view class="i-swipeout-demo-button-group" style="background:#2db7f5;">  
                <view class="i-swipeout-demo-button" style="width:60px;border-right:1px solid #fff;">  
                    <uni-icon size="20" type="zan" color="#fff"></uni-icon>  
                </view>  

                <view class="i-swipeout-demo-button" style="width:60px;border-right:1px solid #fff;">  
                    <uni-icon size="20" type="share" color="#fff"></uni-icon>  
                </view>  

                <view class="i-swipeout-demo-button" style="width:60px;">  
                    <uni-icon size="20" type="remove" color="#fff"></uni-icon>  
                </view>  
            </view>  
        </view>  
    </uni-swipeout2>  
</block>

61 回复

最新alpha版可以用 1.9正式版后,手动切换编译模式也可以使用,manifest.json -> app-plus -> usingComponents切换编译模式
// manifest.json
{
// …
/* App平台特有配置 /
“app-plus”: {
“usingComponents”:true //是否启用自定义组件模式,为true表示新的自定义组件模式,否则启用老的template模板模式
}
/
微信小程序特有配置 */
“mp-weixin”: {
“usingComponents”:true //是否启用自定义组件模式,为true表示新的自定义组件模式,否则启用老的template模板模式
}
}
https://ask.dcloud.net.cn/article/35818


开启这个之后,如果代码中有使用mixins 会编译报错

最新alpha版兼容以前的代码吗?可以直接下载使用原项目跑吗??

升级hx,manifest设为自定义组件编译模式。 如果是cli项目,npm update升级cli。 如果是自定义基座,重新制作自定义基座。 如果是离线打包,重新下载sdk

v1.91,自定义组件编译模式, 在微信端报错,usingComponents设置回false才正常

回复 s***@126.com: 报什么错,看自定义组件的编译注意文档调整。老编译模式很快会被淘汰

npm update 哪个包 ?

新版本修复这个slot的问题了吗?

经过测试新版本还是没有修复这个问题

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

回复 HRK_01: 为什么我的还是不行,我已经更新hx到最新版本了

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

官方啥时候能修复这个bug呀,好多地方都会用到

楼主怎么规避的?

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

回复 HRK_01: 小程序还是不行

我也是遇到这个问题 头大

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

解决这个问题了吗?我也遇到了。。。

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

为什么还没有修复

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

坑死了, 原来也是这个问题, 坑了1天

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

框架太坑了,这个常用的功能都有问题,慎用吧,我放弃了

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

经过测试新版本还是没有修复这个问题

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

2.6+可以用v-slot

@jingxiaotian2016@163.com:你确定APP可以?

这根本就不是作用域插槽的问题。。。

不能v-for不就相当于所有子组件都需要写到父页面中。。这个问题不先解决。。写起来真的很难受。。

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

可以在自定义组件中通过定义一个props:字段对子组件进行取值,父组件里头写一个样式来展示,目前我是这搞得,至少不会再父组件中写死

请问你是怎么绕过这个问题的啊。求教

回复 落叶疏影: 升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

麻烦尽快解决此问题。谢谢!

升级hx,manifest设为自定义组件编译模式之后还会复现该问题吗?

2018-10-29 报出来的问题,现在还没解决。。。无语

并没有解决这个问题

回复 m***@163.com: 我将尝试验证并复现你的问题,如果可以,最好提供问题工程以更快协助我们定位问题

好巧 我也遇到了, app ,h5 都没有问题 就微信小程序有, 之前的版本都是好的 , 昨天升级了 hbx 今天更新就出现这个问题

我将尝试验证并复现你的问题,如果可以,最好提供问题工程以更快协助我们定位问题

根本没修复,遇到了同样的问题开发工具版本3.2.12.20211029

我将尝试验证并复现你的问题,如果可以,最好提供问题工程以更快协助我们定位问题

差不多的问题v-for作用域插槽带过来的数组编译不了

我将尝试验证并复现你的问题,如果可以,最好提供问题工程以更快协助我们定位问题

我是直接把循环换成wx:for可以编译了

还是不生效啊,vue3 cli最新不生效

我将尝试验证并复现你的问题,如果可以,最好提供问题工程以更快协助我们定位问题

非常棒!!! 5年了 这bug还没修复!!!
循环中的动态插槽名不生效

我将尝试验证并复现你的问题,如果可以,最好提供问题工程以更快协助我们定位问题

<view class="u-tabs" :style="{ background: bgColor }">

<view :id="id">
<scroll-view scroll-x class="u-scroll-view" :scroll-left="scrollLeft" scroll-with-animation>
<view class="u-scroll-box" :class="{'u-tabs-scorll-flex': !isScroll}">
<view class=“u-tab-item u-line-1” :id="‘u-tab-’ + index" v-for="(item, index) in list" :key=“index” @tap=“clickTab(index)”
:style="[tabItemStyle(index)]">

                    <!-- {{ item[name] || item['name']}} -->  
        <slot :item="item" :count="count" :name="name">  
          <u-badge :count="item[count] || item['count'] || 0" :offset="offset" size="mini"></u-badge>  
          {{ item[name] || item['name']}} 00  

        </slot>  
        <slot name="titleEx" :item="item" :count="count" :name="name">  
          11  
        </slot>  
                </view>  
                <view v-if="showBar" class="u-tab-bar" :style="[tabBarStyle]"></view>  
            </view>  
        </scroll-view>  
    </view>  
</view>  

        <u-tabs :list="tabs" :is-scroll="true" :current="tabIndex" @change="tabChange" active-color="#000000"  
            inactive-color="#999999" :customStyle="{'background-color':'#050505'}">  
    <template v-slot:default="{ item, count, name }">  
      {{item}}, {{count}}, {{name}}  
    </template>  
            <view #titleEx="{ item, count, name }">  
      <view>  
        <image src="../../static/logo.png"></image>  
        {{ item[name] || item['name']}} - {{item}}, {{count}}, {{name}}  
      </view>  
    </view>  
        </u-tabs>  

结果是 今日订单 0011 已完成 0011 完全没覆盖,,到了一种无法使用的程度

我将尝试验证并复现你的问题,如果可以,最好提供问题工程以更快协助我们定位问题

<view class=“item” :class="{‘is-disabled’: !!item.disable}" :style=“item.itemStyle” v-for="(item, j) in child" :key=“j” @click=“handleNodeClick(item, i, j)”>
<text class="item-text">{{item.text}}</text>
<slot name="tag" :data="item"/>
<view class="check" v-if="selected.length > i && item.value == selected[i].value"></view>
</view>

<grandson> <template v-slot:tag="{data}"> <slot name="itemTag" :data="data"/> </template> </grandson> <children> <template v-slot:itemTag="{data}"> <text [@click](/user/click)="point(data)">{{data.text}}</text> </template> </children> 这个potin打印的数据是正常的,但是渲染的data.text是undefined,这是啥问题?

uni-app 中使用 v-for 循环渲染带有 slot 的 Vue 自定义组件时,如果发现 slot 中的数据内容无效,通常是因为 slot 作用域的问题。slot 插槽分为默认插槽和作用域插槽两种,而作用域插槽可以传递数据给父组件模板使用。

以下是一个示例,展示如何在 uni-app 中正确使用 v-for 和作用域插槽来渲染带有 slot 的自定义组件,并确保 slot 中的数据内容有效。

1. 自定义组件(MyComponent.vue)

<template>
  <view>
    <slot :item="item"></slot>
  </view>
</template>

<script>
export default {
  name: 'MyComponent',
  props: {
    item: {
      type: Object,
      required: true
    }
  }
}
</script>

2. 父组件(ParentComponent.vue)

<template>
  <view>
    <my-component
      v-for="(item, index) in items"
      :key="index"
      :item="item"
    >
      <template #default="{ item }">
        <view>
          <text>{{ item.name }}</text>
          <text>{{ item.value }}</text>
        </view>
      </template>
    </my-component>
  </view>
</template>

<script>
import MyComponent from './MyComponent.vue';

export default {
  components: {
    MyComponent
  },
  data() {
    return {
      items: [
        { name: 'Item 1', value: 'Value 1' },
        { name: 'Item 2', value: 'Value 2' },
        { name: 'Item 3', value: 'Value 3' }
      ]
    };
  }
}
</script>

关键点解析

  1. 自定义组件:在 MyComponent.vue 中,我们定义了一个 slot 并将其 item 属性传递给 slot
  2. 父组件:在 ParentComponent.vue 中,我们使用 v-for 指令循环渲染 MyComponent,并通过作用域插槽 (<template #default="{ item }">) 接收 MyComponent 传递的 item 数据。
  3. 作用域插槽:父组件的模板部分使用 #default 插槽语法来定义如何渲染 MyComponent 的内容,并正确访问 item 对象中的数据。

通过这种方式,我们可以确保在使用 v-for 循环渲染带有 slot 的自定义组件时,slot 中的数据内容是有效的。这个示例展示了如何在 uni-app 中正确地使用作用域插槽来传递数据,并避免数据内容无效的问题。

回到顶部