当前位置:首页 > VUE

vue 实现input封装

2026-02-19 15:47:03VUE

封装基础Input组件

创建一个基础的Input.vue文件,包含props接收父组件传递的参数:

<template>
  <input
    :type="type"
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
    :placeholder="placeholder"
    :disabled="disabled"
    class="base-input"
  />
</template>

<script>
export default {
  name: 'BaseInput',
  props: {
    type: {
      type: String,
      default: 'text'
    },
    modelValue: {
      type: [String, Number],
      default: ''
    },
    placeholder: {
      type: String,
      default: ''
    },
    disabled: {
      type: Boolean,
      default: false
    }
  }
}
</script>

<style scoped>
.base-input {
  padding: 8px 12px;
  border: 1px solid #ddd;
  border-radius: 4px;
}
</style>

实现v-model支持

使用Vue3的v-model语法糖或Vue2的.sync修饰符:

<!-- Vue3写法 -->
<BaseInput v-model="username" />

<!-- Vue2写法 -->
<BaseInput :value.sync="username" />

添加表单验证功能

扩展组件支持验证状态显示:

<template>
  <div class="input-wrapper">
    <input
      <!-- 原有属性 -->
      :class="{'error': error}"
    />
    <span v-if="error" class="error-message">{{ errorMessage }}</span>
  </div>
</template>

<script>
export default {
  props: {
    error: Boolean,
    errorMessage: String
  }
}
</script>

<style>
.error {
  border-color: red;
}
.error-message {
  color: red;
  font-size: 12px;
}
</style>

添加插槽增强灵活性

支持前缀/后缀插槽:

<template>
  <div class="input-container">
    <span v-if="$slots.prefix" class="prefix">
      <slot name="prefix"></slot>
    </span>
    <input <!-- 原有input --> />
    <span v-if="$slots.suffix" class="suffix">
      <slot name="suffix"></slot>
    </span>
  </div>
</template>

支持清除功能

添加清除按钮:

<template>
  <div class="input-with-clear">
    <input <!-- 原有属性 --> />
    <button 
      v-if="showClear && modelValue" 
      @click="$emit('update:modelValue', '')"
      class="clear-btn"
    >×</button>
  </div>
</template>

<script>
export default {
  props: {
    showClear: {
      type: Boolean,
      default: false
    }
  }
}
</script>

完整示例组件

综合所有功能的完整组件:

<template>
  <div class="custom-input" :class="{'disabled': disabled}">
    <label v-if="label" class="input-label">{{ label }}</label>
    <div class="input-group">
      <slot name="prefix"></slot>
      <input
        :type="type"
        :value="modelValue"
        @input="handleInput"
        @blur="$emit('blur')"
        @focus="$emit('focus')"
        :placeholder="placeholder"
        :disabled="disabled"
        :class="{'error': error}"
      />
      <button 
        v-if="clearable && modelValue" 
        @click="handleClear"
        class="clear-btn"
      >×</button>
      <slot name="suffix"></slot>
    </div>
    <span v-if="error && errorMessage" class="error-message">
      {{ errorMessage }}
    </span>
  </div>
</template>

<script>
export default {
  name: 'CustomInput',
  props: {
    type: { /* 同上 */ },
    modelValue: { /* 同上 */ },
    label: String,
    clearable: Boolean,
    // 其他props...
  },
  methods: {
    handleInput(e) {
      this.$emit('update:modelValue', e.target.value)
    },
    handleClear() {
      this.$emit('update:modelValue', '')
      this.$emit('clear')
    }
  }
}
</script>

<style scoped>
/* 完整样式 */
.custom-input {
  margin-bottom: 16px;
}
.input-group {
  position: relative;
  display: flex;
  align-items: center;
}
.clear-btn {
  position: absolute;
  right: 8px;
  background: transparent;
  border: none;
  cursor: pointer;
}
/* 其他样式... */
</style>

全局注册组件

在main.js中全局注册:

import CustomInput from '@/components/CustomInput.vue'

// Vue3
app.component('CustomInput', CustomInput)

// Vue2
Vue.component('CustomInput', CustomInput)

vue 实现input封装

标签: vueinput
分享给朋友:

相关文章

vue 实现简单登陆

vue 实现简单登陆

以下是一个使用 Vue 3 实现的简单登录功能示例,包含表单验证和基础交互逻辑: 创建 Vue 组件 <template> <div class="login-containe…

vue实现轮询

vue实现轮询

实现轮询的基本方法 在Vue中实现轮询可以通过setInterval或setTimeout配合递归调用完成。轮询通常用于定期向服务器请求数据更新。 使用setInterval的简单示例: da…

vue实现点击

vue实现点击

实现点击事件的基本方法 在Vue中实现点击事件可以通过v-on指令或@简写方式绑定。以下是常见的点击事件绑定方法: <template> <button v-on:click=…

vue实现贴图

vue实现贴图

Vue 实现贴图功能 在Vue中实现贴图功能通常涉及将图片动态添加到指定位置或元素上。以下是几种常见实现方式: 使用v-bind动态绑定图片 通过数据驱动的方式动态更换图片源: <tem…

vue 实现列表

vue 实现列表

Vue 实现列表的方法 在 Vue 中实现列表通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 指令遍历数组,渲染列表项。ite…

vue实现图片

vue实现图片

Vue 实现图片功能的方法 静态图片引入 在 Vue 项目中,可以通过 src 属性直接引入静态图片。图片通常放在 public 或 assets 目录下。 <template> &…