vue + element二次封装更灵活的Select组件

vue + element二次封装更灵活,更易维护的Select组件

前言

select下拉框组件应该是我们在做项目时用的频率比较高的组件之一了,只要涉及到查询,就少不了select下拉框,本文将介绍如何基于vue + element封装一个灵活、易维护的select组件。

1、新建select.vue

下面是select组件的完整代码,里面的内容我将在下面做详解

<template>
  <FormItem :label="label" :prop="dataIndex">
    <Select
      v-model="form[dataIndex]"
      :placeholder="placeholder"
      :size="size"
      :disabled="disabled"
      :clearable="clearable"
      :multiple="multiple"
      :multiple-limit="multipleLimit"
      @change="handleChange"
      style="width: 100%"
    >
      <Option v-for="item in options" :key="item.value" :label="item.name" :value="item.value"></Option>
    </Select>
  </FormItem>
</template>
<script>
import { FormItem, Select, Option } from "element-ui";
import  Store  from "./store/store";

export default {
  name: "selectC",
  components: { FormItem, Select, Option },
  props: {
    form: { required: true, type: Object }, // 表单域(必传)
    dataIndex: { required: true, type: String }, // 绑定值(必传)
    label: { type: String, default: "" }, // 表单项标签名
    disabled: { type: Boolean, default: false }, // 是否禁用
    size: { type: String, default: "medium" }, // 大小,可取值medium / small / mini
    placeholder: { type: String, default: "请选择" }, // 占位文本
    clearable: { type: Boolean, default: false }, // 是否可以清空选项
    multiple: { type: Boolean, default: false }, // 是否多选
    multipleLimit: { type: Number, default: 0 }, // 多选时限制最多选择的数量
    loadType: { type: String }
  },
  data() {
    return {
      store: new Store()
    };
  },
  computed: {
    options() {
      return this.store.SelectStore.getters.options;
    }
  },
  mounted() {
    this.store.SelectStore.dispatch("GET_SELECT_OPTIONS", {
      loadType: this.loadType
    });
  },
  methods: {
    handleChange(e) {
      this.$emit("handleChange", e);
    }
  }
};
</script>

props是组件需要的属性,从父组件传递过来,这里我们需要注意的是loadType这个字段,这个字段表示下拉框的值的加载类型,这个属性会在store中使用到。

另外,我还用到了vuex作为select的状态管理,组件每次被调用,都会实例化一个新的store,这样是防止页面中如果引入多个select组件,会导致下拉框的值不会更新。

关于store中内容,代码如下:

import Vue from 'vue'
import Vuex from 'Vuex'

Vue.use(Vuex)
import {objToArray} from '@/utils'
import {SELECT_TYPES, ORDER_STATUS, ORDER_STATUS_V, REAL_NAME_STATUS, REAL_NAME_STATUS_V} from '@/constants'

class Store {
  constructor() {
    this.SelectStore = this.initStore()
  }

  initStore() {
    return new Vuex.Store({
      state: {
        options: []
      },
      getters: {
        options(state) {
          return state.options
        }
      },
      mutations: {
        getOptions(state, options) {
          state.options = options
        }
      },
      actions: {
        GET_SELECT_OPTIONS({commit}, {loadType}) {
          let options
          switch (loadType) {
            case SELECT_TYPES.ORDER_STATUS:
              options = objToArray(ORDER_STATUS, ORDER_STATUS_V)
              break;
            case SELECT_TYPES.REAL_NAME_STATUS:
              options = objToArray(REAL_NAME_STATUS, REAL_NAME_STATUS_V)
              break;
          }
          commit('getOptions', options)
        }
      }
    })
  }
}

export default Store

我们创建一个Store类,类中的initStore用来创建store,GET_SELECT_OPTIONS方法用于根据传入的loadType字段判断需要加载的下拉框数据,constants文件是存在前端枚举的文件。
在这里插入图片描述
objToArray方法是把枚举转化成数组。

export const objToArray = (nameObj, valueObj) => {
  let arr = []
  Object.keys(nameObj).forEach(key => {
    Object.keys(valueObj).forEach(valKey => {
      if (key === valKey) {
        arr.push({name: nameObj[key], value: valueObj[valKey]})
      }
    })
  })
  return arr
}

2、页面中使用

<template>
  <Form>
    <SelectC :form="form" dataIndex="selectValue" :loadType="loadType" @handleChange="handleChange"/>
  </Form>
</template>

<script>
import SelectC from "@/components/form/Select";
import { Form } from "element-ui";
import { SELECT_TYPES } from "@/constants";
export default {
  name: "edit",
  components: { SelectC, Form },
  data() {
    return {
      form: {
        selectValue: ""
      },
      loadType: SELECT_TYPES.ORDER_STATUS
    };
  },
  methods:{
      handleChange(e){
          console.log(e)
      }
  }
};
</script>

页面效果
在这里插入图片描述

本文结束,感谢观看!觉得有帮助的点个赞!

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2中,对于element-ui组件二次封装,可以按照以下步骤进行: 1. 需求分析:明确需要封装element-ui组件,以及需要添加的功能和配置项。 2. 创建父组件:编写父组件的template和script代码,其中template中调用封装组件,script中定义需要传递给封装组件的props属性。 3. 创建封装组件:编写封装组件的template和script代码。在template中使用element-ui组件,并根据需要进行样式和布局的调整。在script中定义props属性,接收父组件传递的值,并监听element-ui组件的事件,触发update事件给父组件。 4. 通过临时变量传递值:由于父组件传递给封装组件的props不能直接作为封装组件的v-model属性传递给element-ui组件,所以需要在封装组件中定义一个临时变量来存储值,并将该变量与element-ui组件进行绑定。 5. 完成打通:在封装组件中监听中间件,接收到element-ui组件的update事件后,再将该事件传递给父组件。 总结来说,Vue2中对于element-ui组件二次封装,需要创建父组件封装组件,通过props属性传递值,并在封装组件中监听element-ui组件的事件并触发update事件给父组件。同时,需要使用临时变量来传递值给element-ui组件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Vue3+ts+element-plus 组件二次封装-- 页脚分页el-pagination的二次封装](https://blog.csdn.net/cs492934056/article/details/128096257)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值