Header.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import * as React from 'react';
  2. import { Layout, MenuProps, Modal, Dropdown, Select } from 'antd';
  3. import { CaretDownOutlined, PoweroffOutlined } from '@ant-design/icons';
  4. import logoSrc from '@/assets/public/logo.png';
  5. import router from '@/router';
  6. import { debounce, set } from 'lodash';
  7. const { Header: AntdHeader } = Layout;
  8. interface Props {
  9. userName: string,
  10. onClickLogout: () => Promise<any>,
  11. onSelectChange: (value: number) => void; // 新增回调函数
  12. currentMenuType: number;
  13. };
  14. const Header: React.FC<Props> = (props: Props) => {
  15. const {
  16. userName,
  17. onClickLogout,
  18. onSelectChange,
  19. currentMenuType
  20. } = props;
  21. const items: MenuProps['items'] = [
  22. {
  23. key: 'logout',
  24. label: (
  25. <a onClick={(e) => {
  26. e.preventDefault(); // 阻止默认行为
  27. Modal.confirm({
  28. title: '提示',
  29. content: '确定退出平台吗?',
  30. async onOk() {
  31. await onClickLogout();
  32. }
  33. });
  34. }}>
  35. <PoweroffOutlined style={{ marginRight: 5 }} />
  36. 退出登录
  37. </a>
  38. ),
  39. }
  40. ];
  41. const fruits = [
  42. { id: 1, name: 'DeepSeek' },
  43. { id: 2, name: '智普' },
  44. ];
  45. const [open, setOpen] = React.useState(false); // 控制下拉框展开状态
  46. const onDropdownVisibleChange = (visible: boolean) => {
  47. setOpen(visible);
  48. };
  49. const onChange = (value: number) => {
  50. // 只调用父组件传递的处理函数
  51. onSelectChange(value);
  52. if (!open) return; // 确保只在真正选择时触发
  53. props.onSelectChange(value);
  54. setOpen(false);
  55. };
  56. return (
  57. <AntdHeader className='header'>
  58. <div className='header-logo' onClick={() => {
  59. router.navigate({ pathname: '/deepseek/questionAnswer' });
  60. }}>
  61. <img className='header-logo-picture' src={logoSrc} />
  62. <div className='header-logo-text'>
  63. 建科•小智后台管理系统
  64. </div>
  65. <Select style={{ width: 200, marginLeft: 20 }}
  66. open={open}
  67. value={currentMenuType}
  68. onChange={onSelectChange}
  69. placeholder="请选择"
  70. onDropdownVisibleChange={onDropdownVisibleChange}
  71. onClick={(e) => e.stopPropagation()} // 阻止事件冒泡
  72. >
  73. {fruits.map(fruit => (
  74. <Select.Option key={fruit.id} value={fruit.id}>
  75. {fruit.name}
  76. </Select.Option>
  77. ))}
  78. </Select>
  79. </div>
  80. <Dropdown menu={{ items }}>
  81. <div className='header-operation'>
  82. <div className='header-operation-picture'>
  83. {userName.slice(0, 1)}
  84. </div>
  85. <div className='header-operation-name'>
  86. {userName}
  87. </div>
  88. <CaretDownOutlined className='header-operation-down' />
  89. </div>
  90. </Dropdown>
  91. </AntdHeader>
  92. );
  93. };
  94. export default Header;