React學習時,自己擬定的一則小案例(table表格組件,含編輯)

来源:https://www.cnblogs.com/JoJo-home/archive/2023/06/05/17458441.html
-Advertisement-
Play Games

某次在Uniapp群看到有人問uniapp如何操作dom元素。 ![](https://img2023.cnblogs.com/blog/3112483/202306/3112483-20230605170528006-986335874.png) 他想對這張表標紅的區域,做dom元素獲取,因為產品 ...


某次在Uniapp群看到有人問uniapp如何操作dom元素。


他想對這張表標紅的區域,做dom元素獲取,因為產品想讓紅色色塊點擊時,成為可編輯,渲染1~4月份之間的行程安排。
於是,有小伙伴說讓他用position定位這裡,點擊時使紅色色塊層級抬高,弄個input上去。
但提問的小伙伴並沒有決定這麼做,隨後不了了之。

在初步自學了一段時間React後,我覺得可以試一下用React實現這種效果。
以下圖二為練習之作,實際上對應的月份編輯已經實現

如果要寫成如圖1那種展示和編輯,就需要td裡加入div容器並對其絕對定位
而相應公式了我粗略的整理了一下,並附上

         <td className='sTh'>
          {/* 做判斷,迴圈時得到的月和次月的做比較,如果次月依舊屬於其中,則繼續,直到次月不在算入規劃中 */}
          {/* 預設 1個月為 width 90 * 1 + '%' right:'-5%'   */}
          {/* 那麼 如果2月份也是 width 90 * 2 + '%' right:'-90%'  */}
          {/* 那麼 如果3月份也是 width 90 * 3 + '%' right:'-185%'   -85為一刻度,初始-5% */}

          {/* 預設右側偏移量是  100*1 -  5% *1 */}
          {/* 新增1個單位 等於  100*2 -  5% *2 */}
          {/* 新增2個單位 等於  100*3 -  5% *3 */}
          {/* (item.name, index + 1) */}
          <div className='sPo' style={{ width: 90 * 4 + '%', right: '-280%' }}
            contentEditable={true}
            suppressContentEditableWarning={true}
            onBlur={() => handleEdit}
            ref={editRef}>
            {/* <INput /> */}
          </div>
        </td>

具體做法,其實已經不遠。
感興趣的小伙伴可以體驗一下,當然,如果發現有什麼地方存在問題或缺陷bug,歡迎指正。

table 無狀態組件
import React, { useState, useRef } from 'react';


const Table = () => {
  const [data, setData] = useState([{ name: '張三', li: [4, 9, 5, 6] }, { name: '李四', li: [11] }]);
  const editRef = useRef('null');

  // 被操作的名字
  // 被操作的月份
  // 被操作的值
  const handleEdit = (name, month, e) => {
    const newData = [...data];
    const item = newData.find((item) => item.name === name);
    item.li[month] = parseInt(e.target.innerText);
    setData(newData);
  };

  const renderTable = () => {
    const months = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'];
    const tableData = [];

    // 添加表頭
    const headerRow = [<th key="name" className='sTh'>姓名</th>];
    months.forEach((month) => {
      headerRow.push(<th key={month} className='sTh'>{month}</th>);
    });
    tableData.push(<tr key="header" className='sTh'>{headerRow}</tr>);

    // 添加數據行
    data.forEach((item) => {
      const dataRow = [<td key="name" className='sTh'>{item.name}</td>];
      months.forEach((month, index) => {
        if (item.li.includes(index + 1)) {
          const value = item.li[index + 1] || '';
          dataRow.push(
            <td
              key={month}
              style={{ backgroundColor: 'red' }}
              contentEditable={true}
              suppressContentEditableWarning={true}
              onBlur={(e) => handleEdit(item.name, month, e)}
              ref={editRef}
              className='sTh'
            >
              {value}
            </td>
          );
        } else {
          dataRow.push(<td key={month} className='sTh'></td>);
        }
      });
      tableData.push(<tr key={item.name} className='sTh'>{dataRow}</tr>);
    });

    return tableData;
  };

  return (
    <table className='sTab'>
      <tbody>{renderTable()}</tbody>
    </table>
  );
};
</details>



.sTab {
    border-collapse: collapse;
    border: 1px solid gray;
    width: 100%;
    text-align: center;
    font-size: 0.28rem;
}

/*
1. separate:預設值,邊框會被分開,不會忽略border-spacing 和 empty-cells 屬性。
2. collapse:如果可能,邊框會合併為一個單一的邊框。會忽略 border-spacing 和 empty-cells 屬性。
3. inherit:規定應該從父元素繼承border-collapse 屬性的值
*/

.sTh {
    border: 1px solid gray;
    border-top: none;
    border-left: none;
    position: relative;
}

.sPo{
    height: 15px;
    position: absolute;
    top: 2px;
    right: -2%;
    z-index: 10;
    width: 100%;
    background: red;
}

/*
contenteditable  編輯時帶來的黑框
*/
[contenteditable]:focus {
    outline: none;
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前發過幾個關於趣味心理測試的數據,而今天的這個內容與他們是一類的只不過結構方面很不同,前者是結構完美的測試題,今天這個只是個文章型的數據、文章型的測試,看截圖: 比如下麵這個就是其中一條記錄的詳細內容,標題是“你現在最重視誰?”,以下是內容: 每個人都或多或少有掉東西的經驗。假設有一天,你騎機車經 ...
  • 1. 背景 3月份針對線上重點H5項目秒開進行治理,本文將逐步介紹如何通過H5頁面的優化手段來提高 1.5 秒開率。 2. 為什麼要優化 從用戶角度看,優化能夠讓頁面載入得更快、對用戶操作響應更及時,用戶體驗更良好,提升用戶體驗和降低用戶流失率非常重要。其中 Global Web Performan ...
  • 我們團隊接到了食品頻道的一個互動項目的開發需求,希望通過 3D 場景的展示和互動方式,作為對未來購物的一種嘗試與探索,滿足用戶對未來美好新奇的一個需求。將購物場景化、娛樂化,給用戶帶來美好的購物感受。 ...
  • 上期主要分享了 From Java To Kotlin 1 :空安全、擴展、函數、Lambda。 這是 From Java to Kotlin 第二期。 From Java to Kotlin 關鍵在於 **思維的轉變**。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 🛰🛰 我們在無論是在查閱別人的代碼,還是在實際項目開發的過程中,肯定都會使用導入導出的功能,有時候我們會搞混這幾種方式到底有什麼區別,今天我們就來細緻的區分一下: 導入導出方式⚔️⚔️ 我們都知道最常見的幾種導出方式無非是exp ...
  • 一、雙向綁定原理 Vue2採用的是觀察者-發佈訂閱模式,利用Object.defineProperty實現對數據已定義屬性的監控(定義觀察者模式), 編譯DOM時解析v-model等屬性以及對input框等註冊事件實現UI和JS的交互(也就是註冊發佈訂閱這模式); 詳細的是主要是定義一個Observ ...
  • 本文主要是介紹團隊在離線包技術方案上的探索,以及基於prefetch的離線包實現方案如何減少維護成本和開發成本。 ...
  • ## 1、使用場景 在日常開發中,我們會將重覆代碼抽象為一個函數或者組件,然後在需要時調用或者引入。但是,對於某些功能,這種方法可能不夠優雅或者不夠靈活。例如,我們可能需要在DOM元素上添加一些自定義屬性或者綁定一些事件,這些操作可能難以通過函數或組件來實現。這時,[自定義指令](https://v ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...