【问题标题】:Antd Resizable table columns in TypeScriptTypeScript 中的 Antd 可调整大小的表列
【发布时间】:2020-07-03 04:33:56
【问题描述】:

我正在实现antd<Table> 组件,需要使用react-resizable 调整列的大小。 我按照documentation 中的示例进行操作,但是由于我的项目使用 TypeScript 并使用功能组件,因此我不得不对其进行重构,并且遇到了打字问题。 当我尝试从示例中实现 onHeaderCell 时:

const initialColumns: ColumnProps<Row>[] = myData.columns.map((column, index) => {
  return {
    ...
    onHeaderCell: (c: ColumnType<Row>) => ({
          width: c.width,
          onResize: handleResize(index),
        }),
    ...
  })

我收到此错误:

... 'onHeaderCell(...)' 返回的类型在这些类型之间不兼容。 输入'{宽度:字符串|号码 |不明确的; onResize: (e: SyntheticEvent, resizeData: ResizeCallbackData) => void; }' 与类型 'HTMLAttributes' 没有共同的属性。

我的handleResize 看起来像这样:

const handleResize = (index: number) => (e: React.SyntheticEvent<Element, Event>, resizeData: ResizeCallbackData) => {
    const { size } = resizeData
    updateColumns((cols) => {
      const nextColumns = [...cols]
      nextColumns[index] = {
        ...nextColumns[index],
        width: size.width,
      }
      return nextColumns
    })
  }

我已将ResizableTitle 移动到单独的组件中,&lt;Table /&gt; 以这种方式实现

const components = {
    header: {
      cell: ResizableTitle,
    },
  }

  return (
    <Table
      bordered
      components={components}
      columns={columns} // columns come from the useState<ColumnProps<Row>[]>()
      ...
    />
  )

如何更改此设置以获得所需的结果?

【问题讨论】:

  • 您找到解决方案了吗?我也遇到了同样的问题...
  • @clint_milner 是的,我找到了解决方案。我摆脱了react-resizable(它开始工作但只调整了1px的大小)并转移到自定义事件侦听器,它的行为与Resizable非常相似,但工作正常。
  • @clint_milner 如果您需要,我可以发布我的部分代码(不带react-resizable)作为该问题的答案
  • 那太好了——谢谢
  • @clint_milner 没问题,检查一下

标签: reactjs typescript antd


【解决方案1】:

所以我找到了一个不使用react-resizable的解决方案

const [resizingColumnIndex, _setResizingColumnIndex] = useState<number>();
const resizingColumnIndexRef = useRef(resizingColumnIndex);
  
const setResizingColumnIndex = (index: number | undefined) => {
    resizingColumnIndexRef.current = index;
    _setResizingColumnIndex(index);
};

const resizeListener = (e: MouseEvent) => {
  if (resizingColumnIndexRef.current) {
    handleResize(resizingColumnIndexRef.current, e.movementX);
  }
  window.onmouseup = (e: MouseEvent) => {
    window.removeEventListener("mousemove", resizeListener);
    setResizingColumnIndex(undefined);
  };
};

在我要添加的每一列标题中

<div
  className="resizeHandle"
  onMouseDown={() => {
    setResizingColumnIndex(index);
    window.addEventListener("mousemove", resizeListener, { passive: true });
  }}
/>

风格

  .resizeHandle {
    position: absolute;
    width: 10px;
    height: 100%;
    bottom: 0;
    right: -5px;
    cursor: col-resize;
    z-index: 5;
  }

最后是 handleResize 函数,用于更新保持在组件状态中的列

  const handleResize = (index: number, delta: number) => {
    updateColumns(prevColumns => {
      const indexNewWidth = Number(prevColumns[index].width) + delta;
      const nextWidth = indexNewWidth >= MIN_COLUMN_WIDTH ? indexNewWidth : MIN_COLUMN_WIDTH;
      return prevColumns.map((col, i) => (i === index ? { ...col, width: nextWidth } : col));
    });
    setTableWidth(prevWidth => prevWidth + delta);
  };

【讨论】:

  • 您好!你有一个完整的例子吗?非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2021-12-22
  • 2016-06-18
  • 2020-08-04
  • 1970-01-01
  • 2017-12-28
  • 2017-01-13
相关资源
最近更新 更多