antd组件封装 表单查询+table结果展示

本文介绍了如何在前端开发中通过封装组件来提高效率和维护性。具体展示了如何创建一个包含搜索模块和表格结果展示模块的公共组件,包括输入框、下拉选择等元素,并提供了表头和数据列的配置,便于不同页面的复用。此外,还详细说明了组件的状态管理和渲染逻辑,以及表格数据的处理和操作列的定制。
摘要由CSDN通过智能技术生成
在开发中,如果页面有大量的相同功能及UI,我们可以封装成组件复用,以便能减少开发工作量,并能有效的进行统一维护。举个例子,我页面中有大量这种功能,接下来就进行组件的封装

在这里插入图片描述

根据截图可知,功能主要分为两大块,搜索模块 + table结果展示模块
因此,先创建一个公共组件,主要代码如下,formList是头部搜索部分,根据不同页面需要的搜索项进行设置即可
constructor部分
constructor() {
		super()
		this.state = {
			formList: [
				{
					name: 'code',
					type: 'input',
					placeholder: '姓名'
				},
				{
					name: 'name',
					type: 'input',
					placeholder: '年龄'
				},
				{
					name: 'type',
					type: 'select',
					placeholder: '爱好',
					selectList: [
						{
							name: '一类',
							id: 0
						},
						{
							name: '二类',
							id: 1
						}
					]
				},
				{
					name: 'isDepaAdd',
					type: 'select',
					placeholder: '请选择添加',
					selectList: [
						{
							name: '可添加',
							id: 1
						},
						{
							name: '不可添加',
							id: 0
						}
					]
				}
			]
		}
	}
render 部分
<Form
	name="advanced_search"
		className="ant-advanced-search-form"
		onFinish={this.handleSearch}
	>
		<Row gutter={24}>
			{getFields()}
			<Col span={6} style={{ textAlign: 'left'}}>
				<Button type="primary" htmlType="submit">
					查询
				</Button>
			</Col>
		</Row>
	</Form>
js(render中getFields)功能部分,根据type,决定显示input、select、cascader、rangePicker等组件
const getFields = () => {
			const children = [];

			formList.map((item, index) => {
				children.push(
					<Col span={6} key={index}>
						<Form.Item name={item.name}>
							{
								item.type === 'input' ?
									<Input placeholder={item.placeholder} />
									:
									item.type === 'select' ?
									<Select placeholder={item.placeholder}>
										<Option value="">全部</Option>
										{
											item.selectList.length && item.selectList.map(v => {
												return (
														<Option value={v.id} key={v.id}>{v.name}</Option>
													)
											})
										}
									</Select>
										:
										item.type === 'cascader'
										?
											<Cascader
												options={item.optionList}
												onChange={(e) => this.onChangeRegions(e, item)}
												placeholder={item.placeholder}
												changeOnSelect
											/>
										:
									<RangePicker placeholder={item.placeholder} />
							}
						</Form.Item>
					</Col>,
				);
			})

			return children;
		};
至此search部分封装完成,table部分也是如此,贴上代码
	this.state = {
			tableData: {
				loading: false,
				columns: [
					{ title: '编码', dataIndex: 'code'},
					{ title: '名称', dataIndex: 'name' },
					{ title: '类型', dataIndex: 'type', render: (text) => (text === 1) ? '一类' : '二类' },
					{ title: '创建时间', dataIndex: 'createTime' },
					{
						title: '操作',
						dataIndex: '',
						key: 'action',
						width: 160,
						responsive: ['md'],
						render: (record) => <p>
							<Button type="primary" size="small" style={{marginLeft: 8}} onClick={() => this.handleEdit(record)}>编辑</Button>
							<Button type="danger" size="small" style={{marginLeft: 8}} onClick={() => this.handleDelete(record)}>删除</Button>
						</p>,
					},
				],
				data: [],
				paginationParams: {
					pageSize: 10,
					current: 1,
					total: 0,
					showSizeChanger: true
				}
			}
		}

// render部分
<Table
	className={'table'}
	bordered
	columns={columns}
	dataSource={data}
	loading={l
	oading}
	pagination={paginationParams}
	onChange={this.getList}
	style={{marginTop: 16}}
/>
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值