Vue-elementUI树形控件的实现

211 阅读1分钟

需求:创建一个二级树形控件,并能模糊搜索

静态页面的展现

<div label="业务部件名称:" prop="compoName">
      <el-input v-model="filterdept" clearable readonly placeholder="请点击图标选择" @on-click="chooseCompoCode"/>
</div>
<!-- 选择compoCode -->
<Modal
    title="选择数据"
    v-model="compoModel"
    :mask-closable="false"
    :transfer="false"
    >
    <div class="modal-wrap">
      <el-tree
        ref="compoTree"
        :data="compoTree"
        :props="dataProps"
        @node-click="selectcompoNode"
        node-key="compoKey"
        :filter-node-mehod='filterSqlNode'
        >
      </el-tree>
    </div>
    <div slot="footer">
      <Button type="primary" @click="compoSure">确认选择</Button>
      <Button type="primary" @click="compoCancel">取消</Button>
    </div>
</Modal>

script实现

<script>
    treeUrl = 数据接口
    // 全局定义
    data () {
      return () {
      	filterdept: '',
        compoNode: null,// 用来存放选择出来的数据
        compoModel: false,
        compoTree: [], // 存放所有数据的数组
        defaultprops: {
            children: 'children',
            id: 'compoKey',
            label: 'label'
        }
      }
    }
    computed: {
        // 根据数据生成树形结构
        formTree () {
            return {
                Title: '树形'
                cells: [
                    {
                        type: 'tree',
                        label: '树形',
                        prop: '',
                        selectConfig: {
                            key: 'id',
                            data: this.sqlDatas,
                            checkbox: false,
                            dafaultProps: {label: 'dictTreeArr'},
                            nodeClick: this.selectcompoNode
                        }
                    }
                ]
            }
    	}
    },
    mounted: {
    	this.getCompoTreeFn () // 调用接口数据函数
    }
    watch: {
    	// 筛选,监听输入框的输入值
    	filterdept (val) {
            this.$refs.deptref.filter(val)
    	}
    },
    methods: {
    	// input框点击事件
      chooseCompoCode () {
        this.getCompoTree() // 获取树形控件接口
        this.compoNode = null // 用来存放选择出来的数据
        this.compoModel = true //树形控件弹窗
      },
      // 模糊搜索方法且不区分大小写
      filterSqlNode (value, data) {
      	if (!value) return true;
        return data.label.toLowerCase().indexOf(value.toLowerCase()) !== -1;
      },
      // 获取接口数据
      async getCompoTree() {
      	try {
            let res = await util.httpGet(treeUrl)
            this.sqlDatas = res.data
            let sqlDatas = this.sqlDatas
            // 遍历获取 tableName一级数据、tableColumns二级数据
            sqlData.forEach(item => {
                let children = []
                item.tableColumns.forEach(itemC => {
                    children.push({lable: itemC})
                })
                this.compoTree.push({lable: item.tableName, children: children})
            })
        } catch (error) {
            this.$message({message: error.message, type: 'warning'})
        },
        // 点击选中树形数据
        selectcompoNode (data, node, tree){
            this.compoNode = data
        }
    }
</script>