基于Element UI的elselect组件进行封装的。该组件实现一个下拉选择框,具有许多可配置属性事件

创建组件index.vue (src/commonui/select/index.vue)
<template&gt;
  <el-select
    ref="select"
    v-model="hValue"
    :allow-create="allowCreate"
    :autocomplete="autocomplete"
    :automatic-dropdown="automaticDropdown"
    :clearable="clearable"
    :collapse-tags="collapseTags"
    :default-first-option="defaultFirstOption"
    :disabled="disabled"
    :filter-method="filterMethod"
    :filterable="filterable"
    :loading="loading"
    :loading-text="loadingText"
    :multiple="multiple"
    :multiple-limit="multipleLimit"
    :name="name"
    :no-match-text="noMatchText"
    :no-data-text="noDataText"
    :placeholder="placeholder"
    :popper-class="popperClass"
    :popper-append-to-body="popperAppendToBody"
    :remote="remote"
    :remote-method="remoteMethod"
    :reserve-keyword="reserveKeyword"
    :size="size"
    :key="poperKeyValue"
    :value-key="valueKey"
    @blur="handleBlur"
    @change="handleChange"
    @clear="handleClear"
    @focus="handleFocus"
    @remove-tag="handleRemoveTag"
    @visible-change="handleVisibleChange"
  >
    <slot name="prefix" slot="prefix"></slot>
    <slot name="option-content">
      <template v-for="(item, index) in dataSource">
        <el-option-group
          v-if="
            item[hProps.options] &amp;&amp;
              item[hProps.options].length > 0 &amp;&amp;
              !selectSpecial
          "
          :key="index"
          :label="item[hProps.label]"
          :disabled="item[hProps.disabled]"
        >
          <el-option
            v-for="(option, subIndex) in item[hProps.options]"
            :key="subIndex"
            :label="option[hProps.label]"
            :value="option[hProps.value]"
            :disabled="option[hProps.disabled]"
          ></el-option>
        </el-option-group>
        <el-option
          v-else-if="!item[hProps.options] &amp;&amp; !selectSpecial"
          :key="index + 'si'"
          :label="item[hProps.label]"
          :value="item[hProps.value]"
          :disabled="item[hProps.disabled]"
        ></el-option>
        <el-option
          v-else-if="!item[hProps.options] &amp;&amp; selectSpecial"
          :key="index + 'sp'"
          :label="`${item[hProps.label]}(${item[selectSpecial]})`"
          :value="item[hProps.value]"
          :disabled="item[hProps.disabled]"
        ></el-option>
      </template>
    </slot>
  </el-select>
</template>

<script>
export default {
  name: 'HSelect',
  props: {
    allowCreate: {
      type: Boolean,
      default: false
    },
    selectSpecial: {
      type: String,
      default: ''
    },
    autocomplete: String,
    automaticDropdown: {
      type: Boolean,
      default: false
    },
    clearable: {
      type: Boolean,
      default: true
    },
    collapseTags: {
      type: Boolean,
      default: false
    },
    dataSource: Array,
    defaultFirstOption: {
      type: Boolean,
      default: false
    },
    disabled: {
      type: Boolean,
      default: false
    },
    filterMethod: Function,
    filterable: {
      type: Boolean,
      default: true
    },
    loading: {
      type: Boolean,
      default: false
    },
    loadingText: String,
    multiple: {
      type: Boolean,
      default: false
    },
    multipleLimit: Number,
    name: String,
    noMatchText: String,
    noDataText: String,
    placeholder: String,
    popperClass: {
      type: String,
      default: 'select-default'
    },
    popperAppendToBody: {
      type: Boolean,
      default: true
    },
    remote: {
      type: Boolean,
      default: false
    },
    remoteMethod: Function,
    reserveKeyword: {
      type: Boolean,
      default: false
    },
    size: {
      type: String,
      validator (value) {
        return ['medium', 'small', 'mini'].indexOf(value) !== -1
      }
    },
    value: {
      type: [String, Number, Array, Boolean],
      required: true
    },
    valueKey: String,
    props: {
      type: Object,
      default () {
        return {}
      }
    },
    keyValue: {
      type: String,
      default: 'select-single'
    },
    align:{
      type: String,
      default: 'center'
    }
  },
  data () {
    return {
      poperKeyValue: ''
    }
  },
  computed: {
    hValue: {
      get () {
        let value = null
        if (this.multiple) {
          value = []
          if (this.value instanceof Array) {
            this.value.forEach(key => {
              if (this.checkValueExisting(key)) {
                value.push(key)
              }
            })
          }
        } else {
          value = ''
          if (this.checkValueExisting(this.value)) {
            value = this.value
          }
        }
        return value
      },
      set (value) {
        this.$emit('input', value)
      }
    },
    hProps () {
      return {
        label: 'name',
        value: 'id',
        disabled: 'disabled',
        options: 'options',
        ...this.props
      }
    }
  },
  watch: {
    keyValue (val) {
      this.poperKeyValue = val
    }
  },
  methods: {
    checkValueExisting (value) {
      if (this.allowCreate) {
        return value
      } else {
        if (this.dataSource instanceof Array) {
          let index = this.dataSource.findIndex(
            item => item[this.hProps.value] === value,
            this
          )
          return index > -1
        }
        return false
      }
    },
    handleBlur (event) {
      this.$emit('blur', event)
    },
    handleChange (value) {
      this.$emit('change', value)
    },
    handleClear () {
      this.$emit('clear')
    },
    handleFocus (event) {
      this.$emit('focus', event)
    },
    handleRemoveTag (tag) {
      this.$emit('remove-tag', tag)
    },
    handleVisibleChange (visible) {
      this.$emit('visible-change', visible)
    },
    focus () {
      this.$refs.select.focus()
    },
    blur () {
      this.$refs.select.blur()
    }
  }
}
</script>

<style lang="scss" scoped></style>

页面引入
<template>
  <div>
    <h-select :data-source="dataSource" v-model="selectedValue"></h-select>
  </div>
</template>
<script >
  import HSelect from '@/common-ui/select/index'
  export default {
    components: {
      HSelect
    },
    data() {
      return {
        dataSource:[],
        selectedValue: ''
      }
    }
    // ...
  }
</script>

确保你已经安装了Vue.js和Element UI,并在项目引入它们。

原文地址:https://blog.csdn.net/weixin_46328739/article/details/134736193

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_26480.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注