Antd Pro实现Icon图标选择器

最近使用antd pro搭建的项目中作到了动态菜单那部分,所以就先将菜单模块实现了出来,其中自定义选择图标那块在网上没有自己想要的那种,所以就自己封装了一个并且记录使用。

antd pro使用版本:v6
umi使用版本:4

展示效果:

组件展示

具体使用流程

具体使用动态图

准备工作

创建自定义图标组件

目录结构
目录结构
iconData.ts文件(这个文件比较大,是我根据antd官网中icon分类创建的)

// icon分类数据整合
// 方向性图标-线框风格
export const directionOutlined: string[] = [
  "StepBackwardOutlined",
  "StepForwardOutlined",
  "FastBackwardOutlined",
  "FastForwardOutlined",
  "ShrinkOutlined",
  "ArrowsAltOutlined",
  "DownOutlined",
  "UpOutlined",
  "LeftOutlined",
  "RightOutlined",
  "CaretUpOutlined",
  "CaretDownOutlined",
  "CaretLeftOutlined",
  "CaretRightOutlined",
  "UpCircleOutlined",
  "DownCircleOutlined",
  "LeftCircleOutlined",
  "RightCircleOutlined",
  "DoubleRightOutlined",
  "DoubleLeftOutlined",
  "VerticalLeftOutlined",
  "VerticalRightOutlined",
  "VerticalAlignTopOutlined",
  "VerticalAlignMiddleOutlined",
  "VerticalAlignBottomOutlined",
  "ForwardOutlined",
  "BackwardOutlined",
  "RollbackOutlined",
  "EnterOutlined",
  "RetweetOutlined",
  "SwapOutlined",
  "SwapLeftOutlined",
  "SwapRightOutlined",
  "ArrowUpOutlined",
  "ArrowDownOutlined",
  "ArrowLeftOutlined",
  "ArrowRightOutlined",
  "PlayCircleOutlined",
  "UpSquareOutlined",
  "DownSquareOutlined",
  "LeftSquareOutlined",
  "RightSquareOutlined",
  "LoginOutlined",
  "LogoutOutlined",
  "MenuFoldOutlined",
  "MenuUnfoldOutlined",
  "BorderBottomOutlined",
  "BorderHorizontalOutlined",
  "BorderInnerOutlined",
  "BorderOuterOutlined",
  "BorderLeftOutlined",
  "BorderRightOutlined",
  "BorderTopOutlined",
  "BorderVerticleOutlined",
  "PicCenterOutlined",
  "PicLeftOutlined",
  "PicRightOutlined",
  "RadiusBottomleftOutlined",
  "RadiusBottomrightOutlined",
  "RadiusUpleftOutlined",
  "RadiusUprightOutlined",
  "FullscreenOutlined",
  "FullscreenExitOutlined"
]

// 提示建议性图标-线框风格
export const suggestionOutlined: string[] = [
  "QuestionOutlined",
  "QuestionCircleOutlined",
  "PlusOutlined",
  "PlusCircleOutlined",
  "PauseOutlined",
  "PauseCircleOutlined",
  "MinusOutlined",
  "MinusCircleOutlined",
  "PlusSquareOutlined",
  "MinusSquareOutlined",
  "InfoOutlined",
  "InfoCircleOutlined",
  "ExclamationOutlined",
  "ExclamationCircleOutlined",
  "CloseOutlined",
  "CloseCircleOutlined",
  "CloseSquareOutlined",
  "CheckOutlined",
  "CheckCircleOutlined",
  "CheckSquareOutlined",
  "ClockCircleOutlined",
  "WarningOutlined",
  "IssuesCloseOutlined",
  "StopOutlined"
]

// 编辑类图标-线框风格
export const editorOutlined: string[] = [
  "EditOutlined",
  "FormOutlined",
  "CopyOutlined",
  "ScissorOutlined",
  "DeleteOutlined",
  "SnippetsOutlined",
  "DiffOutlined",
  "HighlightOutlined",
  "AlignCenterOutlined",
  "AlignLeftOutlined",
  "AlignRightOutlined",
  "BgColorsOutlined",
  "BoldOutlined",
  "ItalicOutlined",
  "UnderlineOutlined",
  "StrikethroughOutlined",
  "RedoOutlined",
  "UndoOutlined",
  "ZoomInOutlined",
  "ZoomOutOutlined",
  "FontColorsOutlined",
  "FontSizeOutlined",
  "LineHeightOutlined",
  "DashOutlined",
  "SmallDashOutlined",
  "SortAscendingOutlined",
  "SortDescendingOutlined",
  "DragOutlined",
  "OrderedListOutlined",
  "UnorderedListOutlined",
  "RadiusSettingOutlined",
  "ColumnWidthOutlined",
  "ColumnHeightOutlined"
]

// 数据类图标-线框风格
export const dataOutlined: string[] = [
  "AreaChartOutlined",
  "PieChartOutlined",
  "BarChartOutlined",
  "DotChartOutlined",
  "LineChartOutlined",
  "RadarChartOutlined",
  "HeatMapOutlined",
  "FallOutlined",
  "RiseOutlined",
  "StockOutlined",
  "BoxPlotOutlined",
  "FundOutlined",
  "SlidersOutlined"
]

// 品牌类图标-线框风格
export const logoOutlined: string[] = [
  "AndroidOutlined",
  "AppleOutlined",
  "WindowsOutlined",
  "IeOutlined",
  "ChromeOutlined",
  "GithubOutlined",
  "AliwangwangOutlined",
  "DingdingOutlined",
  "WeiboSquareOutlined",
  "WeiboCircleOutlined",
  "TaobaoCircleOutlined",
  "Html5Outlined",
  "WeiboOutlined",
  "TwitterOutlined",
  "WechatOutlined",
  "WhatsAppOutlined",
  "YoutubeOutlined",
  "AlipayCircleOutlined",
  "TaobaoOutlined",
  "DingtalkOutlined",
  "SkypeOutlined",
  "QqOutlined",
  "MediumWorkmarkOutlined",
  "GitlabOutlined",
  "MediumOutlined",
  "LinkedinOutlined",
  "GooglePlusOutlined",
  "DropboxOutlined",
  "FacebookOutlined",
  "CodepenOutlined",
  "CodeSandboxOutlined",
  "AmazonOutlined",
  "GoogleOutlined",
  "CodepenCircleOutlined",
  "AlipayOutlined",
  "AntDesignOutlined",
  "AntCloudOutlined",
  "AliyunOutlined",
  "ZhihuOutlined",
  "SlackOutlined",
  "SlackSquareOutlined",
  "BehanceOutlined",
  "BehanceSquareOutlined",
  "DribbbleOutlined",
  "DribbbleSquareOutlined",
  "InstagramOutlined",
  "YuqueOutlined",
  "AlibabaOutlined",
  "YahooOutlined",
  "RedditOutlined",
  "SketchOutlined"
]

// 网站通用图标-线框风格
export const otherOutlined: string[] = [
  "AccountBookOutlined",
  "AimOutlined",
  "AlertOutlined",
  "ApartmentOutlined",
  "ApiOutlined",
  "AppstoreAddOutlined",
  "AppstoreOutlined",
  "AudioOutlined",
  "AudioMutedOutlined",
  "AuditOutlined",
  "BankOutlined",
  "BarcodeOutlined",
  "BarsOutlined",
  "BellOutlined",
  "BlockOutlined",
  "BookOutlined",
  "BorderOutlined",
  "BorderlessTableOutlined",
  "BranchesOutlined",
  "BugOutlined",
  "BuildOutlined",
  "BulbOutlined",
  "CalculatorOutlined",
  "CalendarOutlined",
  "CameraOutlined",
  "CarOutlined",
  "CarryOutOutlined",
  "CiCircleOutlined",
  "CiOutlined",
  "ClearOutlined",
  "CloudDownloadOutlined",
  "CloudOutlined",
  "CloudServerOutlined",
  "CloudSyncOutlined",
  "CloudUploadOutlined",
  "ClusterOutlined",
  "CodeOutlined",
  "CoffeeOutlined",
  "CommentOutlined",
  "CompassOutlined",
  "CompressOutlined",
  "ConsoleSqlOutlined",
  "ContactsOutlined",
  "ContainerOutlined",
  "ControlOutlined",
  "CopyrightOutlined",
  "CreditCardOutlined",
  "CrownOutlined",
  "CustomerServiceOutlined",
  "DashboardOutlined",
  "DatabaseOutlined",
  "DeleteColumnOutlined",
  "DeleteRowOutlined",
  "DeliveredProcedureOutlined",
  "DeploymentUnitOutlined",
  "DesktopOutlined",
  "DisconnectOutlined",
  "DislikeOutlined",
  "DollarOutlined",
  "DownloadOutlined",
  "EllipsisOutlined",
  "EnvironmentOutlined",
  "EuroCircleOutlined",
  "EuroOutlined",
  "ExceptionOutlined",
  "ExpandAltOutlined",
  "ExpandOutlined",
  "ExperimentOutlined",
  "ExportOutlined",
  "EyeOutlined",
  "EyeInvisibleOutlined",
  "FieldBinaryOutlined",
  "FieldNumberOutlined",
  "FieldStringOutlined",
  "FieldTimeOutlined",
  "FileAddOutlined",
  "FileDoneOutlined",
  "FileExcelOutlined",
  "FileExclamationOutlined",
  "FileOutlined",
  "FileGifOutlined",
  "FileImageOutlined",
  "FileJpgOutlined",
  "FileMarkdownOutlined",
  "FilePdfOutlined",
  "FilePptOutlined",
  "FileProtectOutlined",
  "FileSearchOutlined",
  "FileSyncOutlined",
  "FileTextOutlined",
  "FileUnknownOutlined",
  "FileWordOutlined",
  "FileZipOutlined",
  "FilterOutlined",
  "FireOutlined",
  "FlagOutlined",
  "FolderAddOutlined",
  "FolderOutlined",
  "FolderOpenOutlined",
  "FolderViewOutlined",
  "ForkOutlined",
  "FormatPainterOutlined",
  "FrownOutlined",
  "FunctionOutlined",
  "FundProjectionScreenOutlined",
  "FundViewOutlined",
  "FunnelPlotOutlined",
  "GatewayOutlined",
  "GifOutlined",
  "GiftOutlined",
  "GlobalOutlined",
  "GoldOutlined",
  "GroupOutlined",
  "HddOutlined",
  "HeartOutlined",
  "HistoryOutlined",
  "HolderOutlined",
  "HomeOutlined",
  "HourglassOutlined",
  "IdcardOutlined",
  "ImportOutlined",
  "InboxOutlined",
  "InsertRowAboveOutlined",
  "InsertRowBelowOutlined",
  "InsertRowLeftOutlined",
  "InsertRowRightOutlined",
  "InsuranceOutlined",
  "InteractionOutlined",
  "KeyOutlined",
  "LaptopOutlined",
  "LayoutOutlined",
  "LikeOutlined",
  "LineOutlined",
  "LinkOutlined",
  "Loading3QuartersOutlined",
  "LoadingOutlined",
  "LockOutlined",
  "MacCommandOutlined",
  "MailOutlined",
  "ManOutlined",
  "MedicineBoxOutlined",
  "MehOutlined",
  "MenuOutlined",
  "MergeCellsOutlined",
  "MessageOutlined",
  "MobileOutlined",
  "MoneyCollectOutlined",
  "MonitorOutlined",
  "MoreOutlined",
  "NodeCollapseOutlined",
  "NodeExpandOutlined",
  "NodeIndexOutlined",
  "NotificationOutlined",
  "NumberOutlined",
  "OneToOneOutlined",
  "PaperClipOutlined",
  "PartitionOutlined",
  "PayCircleOutlined",
  "PercentageOutlined",
  "PhoneOutlined",
  "PictureOutlined",
  "PlaySquareOutlined",
  "PoundCircleOutlined",
  "PoundOutlined",
  "PoweroffOutlined",
  "PrinterOutlined",
  "ProfileOutlined",
  "ProjectOutlined",
  "PropertySafetyOutlined",
  "PullRequestOutlined",
  "PushpinOutlined",
  "QrcodeOutlined",
  "ReadOutlined",
  "ReconciliationOutlined",
  "RedEnvelopeOutlined",
  "ReloadOutlined",
  "RestOutlined",
  "RobotOutlined",
  "RocketOutlined",
  "RotateLeftOutlined",
  "RotateRightOutlined",
  "SafetyCertificateOutlined",
  "SafetyOutlined",
  "SaveOutlined",
  "ScanOutlined",
  "ScheduleOutlined",
  "SearchOutlined",
  "SecurityScanOutlined",
  "SelectOutlined",
  "SendOutlined",
  "SettingOutlined",
  "ShakeOutlined",
  "ShareAltOutlined",
  "ShopOutlined",
  "ShoppingCartOutlined",
  "ShoppingOutlined",
  "SisternodeOutlined",
  "SkinOutlined",
  "SmileOutlined",
  "SolutionOutlined",
  "SoundOutlined",
  "SplitCellsOutlined",
  "StarOutlined",
  "SubnodeOutlined",
  "SwitcherOutlined",
  "SyncOutlined",
  "TableOutlined",
  "TabletOutlined",
  "TagOutlined",
  "TagsOutlined",
  "TeamOutlined",
  "ThunderboltOutlined",
  "ToTopOutlined",
  "ToolOutlined",
  "TrademarkCircleOutlined",
  "TrademarkOutlined",
  "TransactionOutlined",
  "TranslationOutlined",
  "TrophyOutlined",
  "UngroupOutlined",
  "UnlockOutlined",
  "UploadOutlined",
  "UsbOutlined",
  "UserAddOutlined",
  "UserDeleteOutlined",
  "UserOutlined",
  "UserSwitchOutlined",
  "UsergroupAddOutlined",
  "UsergroupDeleteOutlined",
  "VerifiedOutlined",
  "VideoCameraAddOutlined",
  "VideoCameraOutlined",
  "WalletOutlined",
  "WifiOutlined",
  "WomanOutlined"
]

// 方向性图标-实底风格
export const directionFilled: string[] = [
  "StepBackwardFilled",
  "StepForwardFilled",
  "FastBackwardFilled",
  "FastForwardFilled",
  "CaretUpFilled",
  "CaretDownFilled",
  "CaretLeftFilled",
  "CaretRightFilled",
  "UpCircleFilled",
  "DownCircleFilled",
  "LeftCircleFilled",
  "RightCircleFilled",
  "ForwardFilled",
  "BackwardFilled",
  "PlayCircleFilled",
  "UpSquareFilled",
  "DownSquareFilled",
  "LeftSquareFilled",
  "RightSquareFilled"
]

// 提示建议性图标-实底风格
export const suggestionFilled: string[] = [
  "QuestionCircleFilled",
  "PlusCircleFilled",
  "PauseCircleFilled",
  "MinusCircleFilled",
  "PlusSquareFilled",
  "MinusSquareFilled",
  "InfoCircleFilled",
  "ExclamationCircleFilled",
  "CloseCircleFilled",
  "CloseSquareFilled",
  "CheckCircleFilled",
  "CheckSquareFilled",
  "ClockCircleFilled",
  "WarningFilled",
  "StopFilled"
]

// 编辑类图标-实底风格
export const editorFilled: string[] = [
  "EditFilled",
  "CopyFilled",
  "DeleteFilled",
  "SnippetsFilled",
  "DiffFilled",
  "HighlightFilled"
]

// 数据类图标-实底风格
export const dataFilled: string[] = [
  "PieChartFilled",
  "BoxPlotFilled",
  "FundFilled",
  "SlidersFilled"
]

// 品牌类图标-实底风格
export const logoFilled: string[] = [
  "AndroidFilled",
  "AppleFilled",
  "WindowsFilled",
  "ChromeFilled",
  "GithubFilled",
  "AliwangwangFilled",
  "WeiboSquareFilled",
  "WeiboCircleFilled",
  "TaobaoCircleFilled",
  "Html5Filled",
  "WechatFilled",
  "YoutubeFilled",
  "AlipayCircleFilled",
  "SkypeFilled",
  "GitlabFilled",
  "LinkedinFilled",
  "FacebookFilled",
  "CodeSandboxCircleFilled",
  "CodepenCircleFilled",
  "SlackSquareFilled",
  "BehanceSquareFilled",
  "DribbbleSquareFilled",
  "InstagramFilled",
  "YuqueFilled",
  "YahooFilled"
]

// 网站通用图标-实底风格
export const otherFilled: string[] = [
  "AccountBookFilled",
  "AlertFilled",
  "AlipaySquareFilled",
  "AmazonCircleFilled",
  "AmazonSquareFilled",
  "ApiFilled",
  "AppstoreFilled",
  "AudioFilled",
  "BankFilled",
  "BehanceCircleFilled",
  "BellFilled",
  "BookFilled",
  "BugFilled",
  "BuildFilled",
  "BulbFilled",
  "CalculatorFilled",
  "CalendarFilled",
  "CameraFilled",
  "CarFilled",
  "CarryOutFilled",
  "CiCircleFilled",
  "CloudFilled",
  "CodeFilled",
  "CodeSandboxSquareFilled",
  "CodepenSquareFilled",
  "CompassFilled",
  "ContactsFilled",
  "ContainerFilled",
  "ControlFilled",
  "CreditCardFilled",
  "CrownFilled",
  "CustomerServiceFilled",
  "DashboardFilled",
  "DatabaseFilled",
  "DingtalkCircleFilled",
  "DingtalkSquareFilled",
  "DislikeFilled",
  "DribbbleCircleFilled",
  "DropboxCircleFilled",
  "DropboxSquareFilled",
  "EnvironmentFilled",
  "EuroCircleFilled",
  "ExperimentFilled",
  "EyeFilled",
  "EyeInvisibleFilled",
  "FileAddFilled",
  "FileExcelFilled",
  "FileExclamationFilled",
  "FileFilled",
  "FileImageFilled",
  "FileMarkdownFilled",
  "FilePdfFilled",
  "FilePptFilled",
  "FileTextFilled",
  "FileUnknownFilled",
  "FileWordFilled",
  "FileZipFilled",
  "FilterFilled",
  "FireFilled",
  "FlagFilled",
  "FolderAddFilled",
  "FolderFilled",
  "FolderOpenFilled",
  "FormatPainterFilled",
  "FrownFilled",
  "FunnelPlotFilled",
  "GiftFilled",
  "GoldFilled",
  "GoldenFilled",
  "GoogleCircleFilled",
  "GooglePlusCircleFilled",
  "GooglePlusSquareFilled",
  "GoogleSquareFilled",
  "HddFilled",
  "HeartFilled",
  "HomeFilled",
  "HourglassFilled",
  "IdcardFilled",
  "IeCircleFilled",
  "IeSquareFilled",
  "InsuranceFilled",
  "InteractionFilled",
  "LayoutFilled",
  "LikeFilled",
  "LockFilled",
  "MacCommandFilled",
  "MailFilled",
  "MedicineBoxFilled",
  "MediumCircleFilled",
  "MediumSquareFilled",
  "MehFilled",
  "MessageFilled",
  "MobileFilled",
  "MoneyCollectFilled",
  "NotificationFilled",
  "PayCircleFilled",
  "PhoneFilled",
  "PictureFilled",
  "PlaySquareFilled",
  "PoundCircleFilled",
  "PrinterFilled",
  "ProfileFilled",
  "ProjectFilled",
  "PropertySafetyFilled",
  "PushpinFilled",
  "QqCircleFilled",
  "QqSquareFilled",
  "ReadFilled",
  "ReconciliationFilled",
  "RedEnvelopeFilled",
  "RedditCircleFilled",
  "RedditSquareFilled",
  "RestFilled",
  "RobotFilled",
  "RocketFilled",
  "SafetyCertificateFilled",
  "SaveFilled",
  "ScheduleFilled",
  "SecurityScanFilled",
  "SettingFilled",
  "ShopFilled",
  "ShoppingFilled",
  "SignalFilled",
  "SketchCircleFilled",
  "SketchSquareFilled",
  "SkinFilled",
  "SlackCircleFilled",
  "SmileFilled",
  "SoundFilled",
  "StarFilled",
  "SwitcherFilled",
  "TabletFilled",
  "TagFilled",
  "TagsFilled",
  "TaobaoSquareFilled",
  "ThunderboltFilled",
  "ToolFilled",
  "TrademarkCircleFilled",
  "TrophyFilled",
  "TwitterCircleFilled",
  "TwitterSquareFilled",
  "UnlockFilled",
  "UsbFilled",
  "VideoCameraFilled",
  "WalletFilled",
  "ZhihuCircleFilled",
  "ZhihuSquareFilled"
]

// 方向性图标-双色风格
export const directionTwoTone: string[] = [
  "UpCircleTwoTone",
  "DownCircleTwoTone",
  "LeftCircleTwoTone",
  "RightCircleTwoTone",
  "PlayCircleTwoTone",
  "UpSquareTwoTone",
  "DownSquareTwoTone",
  "LeftSquareTwoTone",
  "RightSquareTwoTone"
]

// 提示建议性图标-双色风格
export const suggestionTwoTone: string[] = [
  "QuestionCircleTwoTone",
  "PlusCircleTwoTone",
  "PauseCircleTwoTone",
  "MinusCircleTwoTone",
  "PlusSquareTwoTone",
  "MinusSquareTwoTone",
  "InfoCircleTwoTone",
  "ExclamationCircleTwoTone",
  "CloseCircleTwoTone",
  "CloseSquareTwoTone",
  "CheckCircleTwoTone",
  "CheckSquareTwoTone",
  "ClockCircleTwoTone",
  "WarningTwoTone",
  "StopTwoTone"
]

// 编辑类图标-双色风格
export const editorTwoTone: string[] = [
  "EditTwoTone",
  "CopyTwoTone",
  "DeleteTwoTone",
  "SnippetsTwoTone",
  "DiffTwoTone",
  "HighlightTwoTone"
]

// 数据类图标-双色风格
export const dataTwoTone: string[] = [
  "PieChartTwoTone",
  "BoxPlotTwoTone",
  "FundTwoTone",
  "SlidersTwoTone"
]

// 品牌和标识-双色风格
export const logoTwoTone: string[] = ["Html5TwoTone"]

// 网站通用图标-双色风格
export const otherTwoTone: string[] = [
  "AccountBookTwoTone",
  "AlertTwoTone",
  "ApiTwoTone",
  "AppstoreTwoTone",
  "AudioTwoTone",
  "BankTwoTone",
  "BellTwoTone",
  "BookTwoTone",
  "BugTwoTone",
  "BuildTwoTone",
  "BulbTwoTone",
  "CalculatorTwoTone",
  "CalendarTwoTone",
  "CameraTwoTone",
  "CarTwoTone",
  "CarryOutTwoTone",
  "CiCircleTwoTone",
  "CiTwoTone",
  "CloudTwoTone",
  "CodeTwoTone",
  "CompassTwoTone",
  "ContactsTwoTone",
  "ContainerTwoTone",
  "ControlTwoTone",
  "CopyrightTwoTone",
  "CreditCardTwoTone",
  "CrownTwoTone",
  "CustomerServiceTwoTone",
  "DashboardTwoTone",
  "DatabaseTwoTone",
  "DislikeTwoTone",
  "DollarTwoTone",
  "EnvironmentTwoTone",
  "EuroCircleTwoTone",
  "EuroTwoTone",
  "ExperimentTwoTone",
  "EyeTwoTone",
  "EyeInvisibleTwoTone",
  "FileAddTwoTone",
  "FileExcelTwoTone",
  "FileExclamationTwoTone",
  "FileTwoTone",
  "FileImageTwoTone",
  "FileMarkdownTwoTone",
  "FilePdfTwoTone",
  "FilePptTwoTone",
  "FileTextTwoTone",
  "FileUnknownTwoTone",
  "FileWordTwoTone",
  "FileZipTwoTone",
  "FilterTwoTone",
  "FireTwoTone",
  "FlagTwoTone",
  "FolderAddTwoTone",
  "FolderTwoTone",
  "FolderOpenTwoTone",
  "FrownTwoTone",
  "FunnelPlotTwoTone",
  "GiftTwoTone",
  "GoldTwoTone",
  "HddTwoTone",
  "HeartTwoTone",
  "HomeTwoTone",
  "HourglassTwoTone",
  "IdcardTwoTone",
  "InsuranceTwoTone",
  "InteractionTwoTone",
  "LayoutTwoTone",
  "LikeTwoTone",
  "LockTwoTone",
  "MailTwoTone",
  "MedicineBoxTwoTone",
  "MehTwoTone",
  "MessageTwoTone",
  "MobileTwoTone",
  "MoneyCollectTwoTone",
  "NotificationTwoTone",
  "PhoneTwoTone",
  "PictureTwoTone",
  "PlaySquareTwoTone",
  "PoundCircleTwoTone",
  "PrinterTwoTone",
  "ProfileTwoTone",
  "ProjectTwoTone",
  "PropertySafetyTwoTone",
  "PushpinTwoTone",
  "ReconciliationTwoTone",
  "RedEnvelopeTwoTone",
  "RestTwoTone",
  "RocketTwoTone",
  "SafetyCertificateTwoTone",
  "SaveTwoTone",
  "ScheduleTwoTone",
  "SecurityScanTwoTone",
  "SettingTwoTone",
  "ShopTwoTone",
  "ShoppingTwoTone",
  "SkinTwoTone",
  "SmileTwoTone",
  "SoundTwoTone",
  "StarTwoTone",
  "SwitcherTwoTone",
  "TabletTwoTone",
  "TagTwoTone",
  "TagsTwoTone",
  "ThunderboltTwoTone",
  "ToolTwoTone",
  "TrademarkCircleTwoTone",
  "TrophyTwoTone",
  "UnlockTwoTone",
  "UsbTwoTone",
  "VideoCameraTwoTone",
  "WalletTwoTone"
]

// 线框风格全部种类数据
export const Outlined = [
  {'title': '方向性图标', key: 'direction', icons: directionOutlined},
  {'title': '提示建议性图标', key: 'suggestion', icons: suggestionOutlined},
  {'title': '编辑类图标', key: 'editor', icons: editorOutlined},
  {'title': '数据类图标', key: 'data', icons: dataOutlined},
  {'title': '品牌和标识', key: 'logo', icons: logoOutlined},
  {'title': '网站通用图标', key: 'other', icons: otherOutlined},
]

// 实底风格全部种类数据
export const Filled = [
  {'title': '方向性图标', key: 'direction', icons: directionFilled},
  {'title': '提示建议性图标', key: 'suggestion', icons: suggestionFilled},
  {'title': '编辑类图标', key: 'editor', icons: editorFilled},
  {'title': '数据类图标', key: 'data', icons: dataFilled},
  {'title': '品牌和标识', key: 'logo', icons: logoFilled},
  {'title': '网站通用图标', key: 'other', icons: otherFilled},
]

// 双色风格全部种类数据
export const TwoTone = [
  {'title': '方向性图标', key: 'direction', icons: directionTwoTone},
  {'title': '提示建议性图标', key: 'suggestion', icons: suggestionTwoTone},
  {'title': '编辑类图标', key: 'editor', icons: editorTwoTone},
  {'title': '数据类图标', key: 'data', icons: dataTwoTone},
  {'title': '品牌和标识', key: 'logo', icons: logoTwoTone},
  {'title': '网站通用图标', key: 'other', icons: otherTwoTone},
]

export const iconData = [
  {'title': '线框风格', key: 'outlined', icons: Outlined},
  {'title': '实底风格', key: 'filled', icons: Filled},
  {'title': '双色风格', key: 'twoTone', icons: TwoTone}
]

index.tsx组件定义

import React, {useEffect, useState} from 'react';
import {Button, Modal, Row, Tabs} from 'antd';
import * as icons from "@ant-design/icons";
import {iconData} from "./iconData"
import {Tab} from "rc-tabs/lib/interface";

const IconSelect: React.FC<XH.ChildComponentProps> = (props) => {

  // @ts-ignore
  const [currentIcon, setCurrentIcon] = useState<string>(props.parentKey)
  const [viewData, setViewData] = useState<Tab[]>([])

  useEffect(() => {
    // 定义风格分类数据
    const styleData: Tab[] = [];
    iconData.forEach(styleItem => {
      // 定义图标分类数据
      const typeData: Tab[] = [];
      // 遍历展示各个图标分类
      const typeIcons = styleItem.icons
      typeIcons.filter(typeItem => {
        // 将各分类下的图标遍历到页面
        const childData = typeItem.icons
        typeData.push({
          key: typeItem.key,
          label: typeItem.title,
          children: (
            <>
              {
                childData.map(item => {
                  return <Button key={item} onClick={() => change(item)} type="text"><Icon name={item}/></Button>
                })
              }
            </>
          )
        })
      })

      styleData.push({
        key: styleItem.key,
        label: styleItem.title,
        children: (
          <Tabs items={typeData}/>
        )
      })
    })
    setViewData(styleData)
  }, [])

  const change = (value: string) => {
    console.log("展示获取数据", value)
    setCurrentIcon(value)
  }

  return (
    <Modal
      open={props.visible}
      onCancel={props.cancelView}
      onOk={() => props.submitView?.(currentIcon)}
      closable={false}
      width={'50vw'}
      title="图标选择"
      destroyOnClose
    >
      <Tabs items={viewData}/>
      <Row style={{paddingTop: '30px'}}>
        当前选择图标:
        {
          currentIcon ? <><Icon name={currentIcon}/> {currentIcon}</> : ''
        }
      </Row>
    </Modal>
  )
}

export const Icon = (props: { name: string }) => {
  const {name} = props
  const antIcon: { [key: string]: any } = icons
  return React.createElement(antIcon[name])
}

export default IconSelect;

上方使用的XH.ChildComponentProps是我项目中自定义的一个类型
typings.d.ts文件定义

// 首先看此文件的全名称,是以.d.ts结尾的。ts规定在.d.ts中声明的变量或者模块,其他位置不需要使用import也能直接使用,还包含提示
// 但是需要在tsconfig.json的include中配置.d.ts文件路径(父路径即可)
// .d.ts文件中的顶级声明必须以declare或export修饰符开头

declare namespace XH {
  // 统一返回对象
  type XingHuoResult = {
    code?: number;
    msg?: string;
    data?: any | CurrentUser | NoticeIconItem[];
    // 类型,目前只表示登录类型(密码登录与手机验证码登录)
    type?: string;
    // 分页查询总条数
    total?: number;
  }
  // 子组件接收对象
  type ChildComponentProps = {
    // 是否展示
    visible: boolean
    // 回调父组件函数-关闭
    cancelView?: () => void
    // 回调父组件函数-提交
    submitView?: (data: any) => void
    // 唯一键值(一般用于详细等功能使用)
    parentKey: string | number
  }
}

组件引用方式
这里我主要粘贴表单那块的内容

// 用于展示自定义图标组件
const [iconVisible, setIconVisible] = useState<boolean>(false)
// 当前展示图标
const [currentIcon, setCurrentIcon] = useState<string>('')

// 将子组件选择的icon进行存储
const setIcon = (icon: string) => {
    form.current?.setFieldValue('icon', icon)
    setCurrentIcon(icon)
    setIconVisible(false)
}

<ModalForm<SysMenuItem>
        title={title}
        visible={visible}
        formRef={form}
        autoFocusFirstInput
        modalProps={{
          destroyOnClose: true,
          onCancel: () => {
            setVisible(false)
          },
        }}
        submitTimeout={2000}
        onFinish={async (data) => {
          let result;
          if (type == 'add') {
            result = await addMenu(data)
          } else {
            result = await updateMenu(data)
          }
          if (result.code === 200) {
            setVisible(false);
            actionRef.current?.reload();
            message.success('提交成功');
          } else {
            message.success('操作失败');
          }
          return true;
        }}
        grid={true}
      >
        <ProForm.Item name="menuId" hidden/>
        <ProFormText
          width="md"
          name="parentId"
          label="上级菜单"
          placeholder="请选择上级菜单"
          colProps={{span: 12}}
        />
        <ProFormRadio.Group
          width="md"
          name="menuType"
          label="菜单类型"
          colProps={{span: 12}}
          initialValue={'M'}
          options={[
            {
              label: '目录',
              value: 'M',
            },
            {
              label: '菜单',
              value: 'C',
            },
            {
              label: '按钮',
              value: 'F',
            },
          ]}
        />
        <ProFormText
          width="md"
          name="icon"
          label="菜单图标"
          placeholder="点击选择图标"
          colProps={{span: 12}}
          fieldProps={{
            readOnly: true,
            onClick: () => {
              setIconVisible(true)
              console.log(form.current?.getFieldValue('icon'));
            },
            suffix: <SearchOutlined/>,
            // 用于展示已经选择的图标icon
            prefix: currentIcon != '' ? <Icon name={currentIcon}/> : <></>
          }}
        />
        <ProFormText
          width="md"
          name="menuName"
          label="菜单名称"
          placeholder="请输入菜单名称"
          colProps={{span: 12}}
        />
        <ProFormDigit
          width="md"
          label="显示顺序"
          name="orderNum"
          placeholder="请输入显示顺序"
          colProps={{span: 12}}
          min={0}
        />
        <ProFormRadio.Group
          width="md"
          name="isFrame"
          label="是否外链"
          colProps={{span: 12}}
          initialValue={'1'}
          options={[
            {
              label: '是',
              value: '0',
            },
            {
              label: '否',
              value: '1',
            },
          ]}
        />
        <ProFormText
          width="md"
          name="path"
          label="路由地址"
          placeholder="请输入路由地址"
          colProps={{span: 12}}
        />
        <ProFormRadio.Group
          width="md"
          name="visible"
          label="显示状态"
          colProps={{span: 12}}
          initialValue={'0'}
          options={[
            {
              label: '显示',
              value: '0',
            },
            {
              label: '隐藏',
              value: '1',
            },
          ]}
        />
        <ProFormRadio.Group
          width="md"
          name="status"
          label="菜单状态"
          colProps={{span: 12}}
          initialValue={'0'}
          options={[
            {
              label: '正常',
              value: '0',
            },
            {
              label: '停用',
              value: '1',
            },
          ]}
        />
      </ModalForm>
      <IconSelect visible={iconVisible} parentKey={form.current?.getFieldValue('icon')} cancelView={() => setIconVisible(false)} submitView={setIcon}/>

至此自定义图标选择器功能完成。如果大家有更优的解决方法,可以及时留言更正,互相学习。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 您可以使用 Ant Design 的 `<ColorPicker>` 组件来实现更改背景颜色的功能。以下是一个示例代码: ```jsx import React, { useState } from "react"; import { ColorPicker } from "antd"; function ColorPickerDemo() { const [backgroundColor, setBackgroundColor] = useState("#ffffff"); const handleColorChange = (color) => { setBackgroundColor(color.hex); }; return ( <div style={{ backgroundColor }}> <h1>Background Color</h1> <ColorPicker color={backgroundColor} onChange={handleColorChange} /> </div> ); } export default ColorPickerDemo; ``` 在上面的代码中,我们首先引入了 `<ColorPicker>` 组件,然后使用 `useState` 钩子来定义一个 `backgroundColor` 状态,用于保存背景颜色。接着,我们定义了一个 `handleColorChange` 函数,用于处理颜色改变事件,并将新的背景颜色保存到状态中。最后,在渲染函数中,我们将背景颜色设置为 `<div>` 元素的样式,并将 `<ColorPicker>` 组件放置在页面上,以便用户可以选择新的背景颜色。 请注意,上面的示例代码仅供参考,您可以根据自己的需求进行修改和定制。 ### 回答2: antd是一个基于React的UI组件库,它提供了丰富的界面组件供开发者使用。其中,antd的颜色选择器组件可以用来实现更改背景颜色的功能。 首先,我们需要在项目中引入antd的颜色选择器组件。可以通过npm安装antd,然后在代码中引入ColorPicker组件。 接下来,在需要使用颜色选择器的地方,我们可以使用ColorPicker组件来渲染一个颜色选择器。 例如,在一个React函数组件中,我们可以这样写: ```jsx import React, { useState } from 'react'; import { ColorPicker } from 'antd'; const MyComponent = () => { const [bgColor, setBgColor] = useState('#ffffff'); const handleColorChange = (color) => { setBgColor(color); } return ( <div style={{ backgroundColor: bgColor }}> <h1>背景颜色选择器</h1> <ColorPicker color={bgColor} onChange={handleColorChange} /> </div> ); } export default MyComponent; ``` 在上面的例子中,我们使用useState来管理背景颜色的状态,初始值为白色。然后,我们定义了一个handleColorChange函数来处理颜色选择器的变化事件。当颜色选择器的颜色发生变化时,handleColorChange将被调用,更新背景颜色的状态。 最后,在组件的返回部分,我们将backgroundColor设置为当前背景颜色的值,这样就可以实现根据颜色选择器选择的颜色来动态改变背景颜色了。 以上就是使用antd颜色选择器实现更改背景颜色的简单示例,你可以根据自己的具体需求进行拓展和调整。 ### 回答3: antd是一个基于React的UI组件库,其中包括了丰富的组件和样式,包括颜色选择器。 要实现更改背景颜色,我们可以使用antd中的ColorPicker组件。首先,在React组件中引入ColorPicker组件: ```jsx import { ColorPicker } from 'antd'; class App extends React.Component { constructor(props) { super(props); this.state = { bgColor: '#ffffff' // 初始化背景颜色为白色 }; } handleColorChange = (color) => { this.setState({ bgColor: color.hex }); // 当颜色选择器的颜色改变时,更新背景颜色状态 } render() { return ( <div style={{ backgroundColor: this.state.bgColor }}> <ColorPicker onChange={this.handleColorChange} /> // 将handleColorChange函数作为ColorPicker组件的onChange事件处理函数 </div> ); } } export default App; ``` 在上面的代码中,我们在组件的state中定义了一个`bgColor`状态,用于存储背景颜色。在构造函数中,我们将`bgColor`初始化为白色`#ffffff`。 然后,我们实现了一个`handleColorChange`方法,用于在颜色选择器的颜色改变时更新`bgColor`状态。在render方法中,我们将`bgColor`应用在`div`元素的`backgroundColor`样式中,使其成为背景颜色。 最后,将`handleColorChange`函数作为`ColorPicker`组件的`onChange`事件处理函数传递,可以使得当颜色选择器的颜色改变时,调用`handleColorChange`方法。 通过以上实现,我们可以使用antd的颜色选择器组件来实现更改背景颜色的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值