uni-app 递归组件在H5页面正常,但以5+app、小程序运行时无法正常递归构建,只能构建第一层【已解决】。

发布于 1周前 作者 bupafengyu 来自 Uni-App

uni-app 递归组件在H5页面正常,但以5+app、小程序运行时无法正常递归构建,只能构建第一层【已解决】。

详细问题描述

(DCloud产品不会有明显的bug,所以你遇到的问题大都是在特定环境下才能重现的问题,请仔细描述你的环境和重现方式,否则DCloud很难排查解决你的问题)

构建树形结构组件,节点使用递归组件方式构建。H5页面可以正常构建出树形结构层级,以5+app、小程序运行,只能构建第一层,无法递归渲染构建更深节点。放置静态文字“123”,发现文字显示正常,说明只是深层组件递归构建问题。样例代码见附件。

重现步骤

[步骤] [结果] [期望] [如果语言难以表述清晰,拍一个视频或截图,有图有真相]

IDE运行环境说明

环境 版本号
HBuilder 或 HBuilderX [IDE版本号]
windows版本号 [windows版本号]
mac版本号 [mac版本号]

uni-app运行环境说明

运行环境 版本号
h5或app或某个小程序 [运行端版本号]

App运行环境说明

环境 版本号
Android版本号 [Android版本号]
iOS版本号 [iOS版本号]
手机型号 [手机型号]
模拟器型号 [模拟器型号]

附件

collapse-tree-demo.zip

联系方式

[QQ] 32758498


25 回复

组件的递归调用,支持的平台为 H5 以及微信小程序,微信小程序平台需开启编译为微信小程序原生组件。https://uniapp.dcloud.io/collocation/manifest?id=mp-weixin 支持递归调用的组件,需要在 globalStyle->usingComponents 中声明。例如: “globalStyle”: {
“navigationBarTextStyle”: “black”,
“navigationBarTitleText”: “uni-app”,
“navigationBarBackgroundColor”: “#F8F8F8”,
“backgroundColor”: “#F8F8F8”,
“usingComponents”: {
“collapse-tree-item”:"/components/collapse-tree-item"
}
} HBuilderX 1.8.0 已修复此问题,cli 已同步更新。
更新:HBuilderX alpha 1.8.5公测啦!uni-app App平台 升级为新版编译器,提升启动速度、提升组件性能、支持过滤器等更多vue语法。


也就是说5+APP,不支持递归

更新到1.8.1.20190330,5+APP,依然不行

回复 yxinlai:目前 App 端不支持,已经在做相关的强化工作,请持续关注更新。

回复 Trust:期待早日实现

回复 yxinlai:1.8.5 alpha 版已更新

回复 Trust:需要特殊配置设置么?

测试发现,HX1.9.0版本已经支持H5、微信小程序、APP三端的组件递归了。若未在globalStyle中声明,则仅H5支持;若已在globalStyle端声明,则H5、微信小程序、APP三端都支持。

都2023年了还不行吗

出现类似的同样的问题,小程序本身是支持递归的,应该是编译过程中有什么问题了。

为啥App里不支持呢,这样感觉好鸡肋的,技术上有什么实现障碍?

求app支持!

组件明明存在,怎么还是报错

现在需要在manifest中添加:“usingComponents”:true才能正确编译

回复 4***@qq.com: app端可以吗

为啥 递归组件 中传递 函数 无法使用呢?

请问下你们的组件递归调用实现了吗

现在app端还支持吗

为什么我的不能设置usingComponents: true

请问解决了吗?怎么做的呢

目前测试,APP内递归怎么还不支持呢?现在支持了吗?

是啊,都2023年了还是不行吗?大道都要磨灭了(

就算是使用了"usingComponents":true,支持递归了,对于.sync支持也不好,建议把代码复制一份,起个不同的名字,组件相互引用.就可以不用"usingComponents":true

请问解决了吗?怎么做的呢

在处理uni-app中递归组件在不同平台表现不一致的问题时,通常需要考虑平台间的兼容性和组件渲染机制上的差异。虽然你提到问题已解决,但为了分享给其他可能遇到类似问题的开发者,这里提供一个可能的解决方案示例,展示如何通过调整递归组件的代码,确保其在H5、5+App以及小程序上都能正确渲染。

递归组件示例

假设我们有一个简单的评论列表组件,每个评论下可能还嵌套有其他评论,形成一个递归结构。

1. 定义递归组件

首先,定义一个名为Comment的递归组件。

<template>
  <view class="comment">
    <text>{{ comment.content }}</text>
    <view v-if="comment.replies && comment.replies.length" class="replies">
      <comment
        v-for="(reply, index) in comment.replies"
        :key="index"
        :comment="reply"
      ></comment>
    </view>
  </view>
</template>

<script>
export default {
  name: 'Comment',
  props: {
    comment: Object
  }
}
</script>

<style scoped>
.comment {
  margin-left: 20px;
}
.replies {
  margin-top: 10px;
}
</style>

2. 使用递归组件

在父组件中使用这个递归组件,并传入初始评论数据。

<template>
  <view>
    <comment :comment="initialComment"></comment>
  </view>
</template>

<script>
import Comment from './components/Comment.vue';

export default {
  components: {
    Comment
  },
  data() {
    return {
      initialComment: {
        content: 'This is a top-level comment.',
        replies: [
          {
            content: 'This is a reply.',
            replies: []
          },
          // 更多嵌套回复...
        ]
      }
    };
  }
}
</script>

3. 注意事项与调试

  • 平台差异:确保所有平台(H5、5+App、小程序)的uni-app SDK都是最新的,因为旧版本可能存在未修复的bug。
  • 性能优化:对于深层嵌套的递归组件,考虑使用虚拟滚动等技术来优化性能,尤其是在小程序上。
  • 调试工具:利用uni-app提供的开发者工具进行跨平台调试,观察渲染树和日志输出,定位问题。

通过上述示例和注意事项,开发者可以更好地理解和解决递归组件在不同平台上的渲染问题。如果你已经找到了特定的解决方案,确保你的代码逻辑清晰,并且兼容所有目标平台。

回到顶部