【Vue】二次封装elementUI自定义样式的input搜索框

【Vue】二次封装elementUI自定义样式的input搜索框

接手的项目中多处使用了一个按照设计稿样式的搜索框,为了提高复用率,对其进行封装。
以此文章做工作记录

1. 整体效果

按照项目的需要,要实现的功能比较简单:

  • 自定义的清空图标
  • 可控输入框右边是否有按钮
  • 回车/输入事件都可触发搜索
    在这里插入图片描述
    在这里插入图片描述

代码关键点:

  • 使得外部v-model的绑定正常工作
  • 组件内部对外部数据的清空
  • 其他输入框事件的绑定

2. 如何使得外部v-model正常工作

众所周知v-model是输入框双向绑定的语法糖,本质上是

:value="value" @input="value = $event.target.value"

组件使用v-model,也就是相当于给组件绑定了一个value值,和一个input事件。
因此在组件内接收即可:

export default {
	name:"SearchInput",
    props:{
      value: [String, Number]
    }
}

然后对组件内的input标签绑定好value值,这里的@input直接$emit触发外部的input事件,并且传入参数$event
v-bind="$attrs"用于值的绑定穿透,能直接把没有在props声明的其他绑定值,直接传递到内部的el-input框,只要有这个,直接在组件外面绑定的placeholder值,class值都会直接同步到这里。

v-on="$listeners"同理,指的是事件的绑定穿透,另外还有$scopedSlots插槽穿透,这里并不需要所以不拓展说明。

    <el-input
      :value="value"
      @input="$emit('input', $event)"
      v-bind="$attrs"
    >
    </el-input>

这样外部的v-model就可以正常工作了。

3. 补充自定义的样式和事件绑定

按照项目原本的需求,补充自定义的样式,还有el-input的插槽。
至于清空输入的按钮,按照设计稿,没有使用原生的clearable属性,而是添加作为el-input的suffix插槽。

  • prefix前置:搜索图标
  • suffix后置:清空输入的图标
  • append附加:搜素按钮
<i slot="prefix"><img :src="CommonImg.search" alt=""></i>
<i slot="suffix" v-if="empty" class="el-icon-close" @click="handleClear"></i>
<el-button slot="append" v-if="hasBtn"  type="primary" @click="$emit('enter',value)">搜索</el-button>

搜索按钮根据外部传入的参数决定:

    props:{
      value: [String, Number],
      hasBtn:Boolean
    }

清空输入图标的出现按照当前是否有输入决定
由于vue的单向数据流,不提倡在子组件内部直接修改父组件的参数,因此清空输入不是给value清空,而是是触发外部的函数来进行清除。

    watch:{
      value(newValue){
        if(newValue !== ''){
          this.empty = true;
        }else{
          this.empty = false;
        }
      },
    },
    methodes:{
    	//清除输入
      handleClear() {
        this.$emit('input', '');
        this.$emit('change', '');
        this.$emit('clear');
      },
    }

4. SearchInput源码

这里根据需要添加了一些操作和回调…
此外,组件内还可以更改外界v-model绑定的变量
虽然默认绑定值是value,事件是input
但可以在vc配置里面的model属性,修改为checkedchange 等用于其他作用。

<template>
  <div>
    <el-input
      :value="value"
      @input="$emit('input', $event)"
      v-bind="$attrs"
      @mouseenter="hovering = true"
      @mouseleave="hovering = false"
      @focus="handleFocus"
      @blur="handleBlur"
      @keyup.native.enter="handleEnter"
    >
      <i slot="prefix"><img :src="CommonImg.search" alt=""></i>
      <i slot="suffix" v-if="empty" class="el-icon-close" @click="handleClear"></i>
      <el-button slot="append" v-if="hasBtn"  type="primary" @click="$emit('enter',value)">搜索</el-button>
    </el-input>
  </div>
</template>

<script>
import {CommonImg} from '@/assets'
  export default {
    name:"SearchInput",
    props:{
      value: [String, Number],
      hasBtn:Boolean
    },
    data(){
      return {
        CommonImg,
        hovering: false,
        focused: false,
        empty:false,
      }
    },
    watch:{
      value(newValue){
        if(newValue !== ''){
          this.empty = true;
        }else{
          this.empty = false;
        }
      },
    },
    methods:{
      handleFocus(event) {
          this.focused = true;
          this.$emit('focus', event);
      },
      handleBlur(event) {
          this.focused = false;
          this.$emit('blur', event);
      },
      handleEnter(){
        // 这里可以包一个防抖 handleEnter:debounce(function(){ ... })
        if(this.value === '') return;
        this.$emit('enter',this.value)
      },
      handleClear() {
        this.$emit('input', '');
        this.$emit('change', '');
        this.$emit('clear');
      },
    },
  }
</script>
<style lang="less" scoped>
	//...样式自定义
</style>

5. 使用例:

点击搜索按钮,使用回车进行查询的类型:

<SearchInput v-model="warningInfoSearchInput" 
	placeholder="请输入任务名称检索" hasBtn
	@enter="warningInfoSearch"/>

输入内容就查询的类型:

<SearchInput placeholder="请输入关键字检索"
   v-model="searchInfo" @input="changeSearchInfo" />
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,可以通过对axios进行二次封装来实现el-input的功能。通过引用中的代码可以看出,一次封装的axios请求被包裹在debounceFun函数中。该函数会延迟一定时间后再执行axios请求,以防止频繁的请求。在这里,debounceFun函数被用于监听搜索框内容的变化,并在输入完成后执行搜索函数。 另外,引用中的代码提供了Vue中使用el-input的示例。其中,el-input是一个Vue组件,通过v-model绑定search变量来实现数据的双向绑定。通过输入框的变化,使用watch监听search变量的变化,一旦输入完成,就会执行debounceFun函数中的搜索函数。 最后值得注意的是,引用中的debounceFun函数和throttleFun函数是具体实现防抖和节流的工具函数,可以在Vue项目中直接使用。这两个函数分别用于控制函数的执行频率,保证在一定时间内只执行一次搜索函数。 综上所述,在Vue中,可以通过对axios进行二次封装,并结合el-input组件、debounceFun函数和watch来实现输入框的搜索功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [el-input输入框的监听以及防抖节流的实现](https://blog.csdn.net/m0_74149462/article/details/128978865)[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_1"}}] [.reference_item style="max-width: 50%"] - *2* [go语言恶意代码检测系统-对接前端可视化与算法检测部分](https://download.csdn.net/download/liufang_imei/88222624)[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_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值