User.jsx 2.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import React, { useState, forwardRef, useRef, useImperativeHandle } from 'react';
  2. import { Avatar, Button, Dropdown, Menu, Form, Input, Modal } from 'antd';
  3. import { useModel } from '@/store'
  4. const ChangePassword = forwardRef((props, ref) => {
  5. const [visible, setVisible] = useState(false);
  6. const onFinish = (values) => {
  7. console.log('Success:', values);
  8. };
  9. useImperativeHandle(ref, () => {
  10. return {
  11. show: () => setVisible(true),
  12. }
  13. });
  14. return (
  15. <Modal title="修改密码" visible={visible} onCancel={() => setVisible(false)}>
  16. <Form
  17. labelCol={{ span: 8 }}
  18. wrapperCol={{ span: 16 }}
  19. onFinish={onFinish}
  20. autoComplete="off"
  21. >
  22. <Form.Item
  23. label="原始密码"
  24. name="password"
  25. rules={[{ required: true, message: '请输入原始密码!' }]}
  26. >
  27. <Input.Password />
  28. </Form.Item>
  29. <Form.Item
  30. label="新密码"
  31. name="newPassword"
  32. rules={[{ required: true, message: '请输入新密码!' }]}
  33. >
  34. <Input.Password />
  35. </Form.Item>
  36. <Form.Item
  37. label="确认新密码"
  38. name="newPassword2"
  39. rules={[{ required: true, message: '请输入新密码!' }]}
  40. >
  41. <Input.Password />
  42. </Form.Item>
  43. <Form.Item wrapperCol={{ offset: 8, span: 16 }}>
  44. <Button type="primary" htmlType="submit">
  45. 提交
  46. </Button>
  47. </Form.Item>
  48. </Form>
  49. </Modal>
  50. )
  51. });
  52. export default (props) => {
  53. const menuItems = [
  54. {
  55. key: 'changePassword',
  56. label: '修改密码',
  57. }
  58. ];
  59. const passRef = useRef();
  60. const { user = {} } = useModel('user');
  61. const onClick = ({ key }) => {
  62. if (key === 'changePassword') {
  63. passRef.current.show();
  64. }
  65. };
  66. const menu = <Menu items={menuItems} onClick={onClick} />;
  67. return (
  68. <Dropdown overlay={menu}>
  69. <div className="user-info">
  70. <Avatar size={24} src="https://joeschmoe.io/api/v1/random" />
  71. <span className='font'>{user.name}</span>
  72. <ChangePassword ref={passRef} />
  73. </div>
  74. </Dropdown>
  75. )
  76. }