jjzjj

vue+element UI之el-select和el-tree实现单选/复选/搜索组件封装

是开心的栗子呀 2023-10-12 原文

  最近在写代码的时候遇到一个需求,就是需要试用下拉菜单完成二级菜单选择、甚至有三级的菜单选择:
  UI提出此功能需要有以下三个要点:

  • 在不同的情况下要实现单选或者多选
  • 选择的内容要回调在输入框内
  • 既可以下拉选择又可以搜索选择
      基于此,我开始设计了这个组件。话不多说 上效果图。
  • 多选效果图
  • 单选效果图

     &emsp话不多说上代码:

父组件

<template>
    <div class="demo">
        <elTree :list="options" :defaultProps="defaultProps" @getdetail="getdetail" :selectType="selectType"> </elTree>
    </div>
</template>

<script>
import elTree from './elTree.vue'
export default {
    components: {
        elTree,
    },
    data() {
        return {
            options: [
                {
                    id: 1,
                    label: '一级 2',
                    value: '一级2',
                    disabled: false,
                    children: [
                        {
                            id: 3,
                            label: '二级 2-1',
                            value: '二级2-1',
                            disabled: false,
                            children: [
                                {
                                    id: 4,
                                    label: '三级 3-1-1',
                                    value: '三级3-1-1',
                                    disabled: false,
                                },
                                {
                                    id: 5,
                                    label: '三级 3-1-2',
                                    value: '三级3-1-2',
                                    disabled: false,
                                },
                            ],
                        },
                        {
                            id: 2,
                            label: '二级 2-2',
                            value: '二级2-2',
                            disabled: true,
                            children: [
                                {
                                    id: 6,
                                    label: '三级 3-2-1',
                                    value: '三级3-2-1',
                                    disabled: false,
                                },
                                {
                                    id: 7,
                                    label: '三级 3-2-2',
                                    value: '三级3-2-2',
                                    disabled: false,
                                },
                            ],
                        },
                    ],
                },
            ],
            // 数据格式化====必填
            defaultProps: {
                children: 'children',
                label: 'label',
                value: 'value',
            },
            //单选或者复选
            selectType: 'single',//multiple为多选
        }
    },
    methods: {
        //获取勾选数据
        getdetail(val) {
            console.log(val, '222222222')
        },
    },

}
</script>

子组件代码

<template>
    <div class="app-container caseManagementIndex scrollcontainer scrollcontainer_auto" ref="caseManagementIndex" v-if="list.length > 0">
        <el-select v-model="value" filterable :multiple="multiple" placeholder="请选择" :popper-append-to-body="false" :filter-method="assetsTypeFilter">
            <el-option :value="selectTree" class="setstyle" disabled>
                <el-tree
                    :data="list"
                    :props="defaultProps"
                    ref="tree"
                    node-key="id"
                    show-checkbox
                    check-strictly
                    :expand-on-click-node="false"
                    check-on-click-node
                    @check-change="checkChangeClick"
                    :filter-node-method="filterNode"
                ></el-tree>
            </el-option>
        </el-select>
    </div>
</template>

<script>
export default {
    name: 'caseManagementIndex',
    // import引入的组件需要注入到对象中才能使用PopupTreeInput
    components: {},
    props: {
        list: {
            type: Array,
            default: () => [],
        },
        defaultProps: {
            type: Object,
            default: {
                //children: 'children',
                //label: 'label',
            },
        },
        selectType: {
            type: String,
            default: 'multiple',
        },
    },
    data() {
        // 这里存放数据
        return {
            value: [],
            selectTree: [],
            multiple: true,
        }
    },
    // 监听属性 类似于data概念
    computed: {},
    // 监控data中的数据变化
    watch: {},
    // 生命周期 - 创建完成(可以访问当前this实例)
    created() {},
    // 生命周期 - 挂载完成(可以访问DOM元素)
    mounted() {
        console.log('flatten(fromData)', this.flatten(this.list))
        this.selectTree = this.flatten(this.list)
    },
    // 方法集合
    methods: {
        flatten(arr) {
            return [].concat(
                ...arr.map((item) => {
                    if (item.children) {
                        let arr = [].concat(item, ...this.flatten(item.children))
                        delete item.children
                        return arr
                    }
                    return [].concat(item)
                }),
            )
        },
        assetsTypeFilter(val) {
            // 下拉框调用tree树筛选
            //console.log(this, val)
            this.$refs.tree.filter(val)
        },
        checkChangeClick(data, self, child) {
            console.log(data, self, child, this.selectType)
            if (this.selectType == 'multiple') {
                let datalist = this.$refs.tree.getCheckedNodes()
                //console.log('datalist', datalist)
                this.value = []
                datalist.forEach((item) => {
                    this.value.push(item.label)
                })
                let values = datalist.map((item) => {
                    return item.value
                })
                this.$emit('getdetail', datalist)
            } else {
                if (self) {
                    this.$refs.tree.setCheckedNodes([data])
                    this.multiple = false
                    this.value = data.label
                    this.$emit('getdetail', data)
                }
            }
        },
        filterNode(value, data) {
            if (!value) return true
            return data.label.indexOf(value) !== -1
        },
    },
}
</script>
<style lang="scss">
.setstyle {
    min-height: 200px;
    padding: 0 !important;
    margin: 0;
    overflow: auto;
    cursor: default !important;
}
</style>
<style lang="scss" scoped></style>

  以上el-select和el-tree实现单选/复选/搜索组件封装就好啦。

实现思路:

1、可搜索

利用属性:filterable +方法 filter-method实现

2、复选和单选控制

利用**:multiple="multiple"selectType进行判断,不同的情况下,勾选的结果是单选还是多选,走不通的业务逻辑

  如果你觉得本文写的不错的话,记得收藏、关注和点赞哟,

有关vue+element UI之el-select和el-tree实现单选/复选/搜索组件封装的更多相关文章

  1. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  4. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  5. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  8. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  9. ruby - Arrays Sets 和 SortedSets 在 Ruby 中是如何实现的 - 2

    通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复

  10. ruby - "public/protected/private"方法是如何实现的,我该如何模拟它? - 2

    在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定

随机推荐