Vue3中搜索表单的二次封装

这篇具有很好参考价值的文章主要介绍了Vue3中搜索表单的二次封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近使用Vue3+ElementPlus开发项目,从整体上构思组件的封装。能写成组件的内容都进行封装,方便多个地方使用。
受AntDesign的启发,在项目中有搜索表单+table+分页的地方可以封装为一个组件,只需要对组件传入table的列,组成一个配置项,通过配置可以显示搜索表单、table项的内容展示等等。
那么在使用ElemenPlus开发时,是没有这样的组件可以使用的。又一想项目中好多个地方都有搜索表单+Table的形式,那不如直接封装个搜索表单,这样就省去了一遍一遍的表单的重复编写。封装好的组件只需要传入进入配置内容即可实现搜索的效果。

实现思路:

  1. 搜索表单无非就是文本框、选择框、时间选择、时间范围选择、数字框,通过配置项里传入type即可判断展示哪种类型的form-item。
  2. 数值绑定,v-model与传入项的匹配,在配置项中传入prop,然后在子组件中创建form响应式对象。
  3. 数据初始值、选项列表等等都通过配置项传入。
  4. 搜索表单的搜索与重置按钮,提交emit事件即可。

首先:创建SearchForm.vue组件

该组件实现了输入框、选择框、单日期、双日期(一般搜索表单也就这些,如果还有其他的类型,读者可以自己添加)。

<script setup>
    import { reactive, onMounted } from "vue"
    import DateRangePicker from '@/components/DateRangePicker/index.vue'

    const props = defineProps({
        itemList: Array
    })
    const emit = defineEmits(['search', 'reset'])
    
    let form = reactive({})
    onMounted(() => {
      props.itemList.map(item => {
        if(item.type === 'dateRange') {
            form[item.start] = ''
            form[item.end] = ''
        }else {
            form[item.prop] = item.initValue ? item.initValue : ''
        }
      })
    })
</script>

<template>
    <el-form :model="form" inline label-width="120px">
        <template v-for="(item, index) in props.itemList" :key="index">
            <el-form-item
                :label="item.label"
                :prop="item.prop"
            >
                <el-select v-if="item.type === 'select'" v-model="form[item.prop]" placeholder="请选择" clearable>
                  <el-option v-for="i in item.list" :key="i.value" :label="i.label" :value="i.value"/>
                </el-select>
                <el-date-picker 
                    v-if="item.type === 'date'" 
                    :type="item.dateType" 
                    v-model="form[item.prop]" 
                    placeholder="请选择" 
                    clearable
                />
                <date-range-picker
                    v-if="item.type === 'dateRange'"
                    v-model:start="form[item.start]"
                    v-model:end="form[item.end]"
                />
                <el-input-number v-if="item.type === 'number'" v-model="form[item.prop]" placeholder="请输入" clearable/>
                <el-input v-if="item.type === 'input'" v-model="form[item.prop]" placeholder="请输入" clearable/>
            </el-form-item>
        </template>
        <el-form-item>
            <el-button @click="emit('search', form)" type="primary" icon="Search">查询</el-button>
            <el-button @click="emit('reset')" type="primary" plain icon="Refresh">重置</el-button>
        </el-form-item>
    </el-form>
</template>

其次:DateRangePicker组件

这个组件是用来实现选择范围日期的,因为范围日期返回的是一个数组,如果不进行封装处理一下的话,在项目中每写一个该组件都会要写change事件来处理数据值,还挺麻烦。封装之后,只需要将对应的model传给该组件即可实现双向绑定。

<script setup>
import { ref } from "vue";
const emit = defineEmits(['update:start', 'update:end'])
const props = defineProps({
    start: {
        type: String,
        required: true
    },
    end: {
        type: String,
        required: true
    },
    type: {
        default: 'daterange'  // daterange、datetimerange、monthrange
    },
    format: {
        default: 'YYYY-MM-DD'
    },
    valueFormat: {
        default: 'YYYY-MM-DD HH:mm:ss'
    }
})
let dateRange = ref([])

const dateChange = (e) => {
    emit('update:start', e ? e[0] : '')
    emit('update:end', e ? e[1] : '')
}
</script>

<template>
    <el-date-picker 
        v-model="dateRange"
        :type="props.type"
        :format="props.format"
        :value-format="props.valueFormat"
        start-placeholder="开始日期"
        end-placeholder="结束日期"
        @change="dateChange"
    />
</template>

最后一步:使用SearchForm组件

经过前两步的封装之后,在使用的SearchForm组件时,简直是爽的不要不要的。看示例:

<script setup>
  import { reactive, ref } from 'vue'
  import SearchForm from '@/components/SearchForm/index.vue'
  import ProListItem from '@/views/project/components/ProListItem.vue'
  import { projectList } from '@/api/project';
  const searchFormList = [
    {label: '项目名称', prop: 'name', type: 'input'},
    {label: '项目编码', prop: 'code', type: 'input'},
    {label: '项目描述', prop: 'desc', type: 'select', list: [{label: '未开始', value: 1}, {label: '已开始', value: 2}]},
    {label: '创建日期', type: 'dateRange', start: 'startTime', end: 'endTime'}
  ]
  const dataSource = ref([])
  const queryForm = ref()
  const pagination = reactive({
    pageNum: 1,
    pageSize: 10,
    total: 0
  })
  const search = (form) => {
    console.log(form);
    queryForm.value = form
    queryProject()
  }
  const queryProject = () => {
    projectList({
      ...queryForm.value,
      pageNum: pagination.pageNum,
      pageSize: pagination.pageSize
    }).then((result) => {
      dataSource.value = result.data.list
      data.total = result.data.total
    }).catch((err) => {
      
    });
  }
</script>
<template>
  <search-form 
    :item-list="searchFormList"
    @search="search"
    />
  <pro-list-item :data="dataSource"/>
</template>

啥也不说了,直接看示例,用起来多方便!!!只要项目中有要写搜索表单的地方,直接引入SearchForm组件,配置一下itemList即可实现完整功能!学会了的小伙伴赶紧去用起来吧。文章来源地址https://www.toymoban.com/news/detail-669893.html

到了这里,关于Vue3中搜索表单的二次封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue中axios的二次封装——vue 封装axios详细步骤

        api统一管理,不管接口有多少,所有的接口都可以非常清晰,容易维护。     通常我们的项目会越做越大,页面也会越来越多,如果页面非常的少,直接用axios也没有什么大的影响,那页面组件多了起来,上百个接口呢,这个时候后端改了接口,多加了一个参数什么的呢

    2024年02月02日
    浏览(33)
  • Vue项目中axios的二次封装

    Vue 项目使用过程中一般会对 axios 进行二次封装, 以期在合适的时机处理一些全局的需求, 比如常见的 请求拦截器 和 响应拦截器. 接下来简单聊聊具体的操作步骤. 执行以下指令: 在 src 文件夹下创建 api 文件夹, 并创建 index.js、axios.js 和 users.js 文件. index.js 文件的作用的将当前

    2024年01月19日
    浏览(72)
  • vue3 ts element plus form表单二次封装详细步骤 (附参数、类型详细介绍及简单使用示例)

    上篇table 表格封装 讲到项目中经常会用到 table 表格,所以做了封装。当然,form 表单使用的频率依然很高,所以和封装 table 表格的思路相似,对 form 表单也做了一个二次封装的组件。 查看国内预览站 查看国外预览站 1. EasyForm 表单组件封装 src/components/EasyForm/index.vue Form 表单

    2024年02月07日
    浏览(53)
  • 【vue2小知识】实现axios的二次封装

    🥳博       主: 初映CY的前说(前端领域) 🌞个人信条: 想要变成得到,中间还有做到! 🤘 本文核心 :在vue2中实现axios的二次封装 目录 一、平常axios的请求发送方式 二、axios的一次封装 三、axios的二次封装  四、总结 【前言】我们在使用axios发送请求的时候,如果是直

    2024年02月01日
    浏览(32)
  • 【vant】打开vant表单的正确形式(基于vant表单的二次封装)

    最近在用vant做关于移动端的项目,由于表单字段太多,不想写直接写到template中,这样太繁琐了,所以我们以把表单弄成schema配置形式: form组件使用: 就是通过数据驱动生成表单(效果如下)。 也可以戳链接亲自体验:vant_twice_form 这样不仅表单字段配置起来方便,更能解决一些业务

    2024年02月13日
    浏览(34)
  • Vue3 + TS + Element-Plus —— 项目系统中封装表格+搜索表单 十分钟写五个UI不在是问题

    前期回顾 纯前端 —— 200行JS代码、实现导出Excel、支持DIY样式,纵横合并-CSDN博客 https://blog.csdn.net/m0_57904695/article/details/135537511?spm=1001.2014.3001.5501 目录 一、🛠️  newTable.vue 封装Table 二、🚩 newForm.vue 封装搜索表单  三、📝 TS类型 srctypesglobal.d.ts 四、♻️ 页面使用功能

    2024年01月24日
    浏览(45)
  • element ui 表格组件与分页组件的二次封装 【扩展】vue中的render函数

    目录 效果图  组件封装  parseTime函数 debounce 函数 render通用渲染模版 页面使用 【扩展】vue 函数式组件 函数式组件特点: 函数式组件的优点: 【扩展】vue中的render函数 一、初步认识render函数 二、为什么使用render函数 三、render函数的解析 【扩展】添加操作栏显示权限 结构

    2024年02月09日
    浏览(46)
  • Vue组件封装:基于Vue3+wangeditor富文本组件二次封装

    1.简介         开源 Web 富文本编辑器,开箱即用,配置简单。一个产品的价值,就在于解决用户的问题,提高效率、降低成本、增加稳定性和扩展性。wangEditor 不是为了做而做,也不是单纯的模仿谁,而是经过上述问题分析之后,给出一个系统的解决方案。旨在真正去解决用

    2024年04月08日
    浏览(30)
  • vue3组件封装系列-表单请求

    我们在开发一些后台管理系统时,总是会写很多的列表查询页面,如果不封装组件,就会无限的复制粘贴,而且页面很冗余,正常情况下,我们都是要把组件进行二次封装,来达到我们想要效果。这里我分享一下我近期封装的关于列表的组件封装。 vue3+element-plus srccomponents

    2024年04月23日
    浏览(22)
  • vue3组件二次封装Ui处理

    在Vue开发中,我们常常需要使用UI框架提供的组件。但是UI框架的组件可能并不符合我们的需求,这时候就需要进行二次封装。下面是一些关于Vue组件二次封装Ui处理的技巧: 子组件代码: 父组件使用: 如果使用props接收弊端: 基本上组件不会只有一两个属性,属性多的话接

    2023年04月14日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包