基于ele封装下拉菜单等组件

基于ele封装下拉菜单等组件方式1

下拉菜单组件SelectCom.vue

在这里插入图片描述

SelectCom.vue
<template>
  <div class="xSelect_container">
    <span :style="`width: ${labelWidth}`" class="xSelect_label">
      <span class="label_title"> {{ title }}</span>
    </span>
    <div class="xSelect_con" :style="`width: calc(100% - ${labelWidth})`">
      <el-select
        class="search-select"
        v-model="value"
        v-bind="$attrs"
        v-on="$listeners"
      >
        <el-option
          v-for="item in options"
          :key="item.value"
          :label="item.label"
          :value="item.value"
        >
        </el-option>
      </el-select>
    </div>
  </div>
</template>

<script>
/**
 * 属性介绍
 * * title 左侧标题 ;labelWidth 左侧标题宽度; options:数据(数组形式);
 * * ref="SelectComTest" 定义未了在父组件之中清空子组件的选中的值 =》 this.$refs.SelectComTest.value = "";
 * * 至于其他属性,则是按照slect原本的自带的属性进行传递
 * 使用例子
 * <SelectCom
    :title="'合作公司'"
    :labelWidth="'95px'"
    :options="options"
    @change="changeVal"
    ref="SelectComTest"
    disabled
  />
 */
export default {
  name: "SelectCom",
  components: {},
  props: {
    options: {
      type: Array,
      default() {
        return [];
      },
    },
    title: {
      type: String,
      default: "活动名称",
    },
    labelWidth: {
      type: String,
      default: "95px",
    },
  },
  data() {
    return {
      value: "",
    };
  },
  methods: {},
};
</script>
<style  lang="scss" scoped>
.xSelect_container {
  line-height: 32px;
  height: 32px;
  clear: both;
  .xSelect_label {
    float: left;
  }
  .xSelect_con {
    float: left;
  }
}
// .search-select下拉选择样式名称
.search-select {
  width: 100%;
}
.search-select ::v-deep .el-input__suffix {
  right: 10px;
}

.search-select ::v-deep .el-select .el-input .el-select__caret {
  line-height: 32px;
}

.search-select ::v-deep .el-input__inner {
  height: 32px;
}

::v-deep .el-input__icon {
  line-height: 25px;
}
</style>
使用下拉组件
<div class="seach-single">
  <SelectCom
    :title="'合作公司'"
    :labelWidth="'95px'"
    :options="options"
    @change="changeVal"
    ref="SelectComTest"
    disabled
  />
</div>
<div class="seach-single">
  <SelectCom
    :title="'合作货币'"
    :labelWidth="'95px'"
    :options="options2"
    @change="changeVal2"
    ref="SelectComTest2"
  />
</div>
import SelectCom from "./SelectCom.vue";
export default {
  name: "XXX",
  components: {
    SelectCom,
  },
  data() {
    return {
      options: [
        {
          value: "1",
          label: "菜鸡1",
        },
        {
          value: "2",
          label: "菜鸡2",
        },
      ],
      options2: [
        {
          value: "1",
          label: "混子1",
        },
        {
          value: "2",
          label: "混子2",
        },
      ],
    };
  },
  // 回显数据
  init(){
 	this.$refs.SelectComTest.value = 0;
 },
  changeVal(val) {
    console.log("val", val);
  },
  changeVal2(val) {
    console.log("changeVal2", val);
  },
  // 重置
  resetForm() {
    this.$refs.SelectComTest.value = "";
    this.$refs.SelectComTest2.value = "";
  },

单独一个日期选择组件

在这里插入图片描述

SingleData.vue
<!-- 单选日期等 -->
<template>
  <div class="xSelect_container">
    <span :style="`width: ${labelWidth}`" class="xSelect_label">
      <span class="label_title"> {{ title }}</span>
    </span>
    <div class="xSelect_con" :style="`width: calc(100% - ${labelWidth})`">
      <el-date-picker
        class="single-date-picker"
        style="height: '32px'"
        v-model="value"
        value-format="yyyy-MM-dd"
        v-bind="$attrs"
        v-on="$listeners"
        placeholder="选择日期"
      >
      </el-date-picker>
    </div>
  </div>
</template>

<script>
/**
 * 属性介绍
 * * title 左侧标题 ;labelWidth 左侧标题宽度;
 * * ref="SelectComTest" 定义未了在父组件之中清空子组件的选中的值 =》 this.$refs.SelectComTest.value = "";
 * * 至于其他属性,则是按照原本的自带的属性进行传递
 * 使用例子
  <SingleData
    :title="'还款日期'"
    @change="SingleDataChange"
    ref="SingleDataTest1"
    type="date"
  />
 */
export default {
  name: "SingleData",
  components: {},
  props: {
    title: {
      type: String,
      default: "活动名称",
    },
    labelWidth: {
      type: String,
      default: "95px",
    },
  },
  data() {
    return {
      value: "",
    };
  },
};
</script>
<style  lang="scss" scoped>
.xSelect_container {
  line-height: 32px;
  height: 32px;
  clear: both;
  .xSelect_label {
    float: left;
  }
  .xSelect_con {
    float: left;
  }
}
// 单个日期选择器 single-date-picker
.single-date-picker {
  width: 100%;
}
</style>
使用该组件
        <div class="seach-single">
          <SingleData
            :title="'还款日期'"
            @change="SingleDataChange"
            ref="SingleDataTest1"
            type="date"
          />
        </div>
        <div class="seach-single">
          <SingleData
            :title="'退款日期'"
            @change="SingleDataChange2"
            ref="SingleDataTest2"
            type="month"
          />
        </div>

    SingleDataChange(val){
      console.log("SingleDataChange", val);
    },
    SingleDataChange2(val){
      console.log("SingleDataChange2", val);
    },
    // 重置
    resetForm() {
      this.$refs.SingleDataTest1.value = "";
      this.$refs.SingleDataTest2.value = "";
    },

双日期选择组件

在这里插入图片描述

DoubleData.vue
<template>
  <div class="xSelect_container">
    <span :style="`width: ${labelWidth}`" class="xSelect_label">
      <span class="label_title"> {{ title }} : </span>
    </span>
    <div class="xSelect_con" :style="`width: calc(100% - ${labelWidth})`">
      <el-date-picker
        v-model="value"
        type="daterange"
        range-separator="至"
        start-placeholder="开始日期"
        end-placeholder="结束日期"
        value-format="yyyy-MM-dd"
        v-bind="$attrs"
        v-on="$listeners"
      >
      </el-date-picker>
    </div>
  </div>
</template>

<script>
/**
 * 属性介绍
 * * title 左侧标题 ;labelWidth 左侧标题宽度; options:数据(数组形式);
 * * ref="SelectComTest" 定义未了在父组件之中清空子组件的选中的值 =》 this.$refs.SelectComTest.value = "";
 * * 至于其他属性,则是按照slect原本的自带的属性进行传递
 * 使用例子
 * <DoubleData
    :title="'货币日期'"
    @change="DoubleDataChange"
    ref="SelectComTest"
    disabled
  />
 */
export default {
  name: "DoubleData",
  components: {},
  props: {
    title: {
      type: String,
      default: "活动名称",
    },
    labelWidth: {
      type: String,
      default: "95px",
    },
  },
  data() {
    return {
      value: "",
    };
  },
  methods: {},
};
</script>
<style  lang="scss" scoped>
.xSelect_container {
  line-height: 32px;
  height: 32px;
  clear: both;
  .xSelect_label {
    float: left;
  }
  .xSelect_con {
    float: left;
    overflow: hidden;
    line-height: 32px;
    height: 32px;
    border: 1px solid #dcdfe6;
  }
}
// 日期选择样式名称
::v-deep .el-input__inner {
  width: 100%;
}

::v-deep .el-date-editor {
  padding: 0 1px;
  width: 100%;
  border: none;
}
::v-deep .el-range-input {
  width: 40%;
  font-size: 12px;
  margin-top: -5px;
}
::v-deep .el-range-separator {
  width: 8%;
  padding: 0;
  font-size: 12px;
  line-height: 34px;
}
::v-deep .el-range__icon {
  margin-top: -3px;
}
</style>
使用组件
        <div class="seach-single">
          <DoubleData
            :title="'货币日期'"
            @change="DoubleDataChange"
            ref="DoubleDataTest"
          />
        </div>
        <div class="seach-single">
          <DoubleData
            :title="'货币日期2'"
            @change="DoubleDataChange2"
            ref="DoubleDataTest2"
          />
        </div>

    DoubleDataChange(val){
      console.log("DoubleDataChange",val);
    },
    DoubleDataChange2(val){
      console.log("DoubleDataChange2",val);
    },
    // 重置
    resetForm() {
      this.$refs.DoubleDataTest.value = "";
      this.$refs.DoubleDataTest2.value = "";
    },

单个输入框组件

在这里插入图片描述

SingleInput.vue
<template>
  <div class="xSelect_container">
    <span :style="`width: ${labelWidth}`" class="xSelect_label">
      <span class="label_title"> {{ title }}</span>
    </span>
    <div class="xSelect_con" :style="`width: calc(100% - ${labelWidth})`">
      <el-input
        v-model="value"
        v-bind="$attrs"
        v-on="$listeners"
        placeholder="请输入"
      ></el-input>
    </div>
  </div>
</template>

<script>
/**
 * 属性介绍
 * * title 左侧标题 ;labelWidth 左侧标题宽度; propsValue:需要回显的值;
 * * ref="SingleInputInput2" 定义未了在父组件之中清空子组件的选中的值 =》 this.$refs.SingleInputInput2.value = "";
 * * 至于其他属性,则是按照slect原本的自带的属性进行传递
 * 使用例子
 * <SingleInput
    :title="'申请编号2'"
    ref="SingleInputTest2"
    v-debounce="SingleInputInput2"
  />
 */
export default {
  name: "SingleInput",
  props: {
    propsValue: {
      type: String,
      default: "",
    },
    title: {
      type: String,
      default: "活动名称",
    },
    labelWidth: {
      type: String,
      default: "95px",
    },
  },
  components: {},
  data() {
    return {
      value: this.propsValue,
    };
  },
  methods: {},
};
</script>
<style  lang="scss" scoped>
.xSelect_container {
  line-height: 32px;
  height: 32px;
  clear: both;
  .xSelect_label {
    float: left;
  }
  .xSelect_con {
    float: left;
  }
}
::v-deep .el-input__inner {
  height: 32px;
  line-height: 32px;
}
</style>
使用组件
        <div class="seach-single">
          <SingleInput
            :title="'申请编号'"
            propsValue="112233"
            ref="SingleInputTest"
            v-debounce="SingleInputInput"
          />
        </div>
        <div class="seach-single">
          <SingleInput
            :title="'申请编号2'"
            ref="SingleInputTest2"
            v-debounce="SingleInputInput2"
          />
        </div>

    SingleInputInput(){
      console.log("SingleInputTest", this.$refs.SingleInputTest.value);
    },
    SingleInputInput2(){
      console.log("SingleInputTest2", this.$refs.SingleInputTest2.value);
    },
    // 重置
    resetForm() {
      this.$refs.SingleInputTest2.value = "";
      this.$refs.SingleInputTest.value = "";
    },
防抖指令
1: directive 文件夹下 debounce.js
import Vue from 'vue';

Vue.directive('debounce', {
  inserted: function (el, binding) {
    let timer;
    el.addEventListener("input", () => {
      if (timer) {
        clearTimeout(timer);
      }
      timer = setTimeout(() => {
        // 关键点:vue的自定义指令传递的参数binding如果是一个函数,则通过binding.value()来执行
        binding.value();
      }, 500)
    })
  }
});

2:main.js
import "@/directive/debounce.js"
3:使用  v-debounce="SingleInputInput2" 该事件的值,需要使用ref方式拿到

双input组件

在这里插入图片描述

DoubleInput.vue
<template>
  <div class="xSelect_container">
    <span :style="`width: ${labelWidth}`" class="xSelect_label">
      <span class="label_title"> {{ title }}</span>
    </span>
    <div class="xSelect_con" :style="`width: calc(100% - ${labelWidth})`">
      <el-input
        class="input"
        v-model="value1"
        @change="inputbefore"
        placeholder="请输入"
        type="number"
      ></el-input>
      <div class="interval">~</div>
      <el-input
        class="input input2"
        v-model="value2"
        @change="inputAfter"
        placeholder="请输入"
        type="number"
      ></el-input>
    </div>
  </div>
</template>

<script>
/**
 * 属性介绍
 * * title 左侧标题 ;labelWidth 左侧标题宽度; options:数据(数组形式);
 * * ref="DoubleInputTest2" 定义未了在父组件之中清空子组件的选中的值 =》 this.$refs.DoubleInputTest2.value1 / value2 = "";
 * * 至于其他属性,则是按照slect原本的自带的属性进行传递
 * * 事件 inputbefore  与 inputAfter 两个输入框事件
 * 使用例子
  <DoubleInput
    :title="'财资处2'"
    ref="DoubleInputTest2"
    @inputbefore="inputbefore2"
    @inputAfter="inputAfter2"
  />
 */
export default {
  name: "DoubleInput",
  props: {
    propsValue: {
      type: String,
      default: "",
    },
    title: {
      type: String,
      default: "活动名称",
    },
    labelWidth: {
      type: String,
      default: "95px",
    },
  },
  components: {},
  data() {
    return {
      value1: "",
      value2: "",
    };
  },
  methods: {
    inputbefore() {
      this.$emit("inputbefore", this.value1);
    },
    inputAfter() {
      this.$emit("inputAfter", this.value2);
    },
  },
};
</script>
<style  lang="scss" scoped>
.xSelect_container {
  line-height: 32px;
  height: 32px;
  clear: both;
  .xSelect_label {
    float: left;
  }
  .xSelect_con {
    float: left;
  }
}
.xSelect_con {
  position: relative;
  line-height: 32px;
  height: 32px;
  overflow: hidden;
  border: 1px solid #dcdfe6;
  & > .input {
    border: none;
    outline: none;
    height: 30px;
    line-height: 30px;
    width: 45%;
  }
  & > .input {
    float: left;
  }
  & > .input2 {
    float: right;
  }
  & > .interval {
    z-index: 10;
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
    margin: auto;
    width: 10px;
    height: 10px;
    line-height: 10px;
    color: #c0c4cc;
  }
}
::-webkit-input-placeholder {
  color: #c0c4cc;
}
::v-deep .el-input__inner {
  text-align: center;
  height: 30px;
  border: none;
  font-size: 12px;
  padding: 0;
  margin: 0;
}
</style>
使用组件
        <div class="seach-single">
          <DoubleInput
            :title="'财资处'"
            ref="DoubleInputTest"
            @inputbefore="inputbefore1"
            @inputAfter="inputAfter1"
          />
        </div>
        <div class="seach-single">
          <DoubleInput
            :title="'财资处2'"
            ref="DoubleInputTest2"
            @inputbefore="inputbefore2"
            @inputAfter="inputAfter2"
          />
        </div>

    inputbefore1(val) {
      console.log("inputbefore1", val);
    },
    inputAfter1(val) {
      console.log("inputAfter1", val);
    },
    inputbefore2(val) {
      console.log("inputbefore2", val);
    },
    inputAfter2(val) {
      console.log("inputAfter2", val);
    },
    // 重置
    resetForm() {
      this.$refs.DoubleInputTest.value1 = "";
      this.$refs.DoubleInputTest.value2 = "";
      this.$refs.DoubleInputTest2.value1 = "";
      this.$refs.DoubleInputTest2.value2 = "";
   }

基于ele封装下拉菜单等组件 方式2

在这里插入图片描述

singleSearch组件

<template>
  <div class="single-search clear_fix">
    <div class="xSelect_wrap" :style="`width: calc(100% - ${labelWidth})`">
      <slot></slot>
    </div>
    <span :style="`width: ${labelWidth}`" class="xSelect_label">
      <span class="label_title"> {{ title }} : </span>
    </span>
  </div>
</template>
<script>
/**
 * singleSearch
 *
 * @module components/singleSearch
 * @desc 下拉菜单等组件
 * @param labelWidth {String} - label宽度
 * @param title {String} - label名称
 * @param 传入的组件需要加上以下类名:
 * @param search-input  输入筐样式名称覆盖
 * @param date-picker  日期选择样式名称
 * @param search-select  下拉选择样式名称
 * @param 使用示例
 *       <single-search :labelWidth="'95px'" >
            <el-input
                class="search-input"
                ref="input"
                placeholder="请输入"
                v-model="value"
                :disabled="isDisabled"
            ></el-input>
        </single-search>
 *
*/
export default {
  name: "singleSearch",
  props: {
    labelWidth: {
      type: String,
      default: "94px",
    },
    title: {
      type: String,
      default: "活动名称",
    },
  },
  data() {
    return {};
  },
};
</script>
<style  lang="scss" scoped>
.single-search {
  width: 100%;
  .xSelect_wrap {
    line-height: 32px;
    height: 32px;
  }
}
</style>

使用组件

          <single-search :labelWidth="'95px'" :title="'险种'">
            <el-select class="search-select" v-model="select2.value" @change="itemchange">
              <el-option
                v-for="item in select2.options"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </single-search>

<style  lang="scss" scoped>
@import "@/assets/css/eleInput.scss";
</style>
样式
  // 输入筐样式名称覆盖
  ::v-deep .el-input__inner{
    height: 32px;
    line-height: 32px;
  }
  // 日期选择样式名称
  ::v-deep .el-input__inner{
    width: 100%;
  }
  .date-picker .el-range-editor.el-input__inner{
    height: 32px;
    line-height: 32px;
    
  }
  .date-picker .el-range__close-icon{
    line-height: 25px;
  }
  .date-picker .el-date-editor {
    padding: 0 1px;
    width: 100%;
    border: none;
  }
  .date-picker .el-range-input {
    width: 40%;
    font-size: 12px;
  }
  .date-picker .el-range-separator {
    width: 8%;
    padding: 0;
    font-size: 12px;
    line-height: 25px;
  }
  .date-picker .el-range__icon {
    margin-top: -8px;
  }
  ::v-deep .el-date-editor .el-range-separator{
    line-height: 25px;
  }
  // .search-select下拉选择样式名称
  .search-select {
    width: 100%;
  }
  .search-select  ::v-deep .el-input__suffix{
    right: 10px;
  }
  .search-select ::v-deep .el-select .el-input .el-select__caret{
    line-height: 32px;
  }
  .search-select ::v-deep .el-input__inner {
    height: 32px;
  }
  ::v-deep .el-input__icon {
    line-height: 25px;
  }
  // 单个日期选择器 single-date-picker
  .single-date-picker {
    width: 100%;
  }

  // 双input的
  .double-input-wrap {
    width: 100%;
    border: 1px solid #DCDFE6;
    overflow: hidden;
    clear: both;
  }
  .double-input {
    width: 45%;
    height: 30px;
    line-height: 30px;

    ::v-deep .el-input__inner {
      border: none !important;
    }
    .double-input:nth-child(1) {
      float: left;
    }
    span {
      float: left;
      width: 10%;
      text-align: center;
    }
    .double-input:nth-child(2) {
      float: left;
    }
  }

使用组件 单个日期与两个输入框

在这里插入图片描述

        <div class="seach-single">
          <single-search :labelWidth="'95px'" :title="'日期'">
            <el-date-picker
              class="single-date-picker"
              v-model="value1"
              type="date"
              placeholder="选择日期"
            >
            </el-date-picker>
          </single-search>
        </div>
        <div class="seach-single">
          <single-search :labelWidth="'95px'" :title="'金额'">
            <div class="double-input-wrap">
              <el-input
                class="double-input"
                v-model="input1"
                placeholder="请输入"
                @change="inputchange1"
              ></el-input>
              <span></span>
              <el-input
                class="double-input"
                v-model="input2"
                placeholder="请输入"
              ></el-input>
            </div>
          </single-search>
        </div>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue封装ElementUI的Steps组件的方法有很多种,其中一种常见的方法是使用vue-ele-steps插件对ElementUI中的Steps组件进行进一步封装。这个插件的目的是减少HTML结构的复杂性,同时保留ElementUI Steps组件的所有功能。 另外一种方法是通过安装babel-plugin-component插件来按需导入和打包ElementUI中的组件。首先,需要安装ElementUI,然后使用npm install babel-plugin-component -D来安装babel-plugin-component插件。接着,在babel.config.js中配置插件,指定需要按需加载的组件。这样在打包时,只会将使用到的组件打包到项目中,从而减小项目体积并提高访问速度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vueelesteps让elementuisteps更简单](https://download.csdn.net/download/weixin_39840387/11516581)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Vue--ElementUI组件库](https://blog.csdn.net/weixin_43285360/article/details/120311866)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值