index.tsx 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * @Author: code4eat awesomedema@gmail.com
  3. * @Date: 2024-05-16 10:57:51
  4. * @LastEditors: code4eat awesomedema@gmail.com
  5. * @LastEditTime: 2024-06-07 17:17:38
  6. * @FilePath: /BudgetManaSystem/src/components/ResizableContainer/index.tsx
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. */
  9. import React, { useState, useCallback, useEffect, useRef } from 'react';
  10. import './style.less';
  11. interface ResizableContainerProps {
  12. width?: number;
  13. minWidth?: number;
  14. maxWidth?: number;
  15. height?:string;
  16. }
  17. const ResizableContainer: React.FC<React.PropsWithChildren<ResizableContainerProps>> = ({
  18. width = 250,
  19. minWidth = 100,
  20. maxWidth = 800,
  21. height = '800px',
  22. children,
  23. }) => {
  24. const [containerWidth, setContainerWidth] = useState(width);
  25. const isResizing = useRef(false);
  26. const handleMouseMove = useCallback((e: MouseEvent) => {
  27. if (isResizing.current) {
  28. const newWidth = Math.min(Math.max(e.clientX, minWidth), maxWidth);
  29. setContainerWidth(newWidth);
  30. }
  31. }, [minWidth, maxWidth]);
  32. const handleMouseUp = useCallback(() => {
  33. isResizing.current = false;
  34. document.removeEventListener('mousemove', handleMouseMove);
  35. document.removeEventListener('mouseup', handleMouseUp);
  36. document.body.style.userSelect = 'auto'; // 恢复文本选择
  37. }, [handleMouseMove]);
  38. const handleMouseDown = useCallback(() => {
  39. isResizing.current = true;
  40. document.addEventListener('mousemove', handleMouseMove);
  41. document.addEventListener('mouseup', handleMouseUp);
  42. document.body.style.userSelect = 'none'; // 禁用文本选择
  43. }, [handleMouseMove, handleMouseUp]);
  44. useEffect(() => {
  45. return () => {
  46. document.removeEventListener('mousemove', handleMouseMove);
  47. document.removeEventListener('mouseup', handleMouseUp);
  48. };
  49. }, [handleMouseMove, handleMouseUp]);
  50. useEffect(() => {
  51. setContainerWidth(width);
  52. }, [width]);
  53. return (
  54. <div className="ResizableContainer">
  55. <div className="resizable" style={{ width: `${containerWidth}px`, height: `${height}` }}>
  56. {children}
  57. </div>
  58. <div className="resizer" onMouseDown={handleMouseDown} />
  59. </div>
  60. );
  61. };
  62. export default ResizableContainer;