输入框与多选树级选择器联动可搜索

功能:

做一个输入框可以和多级树选择器联动且可以过滤搜索的效果


效果预览:

在这里插入图片描述在这里插入图片描述在这里插入图片描述


代码:

<div class="fliterBox">
          <span class="demonstration">抓拍点:</span>
          <el-popover
            placement="bottom-start"
            width="auto"
            trigger="click"
          >
            <el-input
              v-model="filterText"
              placeholder="输入关键字进行过滤"
            />
            <el-tree
              ref="tree"
              class="filter-tree"
              show-checkbox
              node-key="id"
              :data="data"
              :props="defaultProps"
              default-expand-all
              :filter-node-method="filterNode"
              :check-on-click-node="true"
              :expand-on-click-node="false"
              @check-change="handleCheck"
            />
            <el-input slot="reference" v-model="currentNode" placeholder="请输入内容" />
          </el-popover>
        </div>
<script>
export default {
  name: 'App',
  data() {
    return {
      currentNode: '',
      filterText: '',
      data: [{
        id: 1,
        label: '一级 1',
        children: [{
          id: 4,
          label: '二级 1-1',
          children: [{
            id: 9,
            label: '三级 1-1-1'
          }, {
            id: 10,
            label: '三级 1-1-2'
          }]
        }]
      }, {
        id: 2,
        label: '一级 2',
        children: [{
          id: 5,
          label: '二级 2-1'
        }, {
          id: 6,
          label: '二级 2-2'
        }]
      }, {
        id: 3,
        label: '一级 3',
        children: [{
          id: 7,
          label: '二级 3-1'
        }, {
          id: 8,
          label: '二级 3-2'
        }]
      }],
      defaultProps: {
        children: 'children',
        label: 'label'
      }

    }
  },
  watch: {
    filterText(val) {
      this.$refs.tree.filter(val)
    }
  },
  mounted() {

  },
  methods: {
    filterNode(value, data) {
      if (!value) return true
      return data.label.indexOf(value) !== -1
    },
    handleCheck() {
      this.currentNode = ''
      //   获取所有选中节点
      var current = this.$refs.tree.getCheckedNodes()
      if (current.length > 0) {
        current.forEach((item, index) => {
          if (!item.children) {
            // 控制输入框显示多节点
            this.currentNode += item.label + ','
          }
        })
        const str = this.currentNode
        this.currentNode = str.slice(0, str.length - 1)
        console.log(this.currentNode)
      }
    }

  }
}
</script>