Vue2使用v-model封装ElementUI_Input组件

简介: 本文介绍了在Vue2中如何使用v-model封装ElementUI的Input组件。封装后的组件可以根据传入的title属性决定是否显示标题,支持正则表达式校验,并提供了在Vue页面中的使用示例。

核心

可以查阅这篇文章,看一些v-model的具体实现;
简介来讲,就是自定义属性和自定义方法的结合使用。
Vue2.0、Vue3.0分别使用v-model封装组件

首先新建脚手架引入element-ui组件和样式;

新建Input.vue组件:


<template>
  <div>
    <div class="inputBox" v-if="title">
      <p :style="titleStyle" class="inputBoxP">
        {
   {
    title }}<slot name="dropdown"></slot>
      </p>
      <el-input
        :disabled="disabled"
        type
        :autosize="type === 'textarea' ? { minRows: 4, maxRows: 4 } : {}"
        class="inputBoxIpt"
        v-bind:value="value"
        :placeholder="placeholder"
        @input="inputFun"
        @blur="blurFun"
      />
      <span class="isReauireSpan" v-if="isReauired">*</span>
    </div>
    <el-input
      :disabled="disabled"
      type
      :autosize="type === 'textarea' ? { minRows: 4, maxRows: 4 } : {}"
      v-else
      class="inputBoxIpt"
      v-bind:value="value"
      :placeholder="placeholder"
      @input="inputFun"
      @blur="blurFun"
    />
    <!-- <span class="isReauireSpan" v-if="isReauired">*</span> -->
  </div>
</template>

<script>
export default {
   
  model: {
   
    prop: "value",
    event: "inputFun",
  },
  props: {
   
    titleStyle: {
   
      type: String,
      require: false,
    },
    value: {
   
      type: String,
      require: false,
    },
    title: {
   
      type: String,
      require: false,
      // default: "请传入Titlt"
    },
    placeholder: {
   
      type: String,
      require: false,
      default: "请输入",
    },
    isReauired: {
   
      type: Boolean,
      require: false,
      default: false,
    },
    type: {
   
      type: String,
      require: false,
      default: "text",
    },
    disabled: {
   
      type: Boolean,
      require: false,
      default: false,
    },
    RegExpFlag: {
   
      type: String,
      require: false,
      default: "",
    },
  },
  methods: {
   
    inputFun(e) {
   
      if (this.RegExpFlag) {
   
        this.$emit("inputFun", e.replace(eval(this.RegExpFlag), ""));
        return;
      }
      this.$emit("inputFun", e);
    },
    blurFun(e) {
   
      this.$emit("blurFun", e.target.value);
    },
  },
};
</script>

<style lang="less" scoped>
.inputBox {
   
  margin-bottom: 10px;
  display: flex;
  justify-content: flex-start;
  align-items: center;
  width: var(--boxWidth);

  .inputBoxP {
   
    font-size: 12px;
    font-weight: 500;
    text-align: right;
    white-space: nowrap;
    width: 150px;
  }

  .inputBoxIpt {
   
    width: 200px;
  }
  /deep/.el-textarea {
   
    width: 200px !important;
  }
  /deep/.el-textarea__inner {
   
    width: 200px;
  }

  .isReauireSpan {
   
    color: #ff7875;
    font-size: 12px;
    margin-top: 8px;
    margin-left: 8px;
  }
}
</style>

我这里根据有没有传递title属性,做了渲染判断。原因在于这个组件要分别使用在form表单中和单独使用。

使用

使用肯定需要按部就班:引入_注册_页面使用。

import vInput from "@/components/elementCom/Input";

  components: {
   
    vInput,
  }

页面使用:

 <v-input v-model="msg" title="test1" />

data:

  data() {
   
    return {
   
      msg: "1",
      msg2: "2",
      msg3: "3",
      msg4: "4",
      msg5: "",
      msg6: "1",
      msg7: "2",
      msg8: ["3", "5"],
      startDate: new Date()
    };
  },

结果:
在这里插入图片描述
改变值:
在这里插入图片描述
收集输入的值:

 <el-button type="primary" @click="getAllInputFun">主要按钮</el-button>

  methods: {
   
  getAllInputFun() {
   
      console.log(this.$data,"data");
    },
  }

在这里插入图片描述
支持正则校验:

        <v-input
          RegExpFlag="/[^0-9]/g"
          titleStyle="text-align:left;width:150px"
          v-show="isShowFormItemFun('speedPercent')"
          v-model.number="speedPercent"
          title="百分比"
        >
          <template slot="dropdown">
            <el-dropdown @command="handleCommandspeedPercent" trigger="click">
              <span
                class="el-dropdown-link"
                :title="
                  commandFlagspeedPercent === '0' ? '大于等于' : '小于等于'
                "
              >
                {
  { commandFlagspeedPercent === "0" ? "≥" : "≤"
                }}<i class="el-icon-arrow-down el-icon--right"></i>
              </span>
              <el-dropdown-menu slot="dropdown">
                <el-dropdown-item title="大于等于" command="0"
                  ></el-dropdown-item
                >
                <el-dropdown-item title="小于等于" command="1"
                  ></el-dropdown-item
                >
              </el-dropdown-menu>
            </el-dropdown>
          </template>
        </v-input>
目录
相关文章
|
移动开发 缓存 JavaScript
2021最新阿里代码规范(前端篇)
2021最新阿里代码规范(前端篇)
56948 11
2021最新阿里代码规范(前端篇)
|
JavaScript
Vue2使用v-model封装ElementUI_CheckBox组件
本文介绍了在Vue2中如何使用v-model封装ElementUI的CheckBox组件。封装后的组件支持有标题和无标题的情况,并提供了在Vue页面中的使用示例,包括单独使用和在表单中的使用。
479 2
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
2645 1
|
数据格式
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
本文介绍了在ElementUI和ElementPlus中使用`el-table`组件实现合并行功能的技巧,包括多列合并和单列合并的方法,并提供了相应的示例代码和运行效果。
9973 1
使用小技巧实现el-table组件的合并行功能,ElementUI和ElementPlus都适用
|
前端开发 UED 容器
在 CSS 中使用 Flex 布局实现页面自适应时需要注意什么?
【10月更文挑战第22天】在使用 Flex 布局实现页面自适应时,需要对其基本原理和特性有深入的理解,同时结合具体的布局需求和场景,进行细致的调整和优化。通过合理的设置和注意事项的把握,才能实现理想的自适应效果,提升用户体验。还可以根据实际情况进行更深入的探索和实践,以不断提升 Flex 布局的应用能力。
|
JavaScript
Vue2.0、Vue3.0分别使用v-model封装组件[Vue必会]
本文介绍了在Vue 2和Vue 3中如何使用`v-model`来实现组件间的双向数据绑定,包括在Vue 2中使用`value`和`input`事件,以及在Vue 3中使用`modelValue`和`update:modelValue`事件的方法。
952 22
|
前端开发 JavaScript API
惊呆了!这些前端技巧竟然能让你的网站支持AR/VR体验!
【10月更文挑战第31天】在数字化时代,用户对网页交互体验的要求日益提高,传统二维网页已难以满足需求。本文介绍如何利用前端技术,特别是Three.js,实现AR/VR体验,提升用户满意度和网站价值。通过示例代码,展示如何创建简单的3D场景,并探讨AR/VR技术的基本原理和常用工具,帮助开发者打造沉浸式体验。
735 6
|
JavaScript UED
Vue + ElementUI 实现动态添加和删除表单项的多层嵌套表单
【10月更文挑战第5天】本示例展示了如何在 Vue.js 中使用 Element UI 组件实现动态添加和删除嵌套表单项。该表单包含设备信息、设备部位及其对应的任务列表,支持用户动态添加设备部位和任务,并提供相应的表单验证规则。
1629 0
Vue + ElementUI 实现动态添加和删除表单项的多层嵌套表单
|
前端开发 JavaScript API
2025年前端框架是该选vue还是react?有了大模型-例如通义灵码辅助编码,就不用纠结了!vue用的多选react,react用的多选vue
本文比较了Vue和React两大前端框架,从状态管理、数据流、依赖注入、组件管理等方面进行了详细对比。当前版本和下载量数据显示React更为流行,但Vue在国内用户量增长迅速。Vue 3通过组合式API提供了更灵活的状态管理和组件逻辑复用,适合中小型项目;React则更适合大型项目和复杂交互逻辑。文章还给出了选型建议,强调了多框架学习的重要性,认为技术问题已不再是选型的关键,熟悉各框架的最佳实践更为重要。
7940 1
vue2 自定义 v-model (model选项的使用)
vue2 自定义 v-model (model选项的使用)
1728 1