美文网首页
实现级联选择器组件

实现级联选择器组件

作者: Adoins | 来源:发表于2019-04-15 20:02 被阅读0次

    开始造中级轮子级联选择器组件,遇到一个难题就是无法确定有几级弹出框供选择,例如以下的数据结构。

      data: {
         source: [{
          name: '浙江',
          children: [
            {
              name: '杭州',
              children: [
                {name: '上城'},
                {name: '下城'},
                {name: '江干'},
              ]
            },
            {
              name: '嘉兴',
              children: [
                {name: '南湖'},
                {name: '秀洲'},
                {name: '嘉善'},
              ]
            },
          ]
        }, {
          name: '福建',
          children: [
            {
              name: '福州',
              children: [
                {name: '鼓楼'},
                {name: '台江'},
                {name: '仓山'},
              ]
            },
          ]
        }]
      },
    

    因此得做个递归组件。首先创建级联选择器父组件cascader.vue

    <template>
      <div class="cascader">
        <div class="trigger">
          <slot></slot>
        </div>
        <div class="popover">
          <div v-for="(item,index) in source" :key="index">
            <cascader-item :sourceItem="item"></cascader-item>
          </div>
        </div>
      </div>
    </template>
    <script>
    import CascaderItem from './cascader-item'
    export default {
      name: 'WheelCascader',
      components: { CascaderItem },
      props: {
        source: {
          type: Array
        }
      }
    }
    </script>
    

    其中cascader-item.vue就是递归的级联选择器子组件,需要传入数据sourceItem,是一个Object,包含namechildren两个属性

    <template>
      <div class="cascader-item">
        {{sourceItem.name}}
        <div v-if="sourceItem.children">
          <wheel-cascader-item 
              v-for="(item, index) in sourceItem.children"       
              :sourceItem="item" 
              :key="index">
          </wheel-cascader-item>
        </div>
      </div>
    </template>
    <script>
    export default {
      name: 'WheelCascaderItem',
      props: {
        sourceItem: {
          type: Object
        }
      }
    }
    </script>
    <style lang="scss" scoped>
      @import 'var';
      .cascader-item {
        border: 1px solid red;
        margin: 10px;
      }
    </style>
    

    只有当传入的对象有数组时才递归调用自己显示名称。注意这里只要标签名和组件名name一致,vue就会智能地认为我们调用了自己这个组件,十分类似递归函数的调用。
    最后即可正确显示效果:

    级联组件.png
    本人造轮子项目:https://github.com/zyqq/wheel 欢迎star

    相关文章

      网友评论

          本文标题:实现级联选择器组件

          本文链接:https://www.haomeiwen.com/subject/cibpwqtx.html