LEARNER0
LEARNER0
  • 发布:2018-11-15 23:23
  • 更新:2020-03-10 17:38
  • 阅读:9897

uni-app使用vue递归组件做无极树形列表只能显示第一级

分类:nvue

根据网上查找的资料,vue做递归组件,模仿着写了一个,遇到个问题,用如下json串,{
"data": {
"OrgName": "项目管理",
"menuCode": "",
},
"childTreeNode": [{
"data": {
"OrgName": "项目",
"menuCode": "BusProject",
},
"childTreeNode": []
},
{
"data": {
"OrgName": "人员周报",
"menuCode": "BusProject",
},
"childTreeNode": []
}
]
}
在递归的组件onload时候添加了日志,执行次数和json串里的个数是吻合的,但是跑起来后,却只有根节点,剩余的子节点都不知道哪里去了,是我书写的问题还是有bug啊。求解惑,搞了一整天了没解决。

2018-11-15 23:23 负责人:无 分享
已邀请:
996上班族

996上班族 - 996上班族

原本只调试了app的,加了name(红色),测试提出小程序不显示;
参考JS的方式(参考https://www.cnblogs.com/zhaidq/p/11227532.html)换成绿色形式,app上不显示;
最后把红色和绿色代码都加进去,小程序和app都显示了。

1***@qq.com

1***@qq.com

组件哪来的 看下数据格式对不

  • LEARNER0 (作者)

    主键是自己根据网上vue的教程改的,在组件的onload里面打印过日志,数据正常解析出来的。不知道是我哪里没写对,还是有bug。

    2018-11-16 09:57

8***@qq.com

8***@qq.com - 湖北技升

同样的问题

8***@qq.com

8***@qq.com - 湖北技升

折腾一夜了,求解答

  • LEARNER0 (作者)

    放弃了。哈哈

    2018-12-03 10:58

  • 2***@qq.com

    我也要树结构的排版,,,也弄了一天没弄出来,,群里和提问都问了。。都没人鸟。

    2018-12-06 09:51

  • 2***@qq.com

    用两个组件互相调用也一样,报错 说递归啥啥的,,然后自动停止了。

    2018-12-06 09:53

2***@qq.com

2***@qq.com

同样的问题

妖王令剑

妖王令剑 - pcliang

你能把这个组件的代码贴出来吗? 问题很有可能在里面 , 有可能是你写错了东西 , 或者就是你的数据格式有问题

  • 8***@qq.com

    n您做成功了吗,代码能学习下吗

    2018-12-20 15:09

  • 妖王令剑

    我没有这组件的代码呀 , 怎么试

    2018-12-21 11:03

妖王令剑

妖王令剑 - pcliang

我随便写了一个组件 , 数要多深, 数据就写多深 , 你还是直接打开组件 , 看看数据的结构 , 我觉得是数据结构的问题

  • 2***@qq.com

    递归的代码能发一下吗?

    2018-12-21 15:27

  • 妖王令剑

    回复 2***@qq.com:好的

    2018-12-21 15:36

  • 破晓君

    你这个是在h5吧 有试过在 小程序里面么

    2018-12-21 16:10

  • 妖王令剑

    回复 破晓君:没 , 试一下

    2018-12-21 16:39

  • LEARNER0 (作者)

    能把这一块的代码也发出来参考下吗

    2018-12-24 10:54

  • t***@163.com

    可以肯定的是小程序和安卓app无法递归,不知道楼主有没有解决办法!

    2019-02-07 22:22

  • z***@outlook.com

    能把着个页面的完整代码发一下吗

    2019-02-16 11:15

  • i***@163.com

    能不能发下代码看一下谢谢!

    2019-08-28 23:21

妖王令剑

妖王令剑 - pcliang

代码 带上

<template>  
    <view>  
    <view class="tree-ul" v-for="(item,i) in data" :key="item.code+i">  
        <view class="isTrue" v-if="item.children">                
            <view class="tree-item">  
                <label>{{item.name}}</label>  
                <span v-if="!opends[i]" @tap="onOpends(item,i)">&or;</span>  
                <span v-if="opends[i]"  @tap="onOpends(item,i)">&and;</span>  
            </view>  
            <tree-item class="children-box" :data="item.children" v-show="opends[i]"></tree-item>  
        </view>  
        <view class="tree-item isTrue"  v-if="!item.children">  
            <label>{{item.name}}</label>  
        </view>  
    </view></view>  
</template>  

<script>  
    export default {  
        name: "tree-item",  
        props:{  
            data: {  
                type: Array,  
                default: function(e) {  
                    return []  
                }  
            }  
        },  
        data() {  
            return {  
                opends: [],  
            };  
        },  
        onLoad() {  
        },  
        methods:{  
            onOpends(item,i){  
                this.$nextTick(function(){  
                    this.$set(this.opends,i,!this.opends[i])  
                })  
            }  
        }  
    }  
</script>  

<style>  
    .tree-box{  
        display: inline-block;  
        width: 220px;  
        border: 1px solid #eee;  
        overflow: hidden;  
        border-radius: 4px;  
    }  
    .tree-item{  
        display: flex;  
        overflow: hidden;  
        height: 32px;  
        border-bottom: 1px solid #eee;  
    }  
    .tree-item>label{  
        flex: 1;  
        line-height: 32px;  
        font-size: 14px;  
        overflow: hidden;  
        text-overflow: ellipsis;  
        white-space: nowrap;  
    }  
    .tree-item>span{  
        width: 32px;  
        height: 32px;  
        text-align: center;  
        line-height: 32px;  
    }  
    .isTrue{  
        padding-left: 15px;  
    }  
</style>  
  • LEARNER0 (作者)

    谢谢,我去试试看

    2018-12-24 10:24

  • t***@163.com

    我试过你这个,h5下没问题,但是安卓下还是只显示第一层为什么呢?

    2019-02-07 19:36

  • t***@163.com

    安卓下只显示第一层为什么呢?

    2019-02-07 20:04

  • t***@163.com

    小程序和安卓app下无法递归,知道吗?

    2019-02-07 22:22

破晓君

破晓君

递归组件本身, h5是兼容 但是在小程序里面是不支持的

  • 4***@qq.com

    有解决办法了吗?

    2019-04-17 14:10

t***@163.com

t***@163.com - 80后


经过测试小程序和安卓下都只显示第一层!求高手帮忙看看!

t***@163.com

t***@163.com - 80后

安卓端app也不支持递归组件。求解决办法!!!!!

t***@163.com

t***@163.com - 80后

app下真的无法显示!

逍涯

逍涯

表示同样不支持!!!

t***@163.com

t***@163.com - 80后

app下真的无法显示!

chengsenran

chengsenran

同样的问题,在浏览器上是可以递归的 APP上 是不行的 只显示第一级 求大神出来 给个解决方案

1***@163.com

1***@163.com

有解决的方法了吗?

DCloud_heavensoft

DCloud_heavensoft

插件市场有tree

unionw

unionw - 忙的天昏地暗

components里插件内部使用做无限级调用时,
<template>
<view>
<view class="list">
<view>
<text @click="toggle" v-if="isFolder" class="iconfont" :class="[open ? 'icon-xiangxia' : 'icon-xiangyou']"></text>
<text v-else class="iconfont icon-pdf"></text>
<text @click="goInfo(model.Id)">{{ model.title }}</text>
</view>
<uni-tag text="4" type="primary" size="small" v-if="tagShow"></uni-tag>
</view>
<view v-show="open" v-if="isFolder" class="list-child"><tree-item v-for="(cel, index) in model.children" :model="cel" :key="index"></tree-item></view>
</view>
</template>

<script>
import uniTag from '@/components/uni-tag/uni-tag.vue';

export default {
name: 'tree-item',
props: ['model', 'utag'],
components: { uniTag },
data() {
return {
open: false,
tagShow: this.utag
};
},
computed: {
isFolder() {
return this.model.children && this.model.children.length;
}
},
methods: {
toggle() {
if (this.isFolder) {
this.open = !this.open;
}
},
goInfo(Id) {
uni.$emit('godetail', {
Id: Id
});
}
}
};
</script>
<style scoped>
page {
background: #fff;
}
.list {
border-bottom: 2upx solid #ddd;
line-height: 80upx;
display: flex;
flex-direction: row;
justify-content: space-between;
padding-left: 20upx;
padding-right: 20upx;
}
.list-child {
padding-left: 40upx;
}
.iconfont {
margin-right: 20upx;
}
</style>
我是在外部进行了一次循环在使用tree-item数据绑定,同样的插件,一个在安卓手机上能使用,然后我复制了此插件。在其他地方需要对树形增加属性显示,两种都要保留。但是原来的是好的,自己的就不行。
测试了好多次,都是不显示二级以下的树。
仔细斟酌每一行的作用,每一个字母的意义,确保没有遗漏。还是不行。
突然想到是不是跟后台一样递归需要重复调用?
就是了组件内引用自己
import uniTag from '@/components/tree-item/tree-item.vue';
竟然能显示子节点了。
敲黑板.....可以试试。

该问题目前已经被锁定, 无法添加新回复