前言

近期挪动端我的项目中遇到个需要,数据须要树形显示。找了一些插件感觉不太适宜,就看了看相干文章以及视频,想着以学习和积攒的态度,就本人封装了个tree的树形展现组件。学习到了组件在它的模板内能够递归地调用本人,间接上代码吧~

子组件代码

<template>  <div class="experTree">    <ul v-for="item in data" :key="item.name">      <li class="experTree_info">        <div class="experTree_bar" @click="onOpenHandler">          <img            v-if="isHaschildren(item)"            src="@/assets/images/expert-right.png"            alt=""            class="icon"            :class="on_off ? 'vertical' : 'normal'"          />          <div v-if="!isHaschildren(item)" class="icon"></div>          <span> {{ item[label] }} </span>        </div>        <div class="experTree_select" @click="onSelectHandler(item)">抉择</div>      </li>      <exper-tree        v-show="on_off"        v-if="isHaschildren(item)"        :data="item[children]"        :defaultProps="defaultProps"      ></exper-tree>    </ul>  </div></template><script>export default {  name: "experTree",  props: {    data: {      type: [Object, Array],      required: true    },    defaultProps: {      type: Object,      default: () => {        return {          children: "children",          label: "label"        };      }    }  },  data() {    return {      on_off: false    };  },  computed: {    label() {      return this.defaultProps.label;    },    children() {      return this.defaultProps.children;    },    isHaschildren() {      return data => {        return data[this.children] && data[this.children].length;      };    }  },  methods: {    onOpenHandler() {      this.on_off = !this.on_off;    },    onSelectHandler(item) {      this.$emit("onSelectHandler", item);    }  }};</script><style lang="scss" scoped>.anime_time {  transition: all 0.3s;}.dis_flex {  display: flex;  align-items: center;}.experTree {  &_info {    @extend .dis_flex;    height: 48px;    justify-content: space-between;    .experTree_bar {      @extend .dis_flex;      height: 100%;      flex: 1;      .icon {        width: 38px;        height: 38px;        &.vertical {          transform: rotate(90deg);          @extend .anime_time;        }        &.normal {          @extend .anime_time;        }      }    }    .experTree_select {      color: $mainColor;      padding: 5px;      box-sizing: border-box;    }  }}</style>

父组件调用

<template>   <div class="tree-menu">     <expert-tree       :data="list"       :defaultProps="defaultProps"       @onSelectHandler="onSelectHandler"     ></expert-tree>   </div></template><script>import expertTree from "./expert_tree.vue";let list = [  {    name: "Web秀",    children: [      {        name: "web前端",        children: [          {            name: "CSS"          },          {            name: "JavaScript"          },          {            name: "Vue"          },          {            name: "小程序"          },          {            name: "Three.js"          }        ]      },      {        name: "服务器"      },      {        name: "工具类"      }    ]  },  {    name: "今日头条",    children: [      {        name: "图片"      },      {        name: "新闻",        children: []      }    ]  },  {    name: "Angular"  }];export default {  name: "selectSector",  components: { expertTree },  data() {    return {      list: [...list],      defaultProps: {        children: "children",        label: "name"      }    };  },  methods: {    onSelectHandler(data) {      console.log(data, "expert_tree");    }  }};</script><style lang="scss" scoped></style>

结尾

有写的有余的中央心愿大家多提提意见,目前本人的技术的确不怎么样,心愿跟各位大佬多多沟通交流,共同进步。早日跟上各位前辈的步调~