Element-ui下拉列表源码改造——下拉搜索树列表(二)

前言

这一篇是Element-ui下拉列表二次开发------虚拟下拉列表(一)的续篇,在Element2.0中有一些不满足我们日常开发的组件,就需要自己动手修改组件库中的源码。

实现思路

有两种实现方式,第一种拷贝一份下拉列表源码重新封装,这种方式代码冗余不利于后续维护,而第二种利用组件继承加方法重写的方式实现。接下来只说第二种

js 复制代码
import { Select } from 'element-ui'

export default {
    extends: Select,
    methods: {
        setSelected() {
            Select.methods.setSelected.call(this)
            if (this.multiple) {
                var result = [];
                if (Array.isArray(this.value)) {
                    this.value.forEach(function (value) {
                        result.push({
                            ...value,
                            currentLabel: value.label
                        });
                    });
                }
                this.selected = result;
            }
        },
        handleQueryChange(val) {
            this.options[0].$children[0].filter(val)
        },
        deleteTag(event, tag) {
            this.options[0].$children[0].setChecked(tag.value, false, true);
            Select.methods.deleteTag.call(this, event, tag)
        }
    }
}

如何使用

当前组件跟element下拉列表组件使用是一样的,只是选中check与搜索树节点需要我们实现。

vue 复制代码
<template>
    <v-select v-model="defaultValue" multiple filterable placeholder="请选择">
        <el-option value="" style="height:initial;padding: 0;" @click.stop>
            <el-tree :filter-node-method="filterNode" @check="checkChange" :data="options" show-checkbox node-key="value" ref="tree" highlight-current></el-tree>
        </el-option>
    </v-select>
</template>

<script>
import vSelect from './VSelect'
export default {
    components: {
        vSelect
    },
    data() {
        return {
            options: [],
            defaultValue: '',
        }
    },
    methods: {
        checkChange(node, { checkedNodes }) {
            this.defaultValue = checkedNodes
        },
        filterNode(value, data) {
            if (!value) return true;
            return data.label.toLowerCase().indexOf(value.toLowerCase()) !== -1
        }
    }
}
</script>

最终效果

相关推荐
前端尤雨西3 天前
ElementPlus 源码之 packages 目录
前端·element
梓言11 天前
解决 Element Plus 中 Tooltip 样式影响全局菜单(Menu)及宽度控制失效的完美方案
前端·css·element
忆琳24 天前
Vue3 优雅解决单引号注入问题:自定义指令 + 全局插件双方案
vue.js·element
忆琳24 天前
Vue3 全局自动大写转换:一个配置,全站生效
javascript·element
猪八宅百炼成仙1 个月前
解决 el-date-picker type:daterange 在 layout 布局中的宽度问题
前端·element
lemon_yyds2 个月前
vue 2 升级vue3 : element ui 校验红色高亮失去效果
前端·element
爱分享的鱼鱼4 个月前
前端密码验证详解:Vue3+Element Plus 方案/纯血Vue 3 方案:从语法解析到实战实现
vue.js·element
jenemy4 个月前
🚀 这个 ElDialog 封装方案,让我的代码量减少了 80%
vue.js·element
simon91244 个月前
ElementUI:表格如何展示超出单元格的内容且不影响单元格?
前端·vue.js·element
我看刑4 个月前
【已解决】el-table 前端分页多选、跨页全选等
前端·vue·element