我的编程空间,编程开发者的网络收藏夹
学习永远不晚

vue+element自定义查询组件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

vue+element自定义查询组件

本文主要介绍vue项目,在引入element的前提下,对组件进行二次封装实现通过配置项直接布局。

一、查询条件组件化

结合EventBus.js的使用,传递事件更高效,可以避免各种复杂的生命周期依赖关系。
components/dataForm文件夹下dataForm.vue作为组件集合的载体,并创建配置项

1.1 dataForm代码实例


// dataForm.vue
<template>
  <el-row>
    <input-form v-for="(item,index) in options" :key="'dataForm_'+index"> 
      <!-- 输入框-->
      <input-form
        :key="index"
        v-if="item.type == 'input'"
        :data='item'
      ></input-form>
  </el-row>
</template>
<script>
import EventBus from "@/assets/js/eventBus.js"
import InputForm "@/components/dataForm/InputForm"
export default {
  components: {
    InputForm,
  },
  props: {
    
    options: {
      type: Array,
      default() {
        return [];
      },
    },
  },
  data() {
   return {}
  },
  created() {
   // 此处主要是为了实现下拉框对其他子组件的显示和隐藏
    EventBus.$on("refreshDataForm", e => {
      this.refreshDataForm(e);
    });
  },
  // 页面销毁 事件销毁
  beforeDestroy() {
    EventBus.$off("refreshDataForm")
    EventBus.$off("handleClick")
  },
  methods: {
   // 更新表单数据
    refreshDataForm(item) {
      let data = this.options
      data.forEach((e, i) => {
        if (item.type == e.type && item.name == e.name) {
          this.options[i] = item
        }
      })
    },
    // 子组件点击事件响应父组件,数据传递
    handleClick(data) {
     EventBus.$emit("handleClick",data)
    },
    // 表单数据格式化 (可以对是否必填项目做必填校验)
    getDataForm() {
     let data = this.options
     let formObj = {}
     let error = ''
     try {
      data.forEach(e => {
       if (e.type === ''input) {
        if (e.require && !e.content) {
         error = '请输入' + e.label
         throw error
        }
        formObj[e.name] = e.content
       } else if (e.type === 'select' || e.type === 'dataSelect') {
        if (e.require && !e.content) {
         error = '请选择' + e.label
         throw error
        }
        formObj[e.name] = e.content
       } else if (e.type === 'date' || e.type === 'dataRadio') {
        if (e.require && !e.content) {
         error = '请选择' + e.label
         throw error
        }
        formObj[e.beginName] = e.beginRegTime
        formObj[e.endName] = e.endRegTime
       } else if (e.type === 'image') {
        formObj[e.name] = e.file || e.content
       } else if (e.type === 'upload') {
        formObj[e.name] = e.file || e.content
        if (e.delFileName) { // 删除附件集合及自定义名称和默认名称
          formObj[e.delFileName] = e.delFileIds.join(',')
        } else {
         formObj['delFileName'] = e.delFileIds.join(',')
        }
       }
      })
      return formObj
     } catch (error) {
      this.$message({ message:error, type: 'error'})
     }
    }
  }
}

1.2 子组inputForm.vue

注:此处被引用的组件也可以被页面单独引用


<template>
  <el-col>
    <el-col :span="data.boxSpan?data.boxSpan:boxSpan" v-if="!data.isHide">
     <el-col :span="data.infoSpan?data.infoSpan:infoSpan" >
      <el-col :span="data.infoSpan?data.infoSpan:infoSpan" v-if="data.labelSpan!=0">
       <label class="el-form-item_label" :class="{'require': data.require}" v-html="data.label"></label>
      </el-col>
      <el-col :span="data.contentSpan?data.contentSpan:contentSpan" v-if="data.contentSpan!=0">
       <el-input :class="{'base_textarea': data.textarea}" v-modle.trim="data.content" :type="data.textarea?'textarea':''" :disable="data.readOnly" :placeholder="setPlaceholder" maxlength="200"></el-input>
      </el-col>
     </el-col>
      <span v-text="title"></span>
    </div>
  </el-col>
</template>
<script>
export default {
 props: {
  // 类型 input 输入框
  type: {
   type: String,
   default: 'input'
  },
  // 默认栅栏布局 8/24
  boxSpan: {
   type: Number,
   default: 8
  },
  // 默认栅栏布局 24/24
  infoSpan: {
   type: Number,
   default: 24
  },
  // 默认栅栏布局 8/24
  spanSpan: {
   type: Number,
   default: 8
  },
  // 默认栅栏布局 16/24
  contentSpan: {
   type: Number,
   default: 16
  },
  
  data: {
   type: Object,
   default() {
    return []
   }
  }
 },
 computed: {
  setPlaceholder() {
   if(this.data.readOnly && !this.data.content) {
    return ''
   } 
   return '请输入'
  }
 }
}
</script>
<style scoped>
 // 必填样式
 .require::after {
  content: '*';
  color:red;
 }
 // flex布局标题垂直居中
 .el-form-item__label {
  float:right;
  margin-botton:0;
  line-height: 20px;
  display: flex;
  align-items: center;
  min-height: 40px;
 }
</style>

1.3 父页面引用及使用


<template>
  <el-row>
    <data-form :options='searchArray' ref='searchArray'></input-form>
  </el-row>
</template>

<script>
 import EventBus from "@/assets/js/eventBus.js"
 import DataForm "@/components/dataForm/dataForm"
 export default {
  components: {
   DataForm
  },
  data() {
   return {
    // 查询菜单配置
    searchArray: [
     {
      name: 'personName',
      type: 'input',
      label: '用户名',
      content: ''
     },
     {
      name: 'personName2',
      type: 'input',
      label: '用户名2',
      content: ''
     }
    ]
   }
  },
  created() {
   // 监听子组件传参
   EventBus.$on('refreshDataForm', e => {
    this.refreshDataForm(e)
   })
  },
  destroyed() {
   // 销毁子组件传参监听
   EventBus.$off('refreshDataForm')
  },
  methods: {
   // 监听子组件操作
   refreshDataForm(e) {
    // 逻辑代码
    this.$forceUpdate()
   },
   // 数据查询
   handleQuery() {
     // 获取组件参数返回json格式
    let searchArray = this.$refs.searchArray.getDataForm()
    // 如果存在必填项,返回值为null,此时有弹窗提示
    if (!searchArray) {
     return 
    }
    // 查询接口逻辑
   }
  }
 }
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

vue+element自定义查询组件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue + Element 自定义上传封面组件功能

这篇文章主要介绍了Vue + Element 自定义上传封面组件,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-01-10

Vue和Element怎么自定义上传封面组件功能

这篇文章主要讲解了“Vue和Element怎么自定义上传封面组件功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue和Element怎么自定义上传封面组件功能”吧!先来看一下效果:第一张
2023-07-04

Vue Element UI自定义描述列表组件的示例分析

这篇文章主要介绍Vue Element UI自定义描述列表组件的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下效果图写在前面写后台管理经常从列表点击查看详情,展示数据信息,Element UI虽然
2023-06-15

vue怎么自定义keepalive组件

本文小编为大家详细介绍“vue怎么自定义keepalive组件”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么自定义keepalive组件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。为什么会出现这种情
2023-07-02

Linq中怎么自定义组合查询

本篇文章为大家展示了Linq中怎么自定义组合查询,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。这个表单将Linq自定义组合条件提交后台,我先将它封装成条件对象的数组。/// /// 条件 ///
2023-06-17

Android自定义组件:1、什么是自定义组件、自定义组件的方式、定义自定义属性

声明:本教程不收取任何费用,欢迎转载,尊重作者劳动成果,不得用于商业用途,侵权必究!!! 目录 一、前言 二、什么是自定义组件 三、自定义组件的方式 1、组合现有组件 2、在某一个组件上进行扩展 3、完全自定义组件 四、定义自定义属性 1、
2022-06-06

vue如何自定义组件传值

本篇内容介绍了“vue如何自定义组件传值”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!自定义组件传值常规prop-event父组件
2023-07-04

vue如何用directives自定义组件

这篇“vue如何用directives自定义组件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue如何用directive
2023-07-04

Vue组件模版如何自定义

本篇内容介绍了“Vue组件模版如何自定义”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!字符串形式Vue 最简单直接的一种定义组件模版的方式,
2023-07-04

vue怎么自定义封装API组件

这篇文章主要介绍vue怎么自定义封装API组件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!自定义封装API组件1.创建vue组件