React+hook+ts+ant design封装一个input和select搜索的组件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React+hook+ts+ant design封装一个input和select搜索的组件相关的知识,希望对你有一定的参考价值。

前言

我是歌谣 我有个兄弟 巅峰的时候排名c站总榜19 叫前端小歌谣 曾经我花了三年的时间创作了他 现在我要用五年的时间超越他 今天又是接近兄弟的一天人生难免坎坷 大不了从头再来 歌谣的意志是永恒的 放弃很容易 但是坚持一定很酷 微信公众号前端小歌谣

需求分析

首先 我们需要实现一个带有搜索功能的搜索框 本次只实现两种框的搜索功能 一种input 一种select

功能思维

React+hook+ts+ant

第一步 初始版本

先写出一个input和一个render 还有两个按钮

<Form.Item
label="测试数据"
key="1"
name="测试数据"
rules=xxx
style=xxx
>
true ? <Select/> : <Input />
</Form.Item>
<Form.Item>
<Button htmlType="submit">查询</Button>
</Form.Item>
<Form.Item>
<Button htmlType="reset" onClick=reset>
重置
</Button>
</Form.Item>

开始升级版本(动态渲染搜索框)

接下来可以将搜索的数据改为动态渲染 因为按钮可以固定了 值从父级传入

 props.formList.map((item: SearchFormItem) => (
<Form.Item
label=props.showLabel !== false && item.label ? item.label :
key=item.name
name=item.name
rules=item.rules
style= width: `$item.widthpx`
>
item.render ? item.render : <Input placeholder=item.placeholder />
</Form.Item>
))

继续升级(方法通过子传父)

function SearchForm(props: SearchFormProps) 
const [form] = Form.useForm();

const reset = () =>
form.resetFields();
props.onSearch();
;

const onSearch = () =>
form.validateFields().then(res =>
props.onSearch(res);
);
;

return (
<Form className="layout__search" form=form layout="inline" onFinish=onSearch>
props.formList.map((item: SearchFormItem) => (
<Form.Item
label=props.showLabel !== false && item.label ? item.label :
key=item.name
name=item.name
rules=item.rules
style= width: `$item.widthpx`
>
item.render ? item.render : <Input placeholder=item.placeholder />
</Form.Item>
))
<Form.Item>
<Button htmlType="submit">查询</Button>
</Form.Item>

<Form.Item>
<Button htmlType="reset" onClick=reset>
重置
</Button>
</Form.Item>

props.actions.map((action: SearchFormAction, index: number) => (
<Form.Item key=action.name>
<Button type=action.type onClick=() => props.onClick(index)>
action.name
</Button>
</Form.Item>
))

</Form >
);

继续升级(ts限定数据类型)

import React,  memo  from react;
import Button, Input, Form from antd;
import ButtonType from antd/es/button/button;
import ./index.less;

export interface SearchFormAction
name: string;
type?: ButtonType;


export interface SearchFormItem
name: string;
label: string;
placeholder?: string;
rules?: object[];
render?: React.ReactElement;
width?: any


interface SearchFormProps
formList: SearchFormItem[];
onSearch: (values: any) => void;
actions: SearchFormAction[];
onClick: (index: number) => void;
showLabel?: boolean;
width?: any


function SearchForm(props: SearchFormProps)
const [form] = Form.useForm();

const reset = () =>
form.resetFields();
props.onSearch();
;

const onSearch = () =>
form.validateFields().then(res =>
props.onSearch(res);
);
;

return (
<Form className="layout__search" form=form layout="inline" onFinish=onSearch>
props.formList.map((item: SearchFormItem) => (
<Form.Item
label=props.showLabel !== false && item.label ? item.label :
key=item.name
name=item.name
rules=item.rules
style= width: `$item.widthpx`
>
item.render ? item.render : <Input placeholder=item.placeholder />
</Form.Item>
))
<Form.Item>
<Button htmlType="submit">查询</Button>
</Form.Item>

<Form.Item>
<Button htmlType="reset" onClick=reset>
重置
</Button>
</Form.Item>

props.actions.map((action: SearchFormAction, index: number) => (
<Form.Item key=action.name>
<Button type=action.type onClick=() => props.onClick(index)>
action.name
</Button>
</Form.Item>
))

</Form >
);


export default memo(SearchForm);

看看父组件的使用

<Card>
<SearchForm
formList=formList
actions=actions
onSearch=onSearch
onClick=onAddMenu
showLabel=true
></SearchForm>
</Card>

formList搜索表单值

    const formList = useMemo<SearchFormItem[]>(
() => [

width: 280,
name: factoryId,
placeholder: 请选择所属工厂,
label: 所属工厂,
render: (
<Select
style= width: 100%
placeholder="请选择所属工厂"
optionFilterProp="children"
>
factoryDataList && factoryDataList.map((item: any) => (
<Option value=item.id>item.name</Option>
))
</Select>
)
,
],
[],
);

actions按钮值

const actions = useMemo<SearchFormAction[]>(
() => [

name: 新建,
type: primary,
,
],
[],
);

onSearch子传父方法值

 const onSearch = useCallback(
(params: MenuSearchParams) =>
initPageList(params);
,
[page],
);

onAddMenu 控制弹框开启的值

 const onAddMenu = useCallback(() => 
setCurrentMenu(null);
setEditVisible(true);
, []);

结果

React+hook+ts+ant

我是歌谣 放弃很容易 坚持一定很酷 关注前端小歌谣带你进入前端巅峰交流群

以上是关于React+hook+ts+ant design封装一个input和select搜索的组件的主要内容,如果未能解决你的问题,请参考以下文章

HotKey 触发 Ant Design Select 开始搜索

antd v3 升级 v4

ant design vue + ts 时遇到的坑之from 表单

Ant Design Pro V4.5 从服务器请求菜单图标不显示解决

vue-element-admin 使用过程中遇到的问题

React开发(258):react项目理解 ant design debug