vue3封装搜索表单组件
seacrch 表单完成的功能
1.根据配置json配置项自动生成表单 ok
2.是响应式的排版 ok
3.点击搜索按钮会向上抛出值 ok
4.点击重置按钮会自动清空数据,不需要父组件额外的处理 ok
5.调整按钮靠右,使用flex的填充属性 ok
6.给下拉框绑定了事件 ok
7.新增了插槽,增强组件的扩展性 ok
8.可以回填默认值 ok
9.下拉框终于可以正确显示placeholder ok
10.可以获取初始值,通过开发者自己手动进行配置就可以了?
处理的小问题
#### 1.在屏幕变小的情况下:日期选择器组件与其他组件宽度不能够保持一致.
解决办法是给一个类,宽度设置为100%
<a-date-picker class="setdate-width"></a-date-picker>
<a-range-picker class="setdate-width"></a-range-picker>
.setdate-width{
width: 100%;
}
#### 2.按钮始终在最右边。
解决办法是给col 支持flex的填充功能。
当flex="auto"的时候回自动填充剩下的区域
然后靠右就可以按钮始终在最右边。
<a-col flex="auto" class="btnflex"></a-col>
.btnflex{
text-align: right;
padding-right: 50px !important;
}
#### 3.设置表单label的宽度
解决办法:<a-form>组件有一个label-col属性。
这个属性接受一个对象通过设置宽度就可以了。
<a-form :model="formState" :label-col="labelCol" :wrapper-col="wrapperCol">
</a-form>
let labelCol={ style: { width: '150px' } }
这样label的宽度就是150px了
封装组件的思想
1.父组件传递过来的数据,只作为渲染的结构
2.子组件中的v-model的数据是通过父组件传递过来的值进行过滤。
变成我们想要的数据结构。v-model的数据是子组件内部自己提供的
这样我们就可以在子组件中做很多的事情。比如清除值。
如果使用外部的数据,子组件无法更改外部数据。起不到作用
搜索表单的子组件
<template>
<a-form :model="formDataViewShow" class="search-cont" :label-col="labelCol">
<a-row class="box" :gutter="40">
<a-col :xxl="{ span: 6 }" :xl="{ span: 6 }" :lg="{ span: 12 }" :md="{ span: 12 }" :sm="{ span: 24 }"
:xs="{ span: 24 }" v-for="(item, index) in listForm" :key="index">
<!-- 自定义插槽 -->
<template v-if="item.slotName">
<slot :name="item.keyName" :row="formDataViewShow"></slot>
</template>
<a-form-item :label="item.label || ''" v-if="item.type === 'a-input'">
<a-input v-model:value="formDataViewShow[item.keyName]"
:placeholder="item.placeholder || '请输入'" />
</a-form-item>
<!-- 下拉框 -->
<a-form-item :label="item.label || ''" v-if="item.type === 'a-select'">
<a-select v-model:value="formDataViewShow[item.keyName]"
:placeholder="item.placeholder || '请输入'"
@change="changeHandler">
<a-select-option :value="selectCont.value"
v-for="(selectCont, selectIndex) in item.options"
:key="selectIndex">
{{ selectCont.label }}
</a-select-option>
</a-select>
</a-form-item>
<!-- 日期选择器
valueFormat="YYYY-MM-DD" 表示得到年月日
format="YYYY-MM-DD" 数据展示年月日
-->
<a-form-item :label="item.label || ''" v-if="item.type === 'a-date-picker'">
<a-date-picker v-model:value="formDataViewShow[item.keyName]" valueFormat="YYYY-MM-DD"
format="YYYY-MM-DD" class="setdate-width" />
</a-form-item>
<!-- 时间段 -->
<a-form-item :label="item.label || ''" v-if="item.type === 'a-range-picker'">
<a-range-picker v-model:value="formDataViewShow[item.keyName]" valueFormat="YYYY-MM-DD"
format="YYYY-MM-DD" class="setdate-width" />
</a-form-item>
<!-- 数字输入框 -->
<a-form-item :label="item.label || ''" v-if="item.type === 'a-input-number'">
<a-input-number id="inputNumber" v-model:value="value" :min="1" :max="10" />
</a-form-item>
</a-col>
<a-col flex="auto" class="btnflex">
<!-- <a-form-item> -->
<a-button type="primary" @click="searchHandler">搜索</a-button>
<a-button style="margin-left: 10px" @click="resetHandler">重置</a-button>
<!-- </a-form-item> -->
</a-col>
</a-row>
</a-form>
</template>
<script lang="ts" setup >
import { defineProps, defineEmits, ref } from 'vue'
const props = defineProps({
listForm: {
type: Array,
required: true,
default: () => []
},
})
const emit = defineEmits(['resetHandler', 'searchHandler'])
// 获取视图上需要展示的格式,
// 如果是下拉框的话,没有值需要处理成为undefined
// 该方法是在 1.视图初始化的时候 2.重置表单的时候调用
const getFormData = () => {
const result: any = {}
props.listForm.map(item => {
// item.default 可以直接去解决下拉框没有值,显示不出来placeholder
if (item.type == 'a-select') {
result[item.keyName] = item.default || undefined
} else {
result[item.keyName] = item.default || ''
}
})
return result
}
// 给视图
const formDataViewShow = ref(getFormData())
// 重置表单清除视图上的数据,需要注意点是 下拉框的值应为undefined
const clearDealBack = () => {
// 清除视图上的值
formDataViewShow.value = getFormData()
// 将视图上的数据恢复最初, 下拉框仍然是undefined
let obj = getFormData()
//如果返回去的数据有值,你可以返回默认值.没有默认值返回空
let newobj = {}
for (let keysName in obj) {
// obj[keysName] 返回的是回填的值,因此有 ||这个运算
newobj[keysName] = obj[keysName] || ''
}
return newobj
}
// 搜索的时候,如果是undefined,将值进行处理
const searchDealBack = () => {
// 将undefined转为空
let obj = formDataViewShow.value
let newobj = {}
for (let keysName in obj) {
// 因此值是undefined,说明是下拉框或者是其他,直接重置为 ''
if (obj[keysName] === undefined) {
newobj[keysName] = ''
} else {
newobj[keysName] = obj[keysName]
}
}
return newobj
}
// 重置表单事件,向上抛出去的数据
const resetHandler = () => {
emit('resetHandler', clearDealBack())
}
// 搜索事件,向上抛出去的数据
const searchHandler = () => {
// 获取插槽中的值
emit('searchHandler', searchDealBack())
}
const changeHandler = () => {
emit('searchHandler', searchDealBack())
}
let labelCol = { style: { width: '75px' } }
</script>
<style scoped>
.search-cont {
width: 1690px;
background: pink;
margin-left: 30px;
}
.setdate-width {
width: 100%;
}
.btnflex {
text-align: right;
padding-right: 50px !important;
}
</style>
页面使用组件
<template>
<div class="box">
<div class="slider"></div>
<SearchForm class="searchbox" :resetClearInitVale="true" :listForm="listForm.list"
@searchHandler='searchHandler' @resetHandler="resetHandler">
<!-- <template #btn="slotProps">
<a-radio-group v-model:value="slotProps.row.btn">
<a-radio-button value="01">玩耍</a-radio-button>
<a-radio-button value="02">摸鱼</a-radio-button>
<a-radio-button value="03">抓虾</a-radio-button>
</a-radio-group>
</template> -->
<!-- <template #dec="slotProps">
<a-input v-model:value="slotProps.row.dec" placeholder="Basic usage" />
</template> -->
</SearchForm>
<br />
</div>
</template>
<script lang="ts" setup>
import { reactive } from 'vue';
import SearchForm from "../components/SearchForm.vue"
let listForm = reactive({
list: [
{
label: '姓名', type: 'a-input',
keyName: 'name',
placeholder: '用户大老爷请输入',
},
{
label: '班级',
type: 'a-select',
default: '01',// 回填的值
placeholder: '用户大老爷请选择',
keyName:'className',
options: [
{ value: '01', label: '初中一班' },
{ value: '02', label: '初中二班' },
{ value: '03', label: '初中三班' }
]
},
{
label: '阶段',
type: 'a-select',
placeholder: '用户大老爷请选择',
keyName: 'jieduan',
options: [
{ value: '01', label: '小学' },
{ value: '02', label: '高中' },
{ value: '03', label: '大学' }
]
},
{
label: '时间',
type: 'a-date-picker',
keyName: 'myTime',
},
{
label: '归还时间',
type: 'a-range-picker',
keyName: 'backTimeArr',
},
{
label: '地址',
default: '成都',
type: 'a-input',
keyName: 'adress',
placeholder: '请输入',
},
],
// 后端需要的字段
searchGiveServe: {
adress: "成都",
backTimeArr: "",
className: "01",
jieduan: "",
myTime: "",
name: "",
}
})
// 重置
const resetHandler = (backMess) => {
listForm.searchGiveServe = backMess
console.log('重置', listForm.searchGiveServe)
}
// 搜索
const searchHandler = (searchBack) => {
listForm.searchGiveServe = searchBack
console.log('搜索', listForm.searchGiveServe)
}
// 如何在初始的时候拿到值呢?初始值需要自己手动设置
console.log('获取表单的初始值', listForm.searchGiveServe)
</script>
<style scoped lang="scss">
.box{
display: flex;
}
.slider{
width: 400px;
background: pink;
}
</style>
vue3封装搜索表单组件的更多相关文章
- 实现Ant Design 自定义表单组件
Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法 ...
- 用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。
Vue3 的父子组件传值.绑定表单数据.UI库的二次封装.防抖等,想来大家都很熟悉了,本篇介绍一种使用 Typescript 的方式进行统一的封装的方法. 基础使用方法 Vue3对于表单的绑定提供了一 ...
- Vue 2.x折腾记 - (17) 基于Ant Design Vue 封装一个配置式的表单组件
前言 写了个类似上篇搜索的封装,但是要考虑的东西更多. 具体业务比展示的代码要复杂,篇幅太长就不引入了. 效果图 2019-04-25 添加了下拉多选的渲染,并搜索默认过滤文本而非值 简化了渲染的子组 ...
- Vue + Element-ui实现后台管理系统(5)---封装一个Form表单组件和Table表格组件
封装一个Form表单组件和Table组件 有关后台管理系统之前写过四遍博客,看这篇之前最好先看下这四篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-syste ...
- 封装react antd的form表单组件
form表单在我们日常的开发过程中被使用到的概率还是很大的,比如包含了登录.注册.修改个人信息.新增修改业务数据等的公司内部管理系统.而在使用时这些表单的样式如高度.上下边距.边框.圆角.阴影.高亮等 ...
- 封装Vue Element的form表单组件
前两天封装了一个基于vue和Element的table表格组件,阅读的人还是很多的,看来大家都是很认同组件化.高复用这种开发模式的,毕竟开发效率高,代码优雅,逼格高嘛.虽然这两天我的心情很糟糕,就像& ...
- vue3 vite2 封装 SVG 图标组件 - 基于 vite 创建 vue3 全家桶项目续篇
在<基于 vite 创建 vue3 全家桶>一文整合了 Element Plus,并将 Element Plus 中提供的图标进行全局注册,这样可以很方便的延续 Element UI 的风 ...
- 【09】react 之 表单组件
不太清楚有多少初学React的同学和博主当时一样,在看完React的生命周期.数据流之后觉得已经上手了,甩开文档啪啪啪的开始敲了起来.结果...居然被一个input标签给教做人了. 故事是这样的:首先 ...
- 从后端到前端之Vue(六)表单组件
表单组件 做项目的时候会遇到一个比较头疼的问题,一个大表单里面有好多控件,一个一个做设置太麻烦,更头疼的是,需求还总在变化,一会多选.一会单选.一会下拉的,变来变去的烦死宝宝了. 那么怎么解决这个问题 ...
- VUE3 之 表单元素
1. 概述 老话说的好:行动起来,原地观望是没有用的. 言归正传,今天我们来聊聊 VUE3 的 表单元素. 2. 表单元素 2.1 文本框与数据绑定 <body> <div id=& ...
随机推荐
- 鲲鹏BoostKit虚拟化使能套件,让数据加密更安全
摘要:借助华为鲲鹏BoostKit虚拟化使能套件(简称鲲鹏BoostKit虚拟化),可加速迈向云计算之旅.本次KAE加速引擎让数据加密更安全直播将介绍鲲鹏BoostKit加速库全景,基于BoostKi ...
- 从“13天”到“0天”延时,揭秘幸福里离线SLA保障最佳实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 "幸福里"是抖音集团旗下集内容.社区.工具于一体的房产媒体综合信息平台,致力于提供多样化 ...
- 远程桌面CredSSP 加密数据库修正
如图所示: 远程桌面连接,出现身份验证错误,要求的函数不受支持,这可能是由于 CredSSP 加密数据库修正
- 编码器-解码器 | 基于 Transformers 的编码器-解码器模型
基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶.本文简要介绍了神经编码器-解码器模型的历史,更多背景知识,建议读者阅读由 Sebastion ...
- Spring 学习笔记(1)文章导读
<Spring 学习笔记>系列文章是博主在学习过 Spring 后对其进行总结的入门系列博文,适合初入 Spring 的小白,如果你最近正在学习或者打算学习 Spring 的话,不妨随着本 ...
- Java文件上传与下载压缩
文件上传与下载压缩 文件上传: 这是一个通用的本地文件的上传代码,可以将文件类型存储到相应的本地目录下 注:本次演示为存储路径为项目所在的resources目录下,可通过url去访问本地文件数据适用于 ...
- 畅捷通的 Serverless 探索实践之路
作者:计缘 畅捷通介绍 畅捷通是中国领先的小微企业财税及业务云服务提供商,成立于2010年.畅捷通在2021年中国小微企业云财税市场份额排名第一,在产品前瞻性及行业全覆盖方面领跑市场,位居中国小微企业 ...
- S3C2440移植linux3.4.2内核之内核裁剪
上一节S3C2440移植linux3.4.2内核之支持YAFFS文件系统我们修改了内核支持了yaffs2文件系统,这节我们裁剪内核. 目录 为什么要裁剪内核? 首先裁剪内核里无关的CPU/单板文件 裁 ...
- springboot2.0+dubbo-spring-boot-starter聚合项目打可执行的jar包
springboot2.0+dubbo聚合项目打可执行的jar包 springboot2.0+dubbo-spring-boot-starter项目服务方打包和以前老版本的dubbo打包方式不一样,不 ...
- 基于html+jquery开发的科学计算器(课程作业)
基于html和jquery开发的科学计算器,该科学计算器可进行乘方.开方.指数.对数.三角函数.统计等方面的运算,又称函数计算器. 科学型带有所有普通的函数,所有的函数都分布在键盘上以致于你可以不用通 ...