<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了React實現表格選取的具體程式碼,供大家參考,具體內容如下
在工作中,遇到一個需求,在表格中實現類似於Excel選中一片區域的,然後拿到選中區域的所有資料。
1.獲取選中區域的資料
2.選擇的方向是任意的
3.支援幾行 / 幾列的選取
4.通過生產JSON給後臺進行互動
5.標記出表頭和第一行的資料
2.1區域選擇
onClick={() => { // 區間選取 if (itemIndex != 0) { setType('slide') /** 第一個點選的時候,開啟滑鼠移動的邏輯 區間選取的時候,要標記第一次選中點的(x,y)座標。 同時初始化x,y的最小最大值。 **/ if(isStart == 0){ setIsStart(1) setStartItemIndex(itemIndex) setStartDataIndex(dataIndex) setMaxItemIndexs(itemIndex) setMaxDataIndexs(dataIndex) setMinItemIndexs(itemIndex) setMinDataIndexs(dataIndex) }else { //第二次點選的時候,關閉滑鼠移動的邏輯 setIsStart(0) } } // 行選取 if (itemIndex == 0) { setType('row') setIsStart(1) setColumnIndexList([]) if (rowIndexList.indexOf(dataIndex) != -1) { let obj = [...rowIndexList] obj.deleteElementByValue(dataIndex) setRowIndexList(obj) } else { let obj = [...rowIndexList] obj.push(dataIndex) setRowIndexList(obj) } } }}
2.2滑鼠移動效果
onMouseOver={() => { if (isStart) { if(itemIndex!= 0 ){ //比較當前值跟第一次點選值的大小,隨時調整最大值和最小值。從而達到選中區域的效果 if (itemIndex > startItemIndex) { setMinItemIndexs(startItemIndex) setMaxItemIndexs(itemIndex) } else { setMaxItemIndexs(startItemIndex) setMinItemIndexs(itemIndex) } } if (dataIndex > startDataIndex) { setMinDataIndexs(startDataIndex) setMaxDataIndexs(dataIndex) } else { setMaxDataIndexs(startDataIndex) setMinDataIndexs(dataIndex) } } }}
2.3生產JSON資料邏輯
<Button type="primary" onClick={() => { if (type == 'slide') { // 區域選擇 // 資料體 let obj = {} // 表頭集合 let headerList = [] // 第一列集合 let firstRow = [] for (let i = minDataIndexs; i <= maxDataIndexs; i++) { obj[data['資料集'][i]] = [] if(firstRow.indexOf(data['資料集'][i]) == -1){ firstRow.push(data['資料集'][i]) } for (let j = minItemIndexs; j <= maxItemIndexs; j++) { let dataObj = {} dataObj[header[j].name] = data[header[j].name][i] if(headerList.indexOf(header[j].name) == -1){ headerList.push(header[j].name) } obj[data['資料集'][i]].push(dataObj) } } console.log(firstRow); console.log(headerList); console.log(obj); } else if (type == 'row') { // 幾行選中 let obj = {} let headerList = [] let firstRow = [] rowIndexList.map(item => { obj[data['資料集'][item]] = [] firstRow.push(data['資料集'][item]) header.map((headerItem, headerIndex) => { if (headerIndex != 0) { let dataObj = {} if(headerList.indexOf(headerItem.name) == -1){ headerList.push(headerItem.name) } dataObj[headerItem.name] = data[headerItem.name][item] obj[data['資料集'][item]].push(dataObj) } }) }) console.log(firstRow); console.log(headerList); console.log(obj); } else if (type == 'column') { // 幾列選中 let headerList = [] let firstRow = [] let obj = {} data['資料集'].map((item, index) => { obj[item] = [] firstRow.push(item) columnIndexList.map(i => { let dataObj = {} if(headerList.indexOf(header[i].name) == -1){ headerList.push(header[i].name) } dataObj[header[i].name] = data[header[i].name][index] obj[item].push(dataObj) }) }) console.log(firstRow); console.log(headerList); console.log(obj); } }}>確定</Button>
import { Button } from 'antd'; import React, { useState } from 'react'; function Index(params) { // 刪除陣列中第一個匹配的元素,成功則返回位置索引,失敗則返回 -1。 Array.prototype.deleteElementByValue = function (varElement) { var numDeleteIndex = -1; for (var i = 0; i < this.length; i++) { // 嚴格比較,即型別與數值必須同時相等。 if (this[i] === varElement) { this.splice(i, 1); numDeleteIndex = i; break; } } return numDeleteIndex; } // 表頭 const [header, setHeader] = useState([ { name: "資料集", }, { name: '19春支付金額', }, { name: '20春支付金額', }, { name: '21春支付金額', }, { name: '19春支付人數', }, { name: '20春支付人數', }, { name: '21春支付人數', } ]) // 資料 const [data, setData] = useState({ '資料集': ['連衣裙', '褲子', '襯衫', '短袖', '長袖', '短褲', '羽絨服', '棉毛褲'], '19春支付金額': [10000, 5000, 10000, 5000, 10000, 5000, 10000, 5000], '20春支付金額': [12000, 5200, 12000, 5200, 12000, 5200, 12000, 5200], '21春支付金額': [14000, 5400, 14000, 5400, 14000, 5400, 14000, 5400], '19春支付人數': [1000, 500, 1000, 500, 1000, 500, 1000, 500], '20春支付人數': [1200, 520, 1200, 520, 1200, 520, 1200, 520], '21春支付人數': [1400, 540, 1400, 540, 1400, 540, 1400, 540], }) // const [isStart, setIsStart] = useState(0) // 型別 const [type, setType] = useState('') // // 起始 const [startItemIndex, setStartItemIndex] = useState(-1) const [startDataIndex, setStartDataIndex] = useState(-1) // 小 const [minItemIndexs, setMinItemIndexs] = useState(-1) const [minDataIndexs, setMinDataIndexs] = useState(-1) // 大 const [maxItemIndexs, setMaxItemIndexs] = useState(-1) const [maxDataIndexs, setMaxDataIndexs] = useState(-1) // 行下標 const [rowIndexList, setRowIndexList] = useState([]) // 列下標 const [columnIndexList, setColumnIndexList] = useState([]) return ( <div> <div style={{ marginLeft: 200 }}> <div style={{ display: 'flex' }}> <Button type="primary" onClick={() => { if (type == 'slide') { // 區域選擇 let obj = {} let headerList = [] let firstRow = [] for (let i = minDataIndexs; i <= maxDataIndexs; i++) { obj[data['資料集'][i]] = [] if(firstRow.indexOf(data['資料集'][i]) == -1){ firstRow.push(data['資料集'][i]) } for (let j = minItemIndexs; j <= maxItemIndexs; j++) { let dataObj = {} dataObj[header[j].name] = data[header[j].name][i] if(headerList.indexOf(header[j].name) == -1){ headerList.push(header[j].name) } obj[data['資料集'][i]].push(dataObj) } } console.log(firstRow); console.log(headerList); console.log(obj); } else if (type == 'row') { // 幾行選中 let obj = {} let headerList = [] let firstRow = [] rowIndexList.map(item => { obj[data['資料集'][item]] = [] firstRow.push(data['資料集'][item]) header.map((headerItem, headerIndex) => { if (headerIndex != 0) { let dataObj = {} if(headerList.indexOf(headerItem.name) == -1){ headerList.push(headerItem.name) } dataObj[headerItem.name] = data[headerItem.name][item] obj[data['資料集'][item]].push(dataObj) } }) }) console.log(firstRow); console.log(headerList); console.log(obj); } else if (type == 'column') { // 幾列選中 let headerList = [] let firstRow = [] let obj = {} data['資料集'].map((item, index) => { obj[item] = [] firstRow.push(item) columnIndexList.map(i => { let dataObj = {} if(headerList.indexOf(header[i].name) == -1){ headerList.push(header[i].name) } dataObj[header[i].name] = data[header[i].name][index] obj[item].push(dataObj) }) }) console.log(firstRow); console.log(headerList); console.log(obj); } }}>確定</Button> {/* <Button type="primary" danger onClick={()=>{ setStartItemIndex(-1) setRowIndexList([]) setColumnIndexList([]) setType('') }}>重置</Button> */} </div> <div style={{ display: 'flex', textAlign: "center" }}> { header.map((item, index) => { return <div style={{ minWidth: 100, border: "1px solid #ccc" }} onClick={() => { setType('column') setRowIndexList([]) if (columnIndexList.indexOf(index) != -1) { let obj = [...columnIndexList] obj.deleteElementByValue(index) setColumnIndexList(obj) } else { let obj = [...columnIndexList] obj.push(index) setColumnIndexList(obj) } }}>{item.name}</div> }) } </div> <div style={{ display: 'flex', textAlign: "center" }}> { header.map((item, itemIndex) => { return <div> { data[item.name].map((data, dataIndex) => { return <div onClick={() => { // 區間選取 if (itemIndex != 0) { setType('slide') if(isStart == 0){ setIsStart(1) setStartItemIndex(itemIndex) setStartDataIndex(dataIndex) setMaxItemIndexs(itemIndex) setMaxDataIndexs(dataIndex) setMinItemIndexs(itemIndex) setMinDataIndexs(dataIndex) }else { setIsStart(0) } } // 行選取 if (itemIndex == 0) { setType('row') setIsStart(1) setColumnIndexList([]) if (rowIndexList.indexOf(dataIndex) != -1) { let obj = [...rowIndexList] obj.deleteElementByValue(dataIndex) setRowIndexList(obj) } else { let obj = [...rowIndexList] obj.push(dataIndex) setRowIndexList(obj) } } }} onMouseOver={() => { if (isStart) { if(itemIndex!= 0 ){ if (itemIndex > startItemIndex) { setMinItemIndexs(startItemIndex) setMaxItemIndexs(itemIndex) } else { setMaxItemIndexs(startItemIndex) setMinItemIndexs(itemIndex) } } if (dataIndex > startDataIndex) { setMinDataIndexs(startDataIndex) setMaxDataIndexs(dataIndex) } else { setMaxDataIndexs(startDataIndex) setMinDataIndexs(dataIndex) } } }} style={{ minWidth: 100, border: "1px solid #ccc", backgroundColor: type == 'slide' ? (itemIndex >= minItemIndexs && itemIndex <= maxItemIndexs) && (dataIndex >= minDataIndexs && dataIndex <= maxDataIndexs) ? 'pink' : '' : type == 'row' ? rowIndexList.indexOf(dataIndex) != -1 ? 'pink' : '' : type == 'column' ? columnIndexList.indexOf(itemIndex) != -1 ? 'pink' : '' : '' }}>{data}</div> }) } </div> }) } </div> </div> </div> ) } export default Index
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45