首页 > 其他分享 >Vue 自定义组件

Vue 自定义组件

时间:2023-08-09 22:44:38浏览次数:42  
标签:Vue 自定义 clear value 组件 input model select

下面有一个例子。

<template>
  <el-input
    :value="value"
    @click.native="select"
    readonly>
    <i class="el-icon-circle-close" slot="suffix" @mousedown.prevent @click.stop="clear"/>
  </el-input>
</template>

<script>
export default {
  name: 'ElDialogSelect',
  // 自定义 v-model
  model: {
    prop: 'value',
    event: 'clear'
  },
  props: {
    value: [String, Number]
  },
  methods: {
    // 自定义事件
    clear(){
      this.$emit('clear', '')
    },
    select(){
      this.$emit('select', this.value)
    }
  }
}
</script>

自定义事件

该组件定义了 select 事件和 clear 事件:

methods: {
  clear(){
    // 使用 $emit 方法触发 clear 事件
    this.$emit('clear', '')
  },
  select(){
    // 使用 $emit 方法触发 select 事件
    this.$emit('select', this.value)
  },
  ...
}

其中 clear 事件传了一个空字符串作为参数,select 事件传递 value 变量作为参数。

点击 el-input 会调用 methods 中的 select 方法,进而触发 select 事件,点击 el-input 后方的 clear 图标会调用 methods 中的 clear 方法,进而触发 clear 事件:

<el-input
    ...
    @click.native="select"
    ...>
    <i
    ...
    slot="suffix"
    ...
    @click.stop="clear"/>
</el-input>

父组件可传递事件处理函数给该组件:

<template>
  <el-dialog-select @select="handleSelect" @clear="handleClear">
</template>
<script>
export default{
  ...
  methods: {
    handleSelect(value){
      console.log(value)
    },
    handleClear(value){
      console.log(value)
    }
  }
}
</script>

点击 el-input,handleSelect 可收到this.$emit('select', this.value)传来的 value 值,点击 clear 图标,handleClear 可收到this.$emit('clear', '')传来的空字符串。

自定义 v-model

先定义 model 和 prop:

model: {
  prop: 'value',
  event: 'clear'
},
props: {
  value: [String, Number]
},

然后将用来绑定数据的 prop 传给 el-input:

<el-input
  :value="value"
  ...
></el-input>

这样,父元素就可以使用 v-model 绑定值:

<template>
  <el-dialog-select v-model="selectStr" @clear="handleClear">
</template>
<script>
export default{
  ...
  data(){
    return {
        selectStr: ''
    }
  },
  methods: {
    ...
    handleClear(value){
      this.selectStr = ''
    }
  }
}
</script>

当父元素的 selectStr 发生改变时,el-input 的 value 属性会对应改变(值从父组件传给子组件的 value 属性,再从子组件的 value 属性传给 el-input 的 value 属性)。

当点击 clear 图标的时候,子组件会传递空字符串给父组件中的 handleClear 方法,如果在 handleClear 中添加this.selectStr = ''语句,则可以实现点击 clear 图标时清空 selectStr,进而清空 el-input 的 value 属性。

model 选项是什么

Vue 中用 v-model 来做数据绑定:

<input v-model="searchText" />

背后编译器会把它展开为如下形式:

<input
  :value="searchText"
  @input="searchText = $event.target.value"
/>

类似地,对于上面的例子,model: { prop: 'value', event: 'clear' }的作用是让:

<el-dialog-select v-model="selectStr">

展开为:

<el-dialog-select :value="selectStr" @clear="newValue => selectStr = newValue">

扩展

基于上面的例子,可以写这样一个组件:

<template>
  <!-- 选择组件 -->
  <el-tooltip :disabled="disabledTooltip" effect="dark" :content="value" placement="top">
    <el-input
      :value="value"
      :placeholder="placeholder"
      class="el-select"
      ref="elInput"
      @click.native="select"
      @mouseenter.native="hovering = true"
      @mouseleave.native="hovering = false"
      readonly
    >
      <i v-if="showClear"
        class="el-input__icon el-icon-circle-close el-input__clear"
        slot="suffix"
        @mousedown.prevent
        @click.stop="clear"/>
      <i v-else class="el-select__caret el-input__icon el-icon-arrow-down"
        slot="suffix"/>
    </el-input>
  </el-tooltip>
</template>

<script>
export default {
  name: 'ElDialogSelect',
  model: {
    prop: 'value',
    event: 'clear'
  },
  props: {
    value: [String, Number],
    showOverflowTooltip: {
      type: Boolean,
      default: true
    },
    placeholder: {
      type: String,
      default: '请选择'
    },
    clearable: {
      type: Boolean,
      default: true
    }
  },
  data(){
    return {
      hovering: false,
      disabledTooltip: true
    }
  },
  computed: {
    showClear(){
      return this.clearable && this.value && this.hovering
    }
  },
  watch: {
    value(){
      this.$nextTick(()=>this.disabledTooltip = this.setDisabledTooltip())
    }
  },
  methods: {
    clear(){
      this.$emit('clear', '')
    },
    select(){
      this.$emit('select', this.value)
    },
    // 设置 tooltip 显隐
    setDisabledTooltip(){
      if(!this.showOverflowTooltip) return true
      const input = this.$refs?.elInput?.$refs?.input
      if(input && input.offsetWidth < input.scrollWidth) return false
      return true
    }
  }
}
</script>

<style lang="less" scoped>
.el-select{
  /deep/ input{
    white-space: nowrap;
    text-overflow: ellipsis;
  }
}
</style>

一个使用的例子是点击组件打开弹窗,点击组件 clear 图标清除所选数据:

<template>
  <div>
    <el-form
      :model="form">
      <el-form-item label="选择数据:">
        <el-dialog-select v-model="form.selectedNames" 
          @select="selectData" @clear="clearSelect"/>
      </el-form-item>
    </el-form>
    ...
  </div>
</template>

<script>
export default{
  ...
  data(){
    return {
      form: {
        selectedNames: ''
      }
    }
  },
  methods: {
    selectData(){
      // 打开弹窗
    },
    clearSelect(){
      // 清除选择数据
    }
  }
}
</script>

参考:自定义事件 — Vue.js组件 v-model | Vue.jsVue 的 model 选项 - 掘金组件事件 | Vue.js

标签:Vue,自定义,clear,value,组件,input,model,select
From: https://www.cnblogs.com/Higurashi-kagome/p/17617995.html

相关文章

  • vue+django跨域问题
    解决办法:MIDDLEWARE=['corsheaders.middleware.CorsMiddleware','yshop.middleware.AuthorizeMiddleware','django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware�......
  • web三大组件之一Listener
    什么是Listener监听器?1、Listener监听器它是JavaWeb的三大组件之一。JavaWeb的三大组件分别是:Servlet程序、Filter过滤器、Listener监听器。2、Listener它是JavaEE的规范,就是接口3、监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的......
  • 七月学习之Iptables自定义链
    9、Iptables自定义链9.1、为什么要使用自定义链iptables的默认链就已经能够满足我们了,为什么还需要自定义链呢当默认链中的规则非常多时,不便于管理1、假设INPUT链中存放了100条规则,这100条规则有针对80端口的,有针对22端口的2、如果想修改22端口的规则,则需要将所有规则都看一遍,......
  • 在Vue中可以使用方括号法获得想要的对象数据吗?
    1.问题Document{{message}}{{school.name}}{{school[mobile]}}在这里{{school.name}}{{school[mobile]}}不可以使用方括号法获得想要的对象数据吗?2.解决在Vue.js中,使用双花括号({{}})来插值数据是正确的,但是方括号法([])用于动态属性访问的方式是不适......
  • 利用pytorch自定义CNN网络(二):数据集的准备
    本文是利用pytorch自定义CNN网络系列的第二篇,主要介绍构建网络前数据集的准备,关于本系列的全文见这里。笔者的运行设备与软件:CPU(AMDRyzen™54600U)+pytorch(1.13,CPU版)+jupyter;本文所用到的资源:链接:https://pan.baidu.com/s/1WgW3IK40Xf_Zci7D_BVLRg提取码:1212在训......
  • avue-crud属性配置项参数笔记分享
     Avue是一个基于Element-plus低代码前端框架,它使用JSON配置来生成页面,可以减少页面开发工作量,极大提升效率;虽然Avue官网上面都有这些配置说明,但是如果刚开始接触不熟悉框架的话需要很久才找到自己需要的参数配置,为了方便自己今后查找使用,现将一些开发中常用的配置梳理在下......
  • vue启用https服务及nginx启用https配置
    1.vue开发环境中主要是configjs配置启用https服务devServer:{https:true,//启用https} 2.nginx 申请一个ssl证书,自行申请。 下面是一个nginx例子 需要修改的配置https主要是红色标出来部分。蓝色加粗部分主要是history模式下刷新出现404的解决办法ser......
  • vue3 + vite + vue-router 4.x项目在router文件中使用pinia报错
    1.背景vue-router4.x版本,想在路由文件中引入并使用pinia后报错如下:表面意思是getActivePinia()方法在pinia还没有激活的时候被调用,导致报错。2.解决方法在stores文件夹下新建pinia.js文件,用来引入并创建pinia实例。import{createPinia}from"pinia";const......
  • vue excel导入 补充校验
    前台校验<template><div><el-dialog:title="'校验'":close-on-click-modal="false"append-to-body:before-close="handleClose"v-if="visible":visible.sync="visib......
  • camera2 传参流程以及hal添加自定义参数方法
    camera2传参流程以及hal添加自定义参数方法//设置自动曝光模式mPreviewBuilder.set(CaptureRequest.CONTROL_AF_MODE,CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);/frameworks/base/core/java/android/hardware/camera2/CaptureRequest.javaKey<Integer>CONTROL_AF_MOD......