Skip to content

UseElInput - 输入框

组件介绍

UseElInput 是基于 Element Plus 的 el-input 组件进行二次封装的通用输入框组件,在保留 el-input 原有核心功能的基础上,通过封装通用逻辑、扩展灵活的自定义内容插槽、统一默认配置等方式,简化了输入框的使用成本,同时增强了组件的扩展性和适配性,适配表单录入、搜索框、文本域等所有输入类业务场景。

核心亮点

  1. 统一默认配置,减少重复编码
  2. 自动识别字数限制,提升交互体验
  3. 灵活的自定义内容插槽,支持任意内容渲染
  4. 自动聚焦指令封装,简化焦点控制
  5. 双向绑定封装,简化值传递逻辑
  6. 完整继承 el-input 原生属性,兼容所有原生功能
  7. 响应式宽度控制,适配不同布局

解决痛点

  1. 原生 el-input「配置零散、重复编码」

痛点:原生 el-input 每次使用需重复设置 placeholder、clearable、rows 等基础属性,不同页面的输入框基础配置不统一,业务代码冗余,开发效率低。

解决方案:组件通过内置统一的默认配置,收敛基础属性,无需重复声明;同时支持 props 灵活覆盖默认值,兼顾通用性与个性化,减少 80% 以上的基础属性重复编码。

  1. 原生 el-input「自定义内容插槽渲染复杂」

痛点:原生 el-input 的前缀、后缀等插槽,需手动编写 <template #prefix> 等模板结构,且不支持任意内容(如组件、HTML 片段)的渲染,复杂自定义场景需额外封装,开发成本高。

解决方案:组件扩展 prefixContent、suffixContent 等 props,直接传递渲染内容,结合 UseRender 组件支持文本、组件、HTML 片段等任意类型内容渲染,无需编写繁琐的插槽模板,简化自定义开发。

  1. 密码框、字数限制「功能需手动关联,易漏绑错绑」

痛点:原生 el-input 中,密码框需手动绑定 show-password 属性,字数限制需手动关联 maxlength 和 show-word-limit 两个属性,易出现漏绑、错绑,导致功能异常,增加调试成本。

解决方案:组件自动识别属性,检测到 type="password" 自动开启 show-password,检测到 maxlength 自动开启 show-word-limit,无需手动关联,避免漏绑错绑问题,提升开发效率。

  1. 输入框单位展示「布局混乱、对齐不一致」

痛点:业务中常需在输入框右侧展示单位(如 “元”“%”),原生实现需手动编写布局代码,不同页面的单位布局不统一,易出现对齐错乱、样式混乱的问题,适配成本高。

解决方案:组件内置 unit 属性,搭配统一的 flex 布局,专门用于数值类输入框的单位渲染,无需手动编写布局代码,保证单位与输入框的对齐一致性,统一视觉样式。

  1. 输入框聚焦「逻辑分散、需手动编写」

痛点:表单、弹窗等场景中,需让输入框自动聚焦,原生需手动获取 DOM 元素并调用 focus() 方法,逻辑分散在各个页面,易出错且维护成本高。

解决方案:组件内置 vFocus 自定义指令,仅需给组件添加 autoFocus 属性,即可实现自动聚焦,无需手动编写聚焦逻辑,统一聚焦控制方式。

  1. 原生 el-input「与业务场景适配碎片化」

痛点:原生 el-input 仅提供基础输入功能,业务中需结合场景做大量适配(如文本域样式统一、密码框适配、字数统计、单位展示等),适配逻辑分散在各个页面,难以统一维护。

解决方案:组件将业务中高频的适配逻辑(文本域默认样式、密码框适配、字数统计等)封装为通用能力,开箱即用,无需重复开发适配逻辑,降低业务与基础组件的适配成本,保证所有页面输入框交互、样式统一。

使用

Types

js
/**
 * props接口
 */
export interface Props {
  /**
   * 双向绑定数据源 必传
   */
  modelValue: string
  /**
   * el-input组件的宽度
   */
  width?: string
  /**
   * placeholder
   */
  placeholder?: string
  /**
   * 是否可清空 默认是
   */
  clearable?: boolean
  /**
   * el-input头部插槽内容
   */
  prefixContent?: string | Record<string, any>
  /**
   * el-input尾部插槽内容
   */
  suffixContent?: string | Record<string, any>
  /**
   * el-input前置插槽内容
   */
  prependContent?: string | Record<string, any>
  /**
   * el-input后置插槽内容
   */
  appendContent?: string | Record<string, any>
  /**
   * 单位 显示在el-input的右外部
   */
  unit?: string | Record<string, any>
  /**
   * 控制是否能被用户缩放 仅type=textare生效
   */
  resize?: string
  /**
   * 输入框行数 仅type=textare生效
   */
  rows?: number
}

/**
 * emits接口
 */
export interface Emits {
  /**
   * 双向绑定数据源 即v-model
   */
  (e: 'update:modelValue', value: string): void
}

Props && Emits

js
const props = withDefaults(defineProps<Props>(), {
  placeholder: '请输入',
  clearable: true,
  resize: 'none',
  rows: 6
} satisfies DefaultsType<Props>)

const emits = defineEmits<Emits>()

基于 MIT 许可发布