elementUI之下拉选项加多选框功能实现vue3+ts

这篇具有很好参考价值的文章主要介绍了elementUI之下拉选项加多选框功能实现vue3+ts。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

根据
@牛先森家的牛奶
的代码修改后实现

<template>
    <div class="select-checked">
      <el-select
        v-model="selected"
        :class="{ all: optionsAll }"
        multiple
        placeholder="请选择"
        :popper-append-to-body="false"
      >
        <el-option :value="''" label="全部" class="multiple">
          <el-checkbox v-model="optionsAll" @change="handleOptionsAllChange" style="width: 100%;">
            全部
          </el-checkbox>
        </el-option>
        <el-option
          class="multiple"
          :value="item.value"
          :label="item.label"
          v-for="(item, key) in optionsData"
          :key="key"
        >
          <el-checkbox v-model="item.check" @change="handleTaskItemChange(item)" style="width: 100%;">
            {{ item.label }}
          </el-checkbox>
        </el-option>
      </el-select>
    </div>
  </template>
  
<script lang="ts">
  import { defineComponent } from 'vue';
  
  export default defineComponent({
    props: {
      options: {
        type: Array as () => Array<any>,
        required: true,
      }
    },
    data() {
      return {
        optionsData: [] as any[],
        optionsAll: false,
        selectedOptions: [] as any[],
      };
    },
    watch: {
      options: {
        handler(newVal) {
          this.optionsData = newVal;
          let checkedData = newVal.filter((item: any) => item.check);
          this.selectedOptions = checkedData.map((item: any) => item.value);
          this.optionsAll = checkedData.length === newVal.length;
        },
        immediate: true,
      }
    },
    mounted() {        
        // 在控件载入时触发父级的selected方法
        this.$emit('selected', this.selectedOptions);
    },
    computed: {
      selected: {
        get() {
          return this.selectedOptions.length > this.options.length ? [''] : this.selectedOptions;
        },
        set(value: any[]) {
          this.selectedOptions = value;
        },
      },
    },
    methods: {
      handleOptionsAllChange(isAll: boolean) {
        this.optionsData.forEach((elm: any) => {
          elm.check = isAll;
        });
        this.selectedOptions = isAll ? this.optionsData.map((item: any) => item.value) : [];
        this.$emit('selected', this.selectedOptions);
      },
      handleTaskItemChange(item: any) {
        if (!item.check) {
          this.selectedOptions = this.selectedOptions.filter((value: any) => value !== item.value);
        } else {
          this.selectedOptions.push(item.value);
        }        
        this.optionsAll = this.selectedOptions.length === this.optionsData.length;
        this.$emit('selected', this.selectedOptions);
      },
    },
  });
  </script>
  <style lang="scss">
  .select-checked {
    .el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after {
      content: '';
    }
    .el-checkbox {
      width: 100%;
      padding: 0 30px;
      .el-checkbox__label {
        margin-left: 20px;
      }
    }
    .el-select-dropdown__item {
      padding: 0;
    }
    .el-tag__close,
    .el-icon-close {
      display: none;
    }
    .el-tag.el-tag--info {
      background: transparent;
      border: 0;
    }
  
    .el-select {
      .el-select__tags {
        flex-wrap: nowrap;
        overflow: hidden;
        white-space: nowrap;
      }
      .el-tag {
        background-color: #fff;
        border: none;
        color: #606266;
        font-size: 13px;
        padding-right: 0;
        & ~ .el-tag {
          margin-left: 0;
        }
        &:not(:last-child)::after {
          content: ',';
        }
      }
    }
  }
  </style>

具体参考原博主文章,这里只对部分细节调整,记录一下文章来源地址https://www.toymoban.com/news/detail-581269.html

到了这里,关于elementUI之下拉选项加多选框功能实现vue3+ts的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包