From 0e363da97ef866abceeba45a949bdf33933be1eb Mon Sep 17 00:00:00 2001
From: hemengke1997 <49073282+hemengke1997@users.noreply.github.com>
Date: Thu, 15 Sep 2022 23:01:02 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E2=9C=A8=20support=20`onResizeStart`?=
=?UTF-8?q?=20&=20`onResizeEnd`=20callback?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
#21
---
.eslintrc.json | 5 ++++-
README.md | 8 +++++---
example/src/App.tsx | 8 +++++++-
src/ResizableHeader.tsx | 11 ++++++++---
src/index.ts | 3 ++-
src/useAntdResizableHeader.tsx | 34 ++++++++++++++++++++++++++++++----
src/utils/useLatest.ts | 10 ++++++++++
tsconfig.json | 2 +-
8 files changed, 67 insertions(+), 14 deletions(-)
create mode 100644 src/utils/useLatest.ts
diff --git a/.eslintrc.json b/.eslintrc.json
index 39f6a98..66f3044 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,3 +1,6 @@
{
- "extends": "@minko-fe"
+ "extends": "@minko-fe",
+ "rules": {
+ "no-empty-pattern": "off"
+ }
}
diff --git a/README.md b/README.md
index d6d871a..94d21c2 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,8 @@ pnpm add @minko-fe/use-antd-resizable-header
| maxConstraints | number | Infinity | 拖动最大宽度 默认无穷 |
| cache | boolean | true | 是否缓存宽度,避免渲染重置拖拽宽度 |
| columnsState | ColumnsStateType | undefined | 列状态的配置,可以用来操作列拖拽宽度 |
+| onResizeStart | Function | undefined | 开始拖拽时触发
+| onResizeEnd | Function | undefined | 结束拖拽时触发
### Return
@@ -51,7 +53,7 @@ pnpm add @minko-fe/use-antd-resizable-header
```tsx
import { Button, Table } from 'antd'
import ProTable from '@ant-design/pro-table'
-import useARH from '@minko-fe/use-antd-resizable-header'
+import { useAntdResizableHeader } from '@minko-fe/use-antd-resizable-header'
import '@minko-fe/use-antd-resizable-header/dist/style.css'
function App() {
@@ -91,7 +93,7 @@ function App() {
```tsx
import React, { useReducer } from 'react'
import { Space, Table, Tag } from 'antd'
-import useARH from '@minko-fe/use-antd-resizable-header'
+import { useAntdResizableHeader } from '@minko-fe/use-antd-resizable-header'
import 'antd/dist/antd.css'
import '@minko-fe/use-antd-resizable-header/dist/style.css'
@@ -245,7 +247,7 @@ export const genEllipsis = (text: string, copyable?: boolean, stopPropagation?:
```tsx
// index.tsx
import ProTable from '@ant-design/pro-table' // or import { Table } from 'antd'
-import useARH from '@minko-fe/use-antd-resizable-header'
+import { useAntdResizableHeader } from '@minko-fe/use-antd-resizable-header'
import { genEllipsis } from './utils.tsx'
import '@minko-fe/use-antd-resizable-header/dist/style.css'
diff --git a/example/src/App.tsx b/example/src/App.tsx
index 386e20a..8908996 100644
--- a/example/src/App.tsx
+++ b/example/src/App.tsx
@@ -64,7 +64,7 @@ function App() {
title: 'Action',
key: 'operation',
fixed: 'right',
- render: (text, record) => {
+ render: (_, record) => {
return {record?.age}
},
},
@@ -74,6 +74,12 @@ function App() {
const { components, resizableColumns, tableWidth } = useARH({
columns,
+ onResizeStart: (x) => {
+ console.log(x, 'start')
+ },
+ onResizeEnd: (y) => {
+ console.log(y, 'end')
+ },
})
// const {
diff --git a/src/ResizableHeader.tsx b/src/ResizableHeader.tsx
index a8d4a0e..c795b85 100644
--- a/src/ResizableHeader.tsx
+++ b/src/ResizableHeader.tsx
@@ -10,6 +10,8 @@ import './index.css'
type ComponentProp = {
onResize: (width: number) => void
onMount: (width: number) => void
+ onResizeStart?: (width: number) => void
+ onResizeEnd?: (width: number) => void
triggerRender: number
width: number
minWidth: number
@@ -22,6 +24,8 @@ const ResizableHeader: React.FC = (props) => {
minWidth,
maxWidth,
onResize,
+ onResizeStart,
+ onResizeEnd,
onMount,
triggerRender,
className,
@@ -65,20 +69,21 @@ const ResizableHeader: React.FC = (props) => {
document.documentElement.style.cursor = active ? 'col-resize' : ''
}
- const onStart = (_: any, data: ResizeCallbackData) => {
+ const onStart = ({}, data: ResizeCallbackData) => {
setResizeWidth(data.size.width)
setBodyStyle(true)
+ onResizeStart?.(data.size.width)
}
- const onSelfResize = (_: any, data: ResizeCallbackData) => {
+ const onSelfResize = ({}, data: ResizeCallbackData) => {
setResizeWidth(data.size.width)
}
const onStop = () => {
if (resizeWidth <= 0) return
-
onResize(resizeWidth)
setBodyStyle(false)
+ onResizeEnd?.(resizeWidth)
}
return (
diff --git a/src/index.ts b/src/index.ts
index 7be2c38..2e33bbe 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,4 +1,5 @@
-import useAntdResizableHeader from './useAntdResizableHeader'
+import { useAntdResizableHeader } from './useAntdResizableHeader'
export { ResizableUniqIdPrefix, useGetDataIndexColumns } from './utils/useGetDataIndexColumns'
export default useAntdResizableHeader
+export { useAntdResizableHeader }
diff --git a/src/useAntdResizableHeader.tsx b/src/useAntdResizableHeader.tsx
index 06bf5b4..1acb4cb 100644
--- a/src/useAntdResizableHeader.tsx
+++ b/src/useAntdResizableHeader.tsx
@@ -9,6 +9,7 @@ import { useSafeState } from './utils/useSafeState'
import { useLocalColumns } from './utils/useLocalColumns'
import { GETKEY } from './utils/useGetDataIndexColumns'
import { useMemoizedFn } from './utils/useMemoizedFn'
+import { useLatest } from './utils/useLatest'
export interface ColumnsState {
width: number
@@ -26,7 +27,7 @@ export interface ColumnsStateType {
persistenceKey?: string
}
-export interface useTableResizableHeaderProps {
+export interface useTableResizableHeaderProps = Record> {
columns: ColumnType[] | undefined
/** @description 最后一列不能拖动,设置最后一列的最小展示宽度,默认120 */
defaultWidth?: number
@@ -38,6 +39,10 @@ export interface useTableResizableHeaderProps {
cache?: boolean
/** @description 列状态的配置,可以用来操作列拖拽宽度 */
columnsState?: ColumnsStateType
+ /** @description 开始拖拽时触发 */
+ onResizeStart?: (col: ColumnType & { resizableColumns: ColumnType[] }) => void
+ /** @description 结束拖拽时触发 */
+ onResizeEnd?: (col: ColumnType & { resizableColumns: ColumnType[] }) => void
}
type Width = number | string
@@ -60,7 +65,7 @@ interface CacheType {
const WIDTH = 120
-function useAntdResizableHeader = Record>(
+function useAntdResizableHeader>(
props: useTableResizableHeaderProps,
) {
const {
@@ -70,6 +75,8 @@ function useAntdResizableHeader
maxConstraints = Infinity,
cache = true,
columnsState,
+ onResizeStart: onResizeStartProp,
+ onResizeEnd: onResizeEndProp,
} = props
// column的宽度缓存,避免render导致columns宽度重置
@@ -78,6 +85,8 @@ function useAntdResizableHeader
const [resizableColumns, setResizableColumns] = useSafeState([])
+ const lastestColumns = useLatest(resizableColumns)
+
const { localColumns: columns, resetLocalColumns } = useLocalColumns({
columnsState,
columns: columnsProp,
@@ -124,6 +133,22 @@ function useAntdResizableHeader
const onResize = React.useMemo(() => onMount, [onMount])
+ const onResizeStart = (col: ColumnType) => (width: number) => {
+ onResizeStartProp?.({
+ ...col,
+ width,
+ resizableColumns: lastestColumns.current,
+ })
+ }
+
+ const onResizeEnd = (col: ColumnType) => (width: number) => {
+ onResizeEndProp?.({
+ ...col,
+ width,
+ resizableColumns: lastestColumns.current,
+ })
+ }
+
const getColumns = useMemoizedFn((list: ColumnType[]) => {
const trulyColumns = list?.filter((item) => !isEmpty(item))
const c = trulyColumns.map((col) => {
@@ -137,6 +162,8 @@ function useAntdResizableHeader
resizable: column.resizable,
onMount: onMount(column?.[GETKEY]),
onResize: onResize(column?.[GETKEY]),
+ onResizeStart: onResizeStart(column),
+ onResizeEnd: onResizeEnd(column),
minWidth: minConstraints,
maxWidth: maxConstraints,
triggerRender,
@@ -210,5 +237,4 @@ function useAntdResizableHeader
}
}
-// eslint-disable-next-line no-restricted-syntax
-export default useAntdResizableHeader
+export { useAntdResizableHeader }
diff --git a/src/utils/useLatest.ts b/src/utils/useLatest.ts
new file mode 100644
index 0000000..3662539
--- /dev/null
+++ b/src/utils/useLatest.ts
@@ -0,0 +1,10 @@
+import { useRef } from 'react'
+
+function useLatest(value: T) {
+ const ref = useRef(value)
+ ref.current = value
+
+ return ref
+}
+
+export { useLatest }
diff --git a/tsconfig.json b/tsconfig.json
index 8fa8b66..98d7ce8 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,6 +2,6 @@
"extends": "@minko-fe/tsconfig/tsconfig.base",
"compilerOptions": {
"outDir": "dist",
- "sourceMap": false
+ "sourceMap": false,
}
}