添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
坏坏的西装  ·  java - ...·  1 年前    · 
痴情的凉面  ·  【PROFILE】使用Oracle ...·  1 年前    · 
成熟的橡皮擦  ·  【SEAndroid】适配 ...·  1 年前    · 

react-resizable GitHub

首先百度寻找解决方案,很容易的,我们就找到了 react-resizable ,这个解决方案在antd 3.x 的文档中, 表格 Table - Ant Design ,但是在更高的版本中没有,如果不是百度,我应该永远找不到.

npm install --save react-resizable

官方提供的代码示例:

import { Table } from 'antd';
import { Resizable } from 'react-resizable';
const ResizeableTitle = props => {
  const { onResize, width, ...restProps } = props;
  if (!width) {
    return <th {...restProps} />;
  return (
    <Resizable
      width={width}
      height={0}
      onResize={onResize}
      draggableOpts={{ enableUserSelectHack: false }}
      <th {...restProps} />
    </Resizable>
class Demo extends React.Component {
  state = {
    columns: [
        title: 'Date',
        dataIndex: 'date',
        width: 200,
        title: 'Amount',
        dataIndex: 'amount',
        width: 100,
        title: 'Type',
        dataIndex: 'type',
        width: 100,
        title: 'Note',
        dataIndex: 'note',
        width: 100,
        title: 'Action',
        key: 'action',
        render: () => <a>Delete</a>,
  components = {
    header: {
      cell: ResizeableTitle,
  data = [
      key: 0,
      date: '2018-02-11',
      amount: 120,
      type: 'income',
      note: 'transfer',
      key: 1,
      date: '2018-03-11',
      amount: 243,
      type: 'income',
      note: 'transfer',
      key: 2,
      date: '2018-04-11',
      amount: 98,
      type: 'income',
      note: 'transfer',
  handleResize = index => (e, { size }) => {
    this.setState(({ columns }) => {
      const nextColumns = [...columns];
      nextColumns[index] = {
        ...nextColumns[index],
        width: size.width,
      return { columns: nextColumns };
    });
  render() {
    const columns = this.state.columns.map((col, index) => ({
      ...col,
      onHeaderCell: column => ({
        width: column.width,
        onResize: this.handleResize(index),
      }),
    }));
    return <Table bordered components={this.components} columns={columns} dataSource={this.data} />;
ReactDOM.render(<Demo />, mountNode);

css样式

#components-table-demo-resizable-column .react-resizable {
  position: relative;
  background-clip: padding-box;
#components-table-demo-resizable-column .react-resizable-handle {
  position: absolute;
  width: 10px;
  height: 100%;
  bottom: 0;
  right: -5px;
  cursor: col-resize;
  z-index: 1;

css样式需要添加到项目的全局配置中

示例是用class的方式写的,首先我要给他改成函数式组件的形式:

import { Table } from "antd";
import { useState } from "react";
import { Resizable } from 'react-resizable';
const ResizeableTitle = (props:any) => {
    const { onResize, width, ...restProps } = props;
    if (!width) {
      return <th {...restProps} />;
    return (
      <Resizable
        width={width}
        height={0}
        onResize={onResize}
        draggableOpts={{ enableUserSelectHack: false }}
        <th {...restProps} />
      </Resizable>
const initCols = [
      title: 'Date',
      dataIndex: 'date',
      width: 200,
      title: 'Amount',
      dataIndex: 'amount',
      width: 100,
      title: 'Type',
      dataIndex: 'type',
      width: 100,
      title: 'Note',
      dataIndex: 'note',
      width: 100,
      title: 'Action',
      key: 'action',
      render: () => <a>Delete</a>,
const TablePage:React.FC = () => {
    const [columns, setColumns] = useState(initCols);
    const data = [
          key: 0,
          date: '2018-02-11',
          amount: 120,
          type: 'income',
          note: 'transfer',
          key: 1,
          date: '2018-03-11',
          amount: 243,
          type: 'income',
          note: 'transfer',
          key: 2,
          date: '2018-04-11',
          amount: 98,
          type: 'income',
          note: 'transfer',
return <>
        <Table bordered dataSource={data}
         components={
                 header: {
                     cell: ResizeableTitle
         columns={
            columns.map((col:any, index:number) => {
                return {
                    ...col,
                    onHeaderCell: (column:any) => ({
                        width: column.width,
                        onResize: (e:any, {size}:{size:any}) => {
                            setColumns((columns) => {
                                const nextColumns = [...columns];
                                nextColumns[index] = {
                                    ...nextColumns[index],
                                    width: size.width
                                return nextColumns;
        </Table>
export default TablePage;

于是我们便得到一个组件,将以上组件稍加修改,把需要的数据变成属性传递进来,我们便得到一个可复用的,可拖拽列宽的表格.

使用时必须要给column设置width

当表格列很多时,会出现卡顿,不跟鼠标

use-antd-resizable-header Github

在搜索列宽拖拽的解决方案时,在ant-design的github 上看到这个

table组件能否支持拖拽调整列宽(伸缩列)? · Issue #32594 · ant-design/ant-design (github.com)
在这里插入图片描述
在下方我又看到这个
在这里插入图片描述

yarn add @minko-fe/use-antd-resizable-header
npm add @minko-fe/use-antd-resizable-header
import useARH from '@minko-fe/use-antd-resizable-header';
import '@minko-fe/use-antd-resizable-header/dist/style.css';
function App() {
  const columns = [];
  const { components, resizableColumns, tableWidth, resetColumns } = useARH({
    columns: useMemo(() => columns, []),
    // 保存拖拽宽度至本地localStorage
    columnsState: {
      persistenceKey: 'localKey',
      persistenceType: 'localStorage',
  });
  return (
      <Table columns={resizableColumns} 
			components={components} dataSource={data} 
			scroll={{ x: tableWidth }}></Table>
        <ProTable
            columns={resizableColumns}
            components={components}
            dataSource={data}
            scroll={{ x: tableWidth }}
            ></ProTable>
        <Button onClick={() => resetColumns()}>重置宽度</Button>

使用比较简单,只需要简单替换数据,即可实现动态拖拽

不能给所有的column设置width,最后一列不能设置,否则将不能拖拽

相比较下, react-resizable在多列时会出现卡顿,use-antd-resizable-header因为没有实时调整,而是松开鼠标后调整,就不会显得非常卡顿,而且写的代码更少,所以我选择use-antd-resizable,但其实都还有比较多的扩展可以实现,不过我是搞后端的,所以就这样吧.

react + antd 实现表格可拖拽列宽前言: 接到一个需求,需要实现表格的表头可以拖拽调节宽度实现方式react-resizable GitHub首先百度寻找解决方案,很容易的,我们就找到了react-resizable,这个解决方案在antd 3.x 的文档中,表格 Table - Ant Design,但是在更高的版本中没有,如果不是百度,我应该永远找不到.安装npm install --save react-resizable使用官方提供的代码示例:import { Ta
react+antdreact-resizable实现Table拖拽调整列宽 npm下载依赖包 npm install --save react-resizable 如果上述报错缺依赖包react-draggable还需要引入react-draggable包,并重启项目 import React, {PureComponent} from 'react'; import { Resizab...
拖拽:DraggableRow/index.jsx import React, { useState,useRef } from 'react'; import { Modal, Form, Select, Input, Button, Row, Col,Tooltip} from 'antd' import { DragDropConte
项目需求中,要求实现表格拖拽排序后,返回排序后数据顺序提交保存,多处使用。 曾尝试通过对Table组件的 columns 属性进行包裹,以期达到封装 DragSource 和 DropTarget 的效果,但后来发现,antd根部不会识别这样的修改。 antd官方文档提供了Table单一表格的行拖拽排序,并没有暴露出更多可详细配置的API。 在拖拽排序的案例中,BodyRow既是DragSource,也是DopTarget。那么既然如此,理应也允许针对BodyRow进行二次封装,达到DragSource与D
记录用户使用的系统配置,缓存浏览器中,记录用户习惯。 1-2.antd换肤(Layout组件未封装) 使用插件实现扩展antd样式文件并绑定cssVariable,通过less.js浏览器在线编译更改更少变量方法实现主题样式更改 @import " _var " ; :root { --primary-color : @primary-color ; --danger-color : red ; window . less . modifyVars ( vars ) . then ( ( ) => { if ( vars [ '@primary-color' ] === getItem ( S
React基于antd Table实现拖拽调整列宽表格        在日常的工作开发中,会经常的用到表格,进行数据展示,但是数据的长度不一,初始设置的表格列宽不一定符合数据的展示要求,故有时需要手动的进行表格列宽的调整。        用过antd的童鞋,都知道antd表格并不支持列拖拽功能;那么在react+antd的项目中如何实现可拖动表格呢? 实现功能 1:表格列宽初始自动分配、列宽总和不能超过容器宽度(无
import { Table } from 'antd'; import React, { useEffect, useRef, useState } from 'react'; import { Resizable } from 'react-resizable'; import './style.css'; const ResizeableTitle = (props: any) => { const { onResize, width, ...restProps } = props; 一个预打包的版本,其中整个React库位于dist/list.js 此示例显示用户如何处理onReorder和onRemove回调。 控制器负责管理传递到列表中的内容,并使用onReorder和onRemove回调处理列表中的相应事件。 import React from 'react' import { List , ListItem } from 'react-mutable-list' class Controller ex
react+antd搭建前端管理框架(***支持响应式***),主要模块分为:菜单、选项卡、面包屑;通过路由监听,实现三个模块之间的联动(同时监听浏览器);状态采用react-redux进行集中管理。目前只包含前端代码,未与后台进行关联实现菜单、用户等权限,若需要,则需进行二次开发。 访问链接:https://blog.csdn.net/weixin_48357332/article/details/124860395
问题描述: 为了向用户展示更丰富的数据,更多的内容,需在展示的列表页中设置列宽可随意拖动。antd官网提供了列宽可拖动的示例,经测试原示例并不好用,且使用有限制,列宽拖拽响应很慢,拖动时会造成其它列宽比较大的变化,针对内容较多的列并不能做到随着列宽的变化,内容也相应增减。 antd现可伸缩列问题展示 1. antd官网示例,当列宽拖动到比内容小时,内容将会出现换行,将行高度撑开 2....
1. 首先,您需要安装Node.js和npm。您可以在 https://nodejs.org/en/ 下载并安装它们。 2. 打开命令行终端并创建一个新的React应用程序。运行以下命令: npx create-react-app my-app cd my-app 3. 安装antd和其它相关依赖项。运行以下命令: npm install antd npm install @ant-design/icons npm install craco-less 4. 在应用程序的根目录下创建一个名为craco.config.js的文件,并添加以下内容: const CracoLessPlugin = require('craco-less'); module.exports = { plugins: [ plugin: CracoLessPlugin, options: { lessLoaderOptions: { lessOptions: { modifyVars: { '@primary-color': '#1DA57A' }, javascriptEnabled: true, 这个文件是用来配置craco-less插件的,它可以让我们在应用程序中使用less文件。 5. 在应用程序的src/index.js文件中添加以下代码: import React from 'react'; import ReactDOM from 'react-dom'; import 'antd/dist/antd.css'; import './index.less'; import App from './App'; ReactDOM.render(<App />, document.getElementById('root')); 这会在应用程序中引入antd的样式表和我们自己的less文件。 6. 重启应用程序并运行它。在命令行终端中运行以下命令: npm start 这将启动应用程序并在浏览器中打开它。 现在,您已经成功地安装了reactantd,并且可以在您的应用程序中使用它们了。