封装一个搜索区域 SearchForm.vue组件

news2025/4/16 6:25:56

父组件

<template>
  <div>
    <SearchForm
      :form-items="searchItems"
      :initial-values="initialValues"
      @search="handleSearch"
      @reset="handleReset"
      >
      <!-- 自定义插槽内容 -->
      <template #custom-slot="{ form }">
        <el-input
          v-model="form.customField"
          placeholder="自定义字段"
          ></el-input>
      </template>

      <!-- 额外操作按钮 -->
      <template #extra-actions>
        <el-button type="warning" @click="handleExport">导出</el-button>
      </template>
    </SearchForm>

    <!-- 其他页面内容 -->
  </div>
</template>

<script>
  import SearchForm from '@/views/largeScreen/productionBusiness/components/searchForm.vue'

  export default {
    name: 'WorkOrderDetailList',
    components: { SearchForm },
    data() {
      return {
        initialValues: {
          name: '默认值',
          status: '1'
        },
        searchItems: [
          {
            label: '姓名',
            prop: 'name',
            type: 'input',
            placeholder: '请输入姓名'
          },
          {
            label: '状态',
            prop: 'status',
            type: 'select',
            options: [
              { label: '启用', value: '1' },
              { label: '禁用', value: '0' }
            ]
          },
          {
            label: '创建日期',
            prop: 'createTime',
            type: 'date',
            dateType: 'daterange',
            valueFormat: 'yyyy-MM-dd'
          },
          {
            label: '自定义字段',
            prop: 'customField',
            type: 'slot',
            slotName: 'custom-slot'
          }
        ]
      }
    },
    methods: {
      handleSearch(params) {
        console.log('搜索参数:', params)
        // 调用API获取数据
      },
      handleReset() {
        console.log('表单已重置')
      },
      handleExport() {
        console.log('导出操作')
      }
    }
  }
</script>

子组件

<template>
  <div>
    <el-form
      ref="searchFormRef"
      :model="formModel"
      :inline="true"
      :label-width="labelWidth"
      class="search-form"
      @submit.prevent="handleSearch"
      >
      <!-- 动态渲染搜索表单项 -->
      <template v-for="(item, index) in formItems">
        <!-- 输入框 -->
        <el-form-item
          :key="index"
          v-if="item.type === 'input' || !item.type"
          :label="item.label"
          :prop="item.prop"
          >
          <el-input
            v-model="formModel[item.prop]"
            :placeholder="item.placeholder || `请输入${item.label}`"
            clearable
            @keyup.enter="handleSearch"
            />
        </el-form-item>

        <!-- 选择器 -->
        <el-form-item
          v-else-if="item.type === 'select'"
          :label="item.label"
          :prop="item.prop"
          >
          <el-select
            v-model="formModel[item.prop]"
            :placeholder="item.placeholder || `请选择${item.label}`"
            clearable
            filterable
            style="width: 100%"
            >
            <el-option
              v-for="opt in item.options"
              :key="opt.value"
              :label="opt.label"
              :value="opt.value"
              />
          </el-select>
        </el-form-item>

        <!-- 日期选择器 -->
        <el-form-item
          v-else-if="item.type === 'date'"
          :label="item.label"
          :prop="item.prop"
          >
          <el-date-picker
            v-model="formModel[item.prop]"
            :type="item.dateType || 'date'"
            :placeholder="item.placeholder || `请选择${item.label}`"
            :value-format="item.valueFormat || 'yyyy-MM-dd'"
            clearable
            />
        </el-form-item>

        <!-- 日期范围选择器 -->
        <el-form-item
          v-else-if="item.type === 'daterange'"
          :label="item.label"
          :prop="item.prop"
          >
          <el-date-picker
            v-model="formModel[item.prop]"
            type="daterange"
            :start-placeholder="item.startPlaceholder || '开始日期'"
            :end-placeholder="item.endPlaceholder || '结束日期'"
            :value-format="item.valueFormat || 'yyyy-MM-dd'"
            clearable
            />
        </el-form-item>

        <!-- 自定义插槽 -->
        <el-form-item
          v-else-if="item.type === 'slot'"
          :label="item.label"
          :prop="item.prop"
          >
          <slot :name="item.slotName" :form="formModel"></slot>
        </el-form-item>
      </template>

      <!-- 操作按钮区域 -->
      <el-form-item class="search-form-actions">
        <el-button type="primary" @click="handleSearch">搜索</el-button>
        <el-button @click="handleReset">重置</el-button>
        <slot name="extra-actions"></slot>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
  export default {
    name: 'SearchForm',
    props: {
      // 表单配置项
      formItems: {
        type: Array,
        required: true,
        validator: (value) => {
          return value.every((item) => {
            return item.prop && item.label
        })
      }
    },
    // 初始值
    initialValues: {
      type: Object,
      default: () => ({})
    },
    // 标签宽度
    labelWidth: {
      type: String,
      default: '100px'
    }
  },
  data() {
    return {
      formModel: {}
    }
  },
  watch: {
    initialValues: {
      immediate: true,
      handler(val) {
        this.initFormModel(val)
      }
    }
  },
  methods: {
    // 初始化表单数据
    initFormModel(initialValues) {
      const defaultModel = {}
      this.formItems.forEach((item) => {
        defaultModel[item.prop] = initialValues[item.prop] ?? null
      })
      this.formModel = defaultModel
    },

    // 搜索事件
    handleSearch() {
      this.$emit('search', this.formModel)
    },

    // 重置表单
    handleReset() {
      this.$refs.searchFormRef.resetFields()
      this.$emit('reset')
    },

    // 获取表单数据
    getFormData() {
      return { ...this.formModel }
    },

    // 设置表单数据
    setFormData(data) {
      Object.keys(data).forEach((key) => {
        if (this.formModel.hasOwnProperty(key)) {
          this.formModel[key] = data[key]
        }
      })
    }
  }
}
</script>

<style lang="scss" scoped>
.search-form {
  margin-bottom: 20px;
  padding: 20px;
  background: #f5f7fa;
  border-radius: 4px;

  &-actions {
    float: right;
    margin-right: 0;
  }
}
</style>

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2335750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT - GPT(Generative Pre-trained Transformer)模型框架

本节代码主要为实现了一个简化版的 GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型。GPT 是一种基于 Transformer 架构的语言生成模型&#xff0c;主要用于生成自然语言文本。 1. 模型结构 初始化部分 class GPT(nn.Module):def __init__(self, vocab…

贪心算法:部分背包问题深度解析

简介&#xff1a; 该Java代码基于贪心算法实现了分数背包问题的求解&#xff0c;核心通过单位价值降序排序和分阶段装入策略实现最优解。首先对Product数组执行双重循环冒泡排序&#xff0c;按wm(价值/重量比)从高到低重新排列物品&#xff1b;随后分两阶段装入&#xff1a;循环…

连接器电镀层的作用与性能

连接器电镀层的作用与性能&#xff1a; 镀金 金具有很高的化学稳定性&#xff0c;只溶于王水&#xff0c;不溶于其它酸&#xff0c;金镀层耐蚀性强&#xff0c;导电性好&#xff0c;易于焊接&#xff0c;耐高温&#xff0c;硬金具有一定的耐磨性。 对钢、铜、银及其合金基体而…

神经网络如何表示数据

神经网络是如何工作的&#xff1f;这是一个让新手和专家都感到困惑的问题。麻省理工学院计算机科学和人工智能实验室&#xff08;CSAIL&#xff09;的一个团队表示&#xff0c;理解这些表示&#xff0c;以及它们如何为神经网络从数据中学习的方式提供信息&#xff0c;对于提高深…

nginx自编译重现gzip和chunked的现象

前言 最近做项目&#xff0c;发现一个比较好玩的事&#xff0c;nginx的module gzip模式默认支持1KB压缩&#xff0c;和chunked返回&#xff0c;本来现在的很多框架都很完善了&#xff0c;但是&#xff0c;一些新语言框架或者一些老旧框架会不能完整支持chunked&#xff0c;导致…

jspm企业采购管理系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 相比于以前的传统企业采购手工管理方式&#xff0c;智能化的管理方式可以大幅降低企业采购管理的运营人员成本&#xff0c;实现了企业采购管理的标准化、制度化、程序化的管理&#xff0c;有效地防止了物资信息、物资入库、出库等的随意管理&#xff0c;提高了信息的处理…

现代测试自动化框架教程:Behave接口测试与Airtest移动端UI自动化

前言 我发现每天还是陆陆续续有人在看我之前写的自动化框架搭建的文档&#xff1b;即使很早就有新的框架&#xff0c;更好的选择出来了&#xff1b;所以特别写了这一篇目前大厂也在使用的&#xff1b;日活400w有实际落地的自动化测试架构方案&#xff1b; 随着测试技术…

优化运营、降低成本、提高服务质量的智慧物流开源了

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…

使用Lombok的@Slf4j和idea构建:找不到log符号-解决

问题&#xff1a;在使用Lombok的Slf4j构建项目时提示如下内容&#xff1a; MvcConfiguration.java:26:9 java: cannot find symbol symbol: variable log location: class cn.edu.wynu.mrcinerec.mrserver.config.WebMvcConfiguration查了网上的方法都是改配置 但是使用Googl…

【Python爬虫】简单案例介绍1

目录 三、Python爬虫的简单案例 3.1 网页分析 单页 三、Python爬虫的简单案例 本节以科普中国网站为例。 3.1 网页分析 单页 在运用 Python 进行爬虫开发时&#xff0c;一套严谨且有序的流程是确保数据获取高效、准确的关键。首先&#xff0c;深入分析单个页面的页面结构…

LLM-as-Judge真的更偏好AI输出?

论文标题 Do LLM Evaluators Prefer Themselves for a Reason? 论文地址 https://arxiv.org/pdf/2504.03846 代码地址 https://github.com/wlchen0206/llm-sp 作者背景 弗吉尼亚大学&#xff0c;乔治华盛顿大学 实践建议 在将LLM部署为评估器之前&#xff0c;应严格评…

【软考-架构】13.3、架构复用-DSSA-ABSD

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 1、软件架构复用2、特定领域软件架构DSSADSSA的三个基本活动参与DSSA的四种角色人员建立DSSA的过程三层次模型 考试真题第一题第二题 3、基于架构的软件开发ABSD的软件开发…

色温插值计算借鉴

色温插值计算方法借鉴&#xff1a; 摘至&#xff1a;Understanding the in-camera rendering pipeline & the role of AI and deep learning

SnailJob:分布式环境设计的任务调度与重试平台!

背景 近日挖掘到一款名为“SnailJob”的分布式重试开源项目,它旨在解决微服务架构中常见的重试问题。在微服务大行其道的今天&#xff0c;我们经常需要对某个数据请求进行多次尝试。然而&#xff0c;当遇到网络不稳定、外部服务更新或下游服务负载过高等情况时&#xff0c;请求…

网络安全-Http\Https协议和Bp抓包

1. http协议&#xff0c;有请求必有相应&#xff0c; 请求协议&#xff0c; 响应协议&#xff1b; 2. 密码学加密机制及常用算法和常用名称说明&#xff1a; 算法 密钥 明文数据 密文&#xff1b; 加密算法分类和常用算法&#xff1a; 加密算法可以归结为三大类&#xff…

爱普生FC1610AN5G手机中替代传统晶振的理想之选

在 5G 技术引领的通信新时代&#xff0c;手机性能面临前所未有的挑战与机遇。从高速数据传输到多任务高效处理&#xff0c;从长时间续航到紧凑轻薄设计&#xff0c;每一项提升都离不开内部精密组件的协同优化。晶振&#xff0c;作为为手机各系统提供稳定时钟信号的关键元件&…

质粒已被全面解析

随着微生物研究的不断深入和耐药性问题的日益加剧&#xff0c;了解质粒对开发抗菌策略及生物技术应用意义重大。但现有质粒数据库缺乏细致注释并且工具存在不足。近期&#xff0c;香港城市大学李帅成课题组在Nucleic Acids Research期刊发表研究成果&#xff0c;推出全面注释质…

实验二.单按键控制LED

1.实验任务 如图4.1所示:在P0.0端口上接一个发光二极管L1,按键按一下灯亮,在按一下灯灭。 2.电路原理图 3.系统板上硬件连线 把“单片机系统”区域中的P0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。 4.程序设计内容

【ROS】move_base 导航节点概述

【ROS】move_base 导航节点概述 前言move_base 架构move_base 内部模块move_base 外部数据 前言 本章介绍 ROS 导航系统中的核心节点 move_base&#xff0c;它负责路径规划和导航控制&#xff0c;是系统的调度中心。我们将简要讲解其内部模块结构&#xff0c;以及运行所需的外…

【FPGA基础学习】DDS信号发生器设计

一、IP核简介 IP核的定义与核心作用 定义 IP核是芯片设计中独立功能的成熟模块&#xff0c;例如处理器、存储器、接口协议等。它们以硬件描述语言&#xff08;HDL&#xff09;、网表或物理版图形式交付&#xff0c;供其他设计者直接调用&#xff0c;避免重复开发 核心作用 缩…