Antd Select与Menu组合使用

文章描述了如何在AntDesign中创建一个自定义级联选择器组件,以满足最后一层根据配置显示不同状态的需求。作者提到中文输入法下hover触发的焦点问题以及select和menu组件状态同步的挑战,并提供了相应的解决方法。
摘要由CSDN通过智能技术生成

业务需求上需要实现一个类似于这样的组件

很像级联选择器Cascader的作用,但最后一层需要根据相应配置显示不同的状态,如下拉列表、输入框等,基本代码如下

import type { MenuProps } from 'antd'
import { Input, Menu, Select } from 'antd'
import React, { useState } from 'react'

const CustomCascader: React.FC = () => {
    const [open, SetOpen] = useState<boolean>(false)
    return (
        <Select
            open={open}
            onDropdownVisibleChange={(visible) => SetOpen(visible)} //由于select组件的下拉框与Menu弹出框并非一个组件,所以需要手动控制下拉框的打开状态
            style={{ width: '200px' }}
            dropdownRender={() => {
                return (
                    <Menu triggerSubMenuAction="click">
                        <Menu.Item>菜单项一</Menu.Item>
                        <Menu.Item>菜单项二</Menu.Item>
                        <Menu.SubMenu title="子菜单">
                            <Menu.Item>
                                {' '}
                                <Input />
                            </Menu.Item>
                        </Menu.SubMenu>
                        <Menu.SubMenu title="子菜单">
                            <Menu.SubMenu title="第二层">
                                <Menu.Item>
                                    {' '}
                                    <Input
                                        onClick={(e) => {
                                            e.stopPropagation() // 阻止冒泡,防止点击该元素触发父元素点击事件,Menu弹出框直接关闭
                                        }}
                                    />
                                </Menu.Item>
                            </Menu.SubMenu>
                        </Menu.SubMenu>
                        <Menu.SubMenu title="子菜单">
                            <Menu.SubMenu title="第三层">
                                <Menu.Item>1</Menu.Item>
                                <Menu.Item>2</Menu.Item>
                                <Menu.Item>3</Menu.Item>
                                <Menu.Item>4</Menu.Item>
                            </Menu.SubMenu>
                        </Menu.SubMenu>
                    </Menu>
                )
            }}
        />
    )
}

export default CustomCascader

以输入框为例,谈一下遇见的问题:

1.当triggerSubMenuAction为hover且输入时为中文输入法,中文字符选择框会使组件失焦,弹出框直接消失,这里需要把triggerSubMenuAction属性变为click可以解决该问题

2.由于select组件与menu本不是一个整体,所以第一层下拉框为select的open状态,第二三层为menu组件的open状态,容易出现这样的问题

解决办法为手动控制select的open状态(见代码注释)

这样处理menu和select弹出框的状态有时仍然不能同步,欢迎各位大佬来指点呀

antd是一个非常流行的React组件库,其中包含了丰富的UI组件和工具。它提供了一个Table组件用于快速创建数据表格,也提供了Form组件用于创建表单。 在实际应用中,我们通常需要将表格与表单结合使用。一种常见的场景是,当用户点击表格中的一行数据时,需要将该数据的详细信息展示在表单中,以便用户进行编辑或其他操作。 使用antd的Table组件和Form组件结合时,我们可以根据需求进行如下操作: 1. 设置表格的选择功能:antd的Table组件支持设置行级的选择功能,可以通过设置rowSelection属性来实现,该属性可以指定选择操作的配置项,比如选择模式、默认选中的行、选择时触发的回调函数等。 2. 设置表格的行点击事件:我们可以通过设置Table组件的onRow属性来指定行点击时触发的回调函数,该函数可以接收点击的行索引作为参数,我们可以在回调函数中将该索引赋值给一个状态变量,然后在表单中根据这个状态变量获取点击行的具体数据。 3. 在表单中展示点击行的数据:使用Form组件创建表单时,可以使用getFieldDecorator方法来绑定表单项与数据源,从而实现数据的双向绑定。我们可以通过在表单项的初始值中设置获取点击行数据的方式,从而在表单中展示对应数据。 4. 表单的提交与重置:在表单中编辑完数据后,我们可以通过antd的Form组件提供的handleSubmit和handleReset方法来分别处理表单的提交和重置操作。handleSubmit方法会在表单校验通过后触发一个回调函数,我们可以在该回调函数中进行数据的提交操作。handleReset方法会重置表单的所有字段和初始值。 综上所述,antd的Table组件和Form组件可以很方便地结合使用,通过设置选择功能、行点击事件以及使用数据绑定和提交重置方法,可以实现自定义的表格与表单交互功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值