vue3树状图,树状关系图

首先在主页面使用 

 <image-tree :list="imageTreeData"></image-tree>  


import imageTree from '@/components/tree-img/image-tree.vue'



const imageTreeData = reactive([    //数据具有扩展性,根据你自己的数据定义变量,只要children和name 和imgPathUrl不改变就行
    {
        name: '一1',
        imgPathUrl:
            'xxx',
        children: [
            {
                name: '二1',
                imgPathUrl:
                    'xxx',
                children: [
                    {
                        name: '三1',
                        imgPathUrl:
                            'xxx',
                    },
                    {
                        name: '三2',
                        imgPathUrl:
                            'xxx',
                    },
                    {
                        name: '三3',
                        imgPathUrl:
                            'xxx',
                    }
                ]
            },
            {
                name: '二2',
                imgPathUrl:
                    'xxx',
                children: [
                    {
                        name: '三1',
                        imgPathUrl:
                            'xxx',
                        children: [
                            {
                                name: '三1',
                                imgPathUrl:
                                    'xxx',
                            },
                            {
                                name: '三2',
                                imgPathUrl:
                                    'xxx',
                            },
                            {
                                name: '三3',
                                imgPathUrl:
                                    'xxx',
                            }
                        ]
                    },
                    {
                        name: '三2',
                        imgPathUrl:
                            'xxx',
                        children: [
                            {
                                name: '三1',
                                imgPathUrl:
                                    'xxx',
                            },
                            {
                                name: '三2',
                                imgPathUrl:
                                    'xxx',
                            },
                            {
                                name: '三3',
                                imgPathUrl:
                                    'xxx',
                                children: [
                                    {
                                        name: '三1',
                                        imgPathUrl:
                                            'xxx',
                                    },
                                    {
                                        name: '三2',
                                        imgPathUrl:
                                            'xxx',
                                    },
                                    {
                                        name: '三3',
                                        imgPathUrl:
                                            'xxx',
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
])


创建一个.vue文件的组件

<template>
    <!-- 第一层 -->
    <div class="flex">
        <div v-for="(item, index) in obj" :class="{ heng: !(index == num - 1) && num, zou: index > 0 }">
            <div class="div">
                <div class="div2" :class="{ xia: xia(item, obj), shang: shang2 }" @click="handleimageclick(item)">
                    <img :src="item.imgPathUrl">
                    <!-- {{ item.name }} -->
                </div>
            </div>
            <template v-if="item.children && item.children.length">
                <image-tree v-if="item.show" :list="item.children" shang2="false" :num="item.children.length"></image-tree>
            </template>

        </div>
    </div>
</template>

<script setup>
import { ref, reactive } from 'vue';
import imageTree from './image-tree.vue';
const obj = ref([]);
const shang = ref(true);
const props = defineProps({
    list: {
        type: Array,
        default: () => []
    },
    shang2: {
        type: Boolean,
        default: ''
    },
    num: {
        type: Number,
        default: ''
    },

})

if (props.list) {
    obj.value = props.list.map(item => {
        return { ...item, show: true };
    });
    shang.value = props.shang2;
}

// 计算属性计算下线
const xia = (item) => {
    if (item.children && !item.children.length) {
        return '';
    }
    return item.children && item.show ? 'xia' : '';
};

//点击的时候子节点显示隐藏
const handleimageclick = (item) => {
    if (item.children) {
        item.show = !item.show
    }
}


</script>
 
<style lang="scss">
* {
    margin: 0;
    padding: 0;
}

.box {
    margin-left: 100px;
    margin-top: 100px;
}

.flex {
    display: flex;
}

.div {
    width: 100px;
    height: 115px;
    display: flex;
    /* 盒子距离 */
    margin: 0 auto;

    /* margin-bottom: 50px;
     margin-right: 50px; */
    img {
        width: 100%;
        height: 100%;
    }
}

.div2 {
    // background-color: aquamarine;
    margin: 0 auto;
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
}

div {
    position: relative;
}

/* 下线条 */
.xia::after {
    content: '';
    width: 1px;
    /* 线条往下的高度 */
    height: 25px;
    bottom: -25px;
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    background-color: #D8D8D8;
}


/* 上线条 */
.shang::before {
    content: '';
    width: 1px;
    /* 线条往下的高度 */
    height: 25px;
    top: -25px;
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    background-color: #D8D8D8;
}

/* 横线条 */
.heng::after {
    content: '';
    /* 需要剪去盒子的大小和偏移量 */
    width: 50%;
    height: 1px;
    position: absolute;
    left: 50%;
    top: -25px;
    background-color: #D8D8D8;
}

.zou::before {
    content: '';
    /* 需要剪去盒子的大小和偏移量 */
    width: 50%;
    height: 1px;
    position: absolute;
    left: 0;
    top: -25px;
    background-color: #D8D8D8;
}
</style>

抱歉,我是一个AI语言模型,无法为您编写完整的Vue3族谱树状图代码。但是,我可以给您提供一些基本的思路和建议: 1. 确定数据结构:族谱树状图需要一个树形结构的数据,每个节点包含该人物的基本信息和他们的子女和父亲信息。可以使用一个对象或数组来表示每个节点,例如: ``` { name: '张三', gender: 'male', father: { name: '李四', gender: 'male' }, children: [ { name: '小红', gender: 'female' }, { name: '小明', gender: 'male', children: [ { name: '小刚', gender: 'male' }, { name: '小丽', gender: 'female' } ] } ] } ``` 2. 定义组件:族谱树状图需要至少两个组件,一个是节点组件,用于显示每个人物的信息和子女节点,另一个是树组件,用于显示整个家族树的结构。 3. 树组件递归显示节点:树组件需要递归显示每个节点和其子节点。可以使用`v-for`指令和递归组件来实现: ``` <template> <div> <node v-for="child in node.children" :node="child" :key="child.name" /> </div> </template> <script> import Node from './Node.vue' export default { name: 'Tree', components: { Node }, props: { node: Object } } </script> ``` 4. 节点组件显示节点信息:节点组件需要显示每个人物的信息和子女节点。可以使用`v-if`指令来判断该节点是否有子女,如果有则显示子节点。 ``` <template> <div> <div>{{ node.name }}</div> <div>{{ node.gender }}</div> <div v-if="node.children"> <tree :node="node" /> </div> </div> </template> <script> import Tree from './Tree.vue' export default { name: 'Node', components: { Tree }, props: { node: Object } } </script> ``` 5. 在Vue实例中使用树组件:最后,在Vue实例中使用树组件,并将家族树数据传递给树组件。 ``` <template> <div> <tree :node="familyTree" /> </div> </template> <script> import Tree from './Tree.vue' export default { name: 'App', components: { Tree }, data() { return { familyTree: {...} // 家族树数据 } } } </script> ``` 以上是一个基本的Vue3族谱树状图的思路和建议,具体实现还需要根据具体需求进行调整和完善。希望对您有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值