react+antd Table實現列拖拽,列拉寬,自定義拉寬列

主要插件Resizable,dnd-kit/core,dnd-kit/sortable,dnd-kit/modifiers

其中官網有列拖拽,主要結合Resizable 實現列拉寬,isResizingRef 很重要防止拖拽相互影響

1.修改TableHeaderCell

   const isResizingRef = useRef(false);const TableHeaderCell = props => {const { onResize, width, datagridRef, stretchRef, ...restProps } = props;// 拖拽const dragState = useContext(DragIndexContext);const { attributes, listeners, setNodeRef, isDragging } = useSortable({ id: props.id });const isFixed = props['data-fixed'] && !isResizingRef.current;const style = {...props.style,...(isFixed ? {} : { cursor: 'move' }),...(isDragging ? { position: 'relative', userSelect: 'none' } : {}),...dragActiveStyle(dragState, props.id),};const [offset, setOffset] = useState(0);if (!width) {return <th {...restProps} />;}// 獲取要減去的父元素距離左側的寬度const getPosition = (element) => {let actualLeft = element.offsetLeft;let current = element.offsetParent;while (current !== null) {//當它上面有元素時就繼續執行actualLeft += current.offsetLeft;current = current.offsetParent; //繼續找父元素}return { x: actualLeft };};// 開始拖拽組織冒泡const handleResizeStart = (e, { size }) => {// console.log(233,e);e.stopPropagation()e.preventDefault()isResizingRef.current = true; // ? 開始 resize}const handleResize = (e, { size }) => {// 這里只更新偏移量,數據列表其實并沒有伸縮isResizingRef.current = true; // ? 開始 resizesetOffset(size.width - width);let parentNodeX = getPosition(datagridRef.current).x;let stretchDom = stretchRef.current;stretchDom.style.display = 'block';stretchDom.style.left = `${e.clientX - parentNodeX + 2}px`;};const handleResizeStop = (...arg) => {// 拖拽結束以后偏移量歸零isResizingRef.current = false; // ? 結束 resizesetOffset(0);let stretchDom = stretchRef.current;stretchDom.style.display = 'none';stretchDom.style.left = `0px`;// props傳進來的事件,在外部是列數據中的onHeaderCell方法提供的事件// console.log(...arg, "arg9");onResize(...arg);};const _ResizableSpan = (<divclassName="react-resizable-handle"// 拖拽層偏移style={{ transform: `translateX(${offset}px)` }}onClick={(e) => {// 取消冒泡,不取消貌似容易觸發排序事件e.stopPropagation();e.preventDefault();}}/>);// console.log(isResizingRef.current, "isResizingRef.current");return (<Resizablewidth={width + offset}handle={_ResizableSpan}height={0}// 拖拽事件實時更新onResize={handleResize}// 拖拽結束更新onResizeStop={handleResizeStop}draggableOpts={{ enableUserSelectHack: false }}onResizeStart={handleResizeStart}><th {...restProps}ref={isFixed && !isResizingRef.current ? undefined : setNodeRef}style={style}{...(isFixed && !isResizingRef.current ? {} : attributes)}{...(isFixed && !isResizingRef.current ? {} : listeners)} /></Resizable>);};

2.handleResize 拉寬后處理

    // 處理拖拽const handleResize =(key) =>(e, { size }) => {if (size.width < 140) {size.width = 140;}console.log(key, size.width, 9000);setColumns(prev => {const next = prev.map(col => {if (col.dataIndex === key) {return { ...col, width: size.width };}return col;});columRef.current = next;return next;});};

總結來說,樣式丑點,目前預測還會碰到未知bug,拉寬的同時會出現回彈之類的bug,慢慢改吧

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912794.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

光照解耦和重照明

項目地址&#xff1a; GitHub - NJU-3DV/Relightable3DGaussian&#xff1a; [ECCV2024] 可重新照明的 3D 高斯&#xff1a;使用 BRDF 分解和光線追蹤的實時點云重新照明 可優化參數 gaussians.training_setup(opt) if is_pbr:&#xff1a; direct_env_light.training_setup…

Kafka 運維與調優篇:構建高可用生產環境的實戰指南

&#x1f6e0;? Kafka 運維與調優篇&#xff1a;構建高可用生產環境的實戰指南 導語&#xff1a;在生產環境中&#xff0c;Kafka集群的穩定運行和高性能表現是業務成功的關鍵。本篇將深入探討Kafka運維與調優的核心技術&#xff0c;從監控管理到性能優化&#xff0c;再到故障排…

AR 地產互動沙盤:為地產沙盤帶來變革?

在科技飛速發展的今天&#xff0c;AR&#xff08;增強現實&#xff09;技術應運而生&#xff0c;為解決傳統地產沙盤的困境提供了全新的思路和方法。AR 技術&#xff0c;簡單來說&#xff0c;是一種將計算機生成的虛擬信息與真實環境相融合的技術。它通過攝像頭、傳感器等設備獲…

端到端自動駕駛系統關鍵技術

一、感知決策一體化模型架構 單一神經網絡整合全流程 端到端神經網絡能夠直接將傳感器輸入映射為控制輸出&#xff0c;消除了傳統模塊化架構中感知、規劃、控制等獨立模塊之間的割裂。傳統架構中&#xff0c;感知模塊負責識別環境信息&#xff0c;決策模塊根據感知結果進行路…

Vue Vue-route (2)

Vue 漸進式JavaScript 框架 基于Vue2的學習筆記 - Vue-route重定向和聲明式導航 目錄 Vue-route路由 重定向 首頁默認訪問 不存在匹配 聲明式導航 路由原理 使用示例 自定義class類 Tag設置 版本4路由 改變 示例 總結 Vue-route路由 重定向 首頁默認訪問 希望訪…

Mabl 基于云端的智能化自動化測試平臺

??親愛的技術愛好者們,熱烈歡迎來到 Kant2048 的博客!我是 Thomas Kant,很開心能在CSDN上與你們相遇~?? 本博客的精華專欄: 【自動化測試】 【測試經驗】 【人工智能】 【Python】 </

Linux/Dog

Dog Enumeration nmap 第一次掃描發現系統對外開放了22、80端口&#xff0c;端口詳細信息如下 ┌──(kali?kali)-[~/Desktop/vegetable/HTB] └─$ nmap -sC -sV -p 22,80 -oA nmap 10.10.11.58 Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-26 03:36 EDT Nmap s…

青少年編程與數學 02-022 專業應用軟件簡介 01 設計與創意類軟件:Adobe Creative Cloud

青少年編程與數學 02-022 專業應用軟件簡介 01 設計與創意類軟件&#xff1a;Adobe Creative Cloud **一、Adobe公司介紹**&#xff08;一&#xff09;Adobe的創立與早期發展&#xff08;二&#xff09;Adobe的市場地位與影響力&#xff08;三&#xff09;Adobe的創新文化 **二…

【亞馬遜防關聯攻略】多店鋪運營如何做好環境隔離?

在亞馬遜跨境電商中&#xff0c;多店運營的最大風險是賬號關聯。亞馬遜規定&#xff0c;同一賣家在同一站點只能擁有一個店鋪。平臺會通過多種方式追蹤注冊信息、設備和網絡環境等&#xff0c;如果發現關聯因素&#xff0c;所有關聯賬號可能被批量封禁&#xff0c;這會導致資金…

She‘s Coming !

#好書推薦《一本書講透汽車功能安全&#xff1a;標準詳解與應用實踐》 #功能安全應用指南 #功能安全實踐參考寶典 Finally, shes coming ! 她來得有點晚&#xff0c;但 “好飯不怕晚”。 她就是剛出爐的新書《一本書講透汽車功能安全&#xff1a;標準詳解與應用實踐》 京東…

如何用廢棄電腦變成服務器搭建web網站(公網訪問零成本)

文章目錄 &#x1f4bb; 如何用廢棄電腦變成服務器搭建 Web 網站&#xff08;公網訪問零成本&#xff09;一、背景與目標? 本文目標&#xff1a; 二、準備工作&#xff08;軟硬件需求&#xff09;&#x1f9f1; 1. 硬件需求&#x1f9f0; 2. 軟件環境準備 三、快速搭建一個 Fl…

〔從零搭建〕指標體系平臺部署指南

&#x1f525;&#x1f525; AllData大數據產品是可定義數據中臺&#xff0c;以數據平臺為底座&#xff0c;以數據中臺為橋梁&#xff0c;以機器學習平臺為中層框架&#xff0c;以大模型應用為上游產品&#xff0c;提供全鏈路數字化解決方案。 ?杭州奧零數據科技官網&#xf…

Vue3 中watch和computed

Vue 3 中 computed 與 watch 深度解析 在 Vue 3 組合中&#xff0c;響應式工具的類型安全使用至關重要。以下是詳細說明 一、watch 偵聽器 1. 基礎類型監聽 <template><div>實際參數1{{count}}</div><div><button click"count">點…

.NET測試工具Parasoft dotTEST:全兼容RMS的測試解決方案

隨著項目規模擴大&#xff0c;需求管理變得復雜&#xff0c;如何高效追溯需求與測試的關聯性成為一大挑戰。Parasoft dotTEST 提供了一套強大的需求追溯解決方案&#xff0c;不僅能自動關聯單元測試結果與需求&#xff0c;還能兼容幾乎所有需求管理系統&#xff08;RMS&#xf…

基于Jeecgboot3.8.1的vue3版本前后端分離的flowable流程管理平臺

初步遷移完成了基于jeecgboot3.8.1的vue3版本的前后端流程管理平臺,基于flowable6.8.0,同時支持bpmn流程設計器與仿釘釘流程設計器。 功能類似于3.6.3,但增加了一些以下功能: 1、支持多租戶 2、支持并行網關的任意跳轉、退回與駁回 3、流程表達式 這里流程表達式定義四…

IP 限流 vs. URI 限流

背景&#xff1a; 昨天調程序的時候遇到了一個 BUG&#xff0c;前端無法將文件正確傳給后端&#xff0c;后端報錯 EOFException&#xff08;EOF 代表 End Of File&#xff09;就是在程序嘗試從一個數據流中讀取數據時&#xff0c;發現已經到達了數據流的末尾&#xff0c;但它卻…

2025年Java常見面試題(持續更新)

數據庫事務特性。原子性、一致性、隔離性、持久性如何防止SQL注入&#xff1a;使用#不要使用$符號&#xff1b;對所有的入參做校驗&#xff1b;使用存儲過程&#xff1b;執行預處理語句和參數化查詢&#xff1b;最低權限原則&#xff1b;微服務拆分的原則&#xff1a;微服務的拆…

Spring AI ——在springboot應用中實現基本聊天功能(ChatModel)

文章目錄 前言項目版本依賴引入配置key信息編寫測試接口注入ChatModel并普通返回注入ChatModel并流式返回自定義模型對象并直接返回總結前言 在Spring AI 中,CchatClient 是一個所有大模型通用性的調用方式,對絕大多數大模型的功能點都具備封裝和見解調用性。 但這一點在部…

78、系統工程生命周期階段及方法

一、系統工程生命周期的七大階段 系統工程生命周期涵蓋從概念萌芽到系統退役的全過程&#xff0c;通常分為以下七個階段&#xff0c;每個階段具有明確目標與核心任務&#xff1a; 1.探索性研究階段 目標&#xff1a;識別利益相關者需求&#xff0c;探索技術可行性。任務&…

二十九、【用戶體驗篇】個人中心:用戶資料展示與密碼修改

二十九、【用戶體驗篇】個人中心:用戶資料展示與密碼修改 前言準備工作第一部分:后端實現 - 個人中心 API1. 修改 `UserDetailSerializer` 以支持密碼修改2. 在 `api/views.py` 中添加 `UserMeView` 和 `PasswordChangeView`3. 注冊個人中心相關 API 路由4. 后端初步測試第二…