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: {
    /**
     * 表单配置项
     * @param {Object} option 配置参数,具体如下:
     * type: 表单项类型,String, 可选值input
     */
    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
  },
  /**
  * name 关键字
  * type 表单类型
  * label 表单标题
  * content 表单内容
  * readOnly 是否只读 默认否
  * isHide 是否隐藏 默认否
  * textarea 是否文本类型 默认否
  **/
  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>

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

(0)

相关推荐

  • Vue实现点击时间获取时间段查询功能

    本文实例为大家分享了vue按时间段查询的案例,效果图如下 html代码 <template> <div class="personalReport_time"> <input type="date" :max="this.endTime" value="" v-model="startTime"/> <div></div> <input ty

  • 利用Vue.js框架实现火车票查询系统(附源码)

    前言 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js 今天,我就要基于这个库来搭建一个火车票查询系统.首先我们的机器上得有NodeJS环境,并且安装了npm包管理工具.因为vue是跑在node环境下的,并且我们需要用npm来安装vue. 在终端输入npm install --global vue-cli我们来全局安装vue-cli

  • Vue.js实现分页查询功能

    本文实例为大家分享了Vue.js实现分页查询的具体代码,供大家参考,具体内容如下 vue.js的使用如下: 1.引入vue.js <script src="~/js/vue2.2.4.js"></script> a.分页条 <ul class="pagination" id="pagination1"></ul> b.分页条js.css <link href="~/css/page.

  • Vue按时间段查询数据组件使用详解

    本文实例为大家分享了Vue按时间段查询数据组件的具体使用代码,供大家参考,具体内容如下 首先是前端效果: 界面代码如下: <template> <a-col :md="6" :sm="10"> <a-form-item label="执行时间" :labelCol="labelCol" :wrapperCol="wrapperCol"> <a-range-picke

  • Vue实现动态查询规则生成组件

    1. 动态查询规则 动态查询规则,大致如下图所示.是可以按照用户的自定义进行组织查询语句的一种复杂组件,大致可以实现SQL查询的where条件,下面是摘自mongodb的某一软件. 2.组件构建思路 按照规则组件的组织形式,可以把其视为一棵树,有树干和树叶,这样看起来就不难了. 2.1 组件属性 data: 是树结构的内容,我们定义为: { condition: 'AND', rules: [], } fieldList: 字段列表数组,可供选择的字段集合: operatorList: 操作列表

  • vue实现Input输入框模糊查询方法

    本文实例为大家分享了vue实现Input输入框模糊查询方法的具体代码,供大家参考,具体内容如下 原理:原生js的indexOf() 方法,该方法将从头到尾地检索数组,看它是否含有对应的元素.开始检索的位置在数组 start 处或数组的开头(没有指定 start 参数时).如果找到一个 item,则返回 item 的第一次出现的位置.开始位置的索引为 0. 如果在数组中没找到指定元素则返回 -1. 下面先看示例: 搜索前: 搜索后: 实现方法: methods:{ // 点击搜索工程 search

  • 基于vue.js实现分页查询功能

    利用vue.js实现数据库分页,供大家参考,具体内容如下 最新项目有一个分页功能,画面风格很简朴给的样图就用[1]表示页码了, 因此,我没有上网上找插件,自己简单的做了一个.作为菜鸟,代码可能有点青涩,请见谅. 除了vue我还引用了Bootstrap的类和图标 html <div class="paging"> <ul class="pagination" style="margin: 13px"> <li clas

  • Vue.js进行查询操作的实例详解

    Vue.js进行查询操作的实例详解 实例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="../lib/vue.min.js" type="text/javascript" ></script> <title>字符转换</title> </head>

  • 使用Bootstrap4 + Vue2实现分页查询的示例代码

    写在前面 工程为前后端分离设计,使用Nginx为前端资源服务器,同时实现后台服务的反向代理.后台为Java Web工程,使用Tomcat部署服务. 前端框架:Bootstrap4,Vue.js2 后台框架:spring boot,spring data JPA 开发工具:IntelliJ IDEA,Maven 实现效果: 会员信息 如何使用Bootstrap+Vue来实现动态table,数据的新增删除等操作,请查看使用Bootstrap + Vue.js实现表格的动态展示.新增和删除.交代完毕,

  • vue input输入框模糊查询的示例代码

    Vue 模糊查询功能 原理:原生js的search() 方法,用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串.如果没有找到任何匹配的子串,则返回 -1. input输入框,模糊查询 <template> <div> <input type="text" placeholder="请输入..." v-model="searchVal"> <ul> <li v-for=&quo

随机推荐