最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3 座位選座矩陣布局的實現(xiàn)方法(可點擊選中拖拽調(diào)換位置)

 更新時間:2023年11月21日 11:14:53   作者:jaqqq-teng  
由于公司項目需求需要做一個線上設(shè)置考場相關(guān)的座位布局用于給學(xué)生考機排號考試,實現(xiàn)教室考場座位布局的矩陣布局,可點擊選中標記是否有座無座拖拽調(diào)換位置橫向縱向排列,本文給大家分享實現(xiàn)代碼,一起看看吧

概述

由于公司項目需求需要做一個線上設(shè)置考場相關(guān)的座位布局用于給學(xué)生考機排號考試,實現(xiàn)教室考場座位布局的矩陣布局,可點擊選中標記是否有座無座拖拽調(diào)換位置橫向縱向排列,這塊的邏輯與ui網(wǎng)上很少有參考的價值,作者把這塊邏輯實現(xiàn)了供大家參考

提示:使用vue3+ts實現(xiàn),其邏輯原理也適用于其他技術(shù)棧
代碼邏輯也適用于電影選座矩陣布局等其他項目

先上效果

說明

以公司項目考場座位布局,實現(xiàn)新增矩陣布局需要把考場位置編號等信息通過調(diào)整位置標記座位是否有座橫向縱向排列等功能最后把所有修改后的位置數(shù)據(jù)提交給服務(wù)器。
具體需求如下圖:

詳細

  • 思考如何html布局
  • 如何生成矩陣、如何給座位標記,拖拽調(diào)整位置編號,排列橫向縱向,編輯座位布局時需要帶入后臺座位id標識等邏輯處理 實現(xiàn)步驟思路

1. html布局

以左上角為軸,x軸 從左到右方向為列 y軸 從上到下為行 代碼如下:例:x=8,y=8

<div v-for="(row, rowX) in 8" :key="row" class="x">
   <div class="y">
      <div v-for="(column, columnY) in 8" :key="column" class="site-item">
       {{ `${rowX}, ${columnY}` }}
      </div>
   </div>
</div>

通過html布局,座位有對應(yīng)的(x,y)坐標,那么對應(yīng)的有座無座標記只是控制div背景顯示隱藏,對應(yīng)的拖拽換位編輯以及代入的座位數(shù)據(jù)給服務(wù)器都是操作的數(shù)據(jù)源

2. 生成矩陣

代碼生成(x,y)坐標數(shù)據(jù)源model對象數(shù)組 縱向布局

type SiteModel = {
    x: number
    y: number
    seatNo: number //座位號 == 如果沒有賦值為無座
    seatId: '' | number //后臺生成的id編號
    status?: number //座位狀態(tài)
}
const sites:Array<SiteModel> = []
for (let x = 0; x < 8; x++) {
    for (let y = 0; y < 8; y++) {
        sites.push({ x: x, y: y, seatNo: i + 1, seatId: '' })
    }
}

注:這里的數(shù)據(jù)源為8*8的縱向布局數(shù)據(jù)并且數(shù)據(jù)都有座

3. 座位標記

有座無座 因后臺只接受有座位的坐標數(shù)據(jù),因此獲取到數(shù)據(jù)源后標記無座需要刪除數(shù)據(jù)對應(yīng)的model對象,同理點擊div標記有座時需要在數(shù)據(jù)源插入應(yīng)用的此div坐標的model對象

以下思路:

1. 創(chuàng)建數(shù)據(jù)源對象數(shù)組時設(shè)置一個Map集合將mode對象中的x,y作為鍵,對象設(shè)置為值 設(shè)置Map是在html布局中需要獲取model對象,不設(shè)置Map也能實現(xiàn),通過x,y坐標去遍歷循環(huán)坐標數(shù)據(jù)源但這種方式對性能消耗很大

代碼如下:

const _map: Map<string, ExamSiteType> = new Map(); //全局定義一個_map對象
    生成矩陣代碼...
  _map.clear()
  sites.value.forEach((item) => {
    _map.set(`${item.x},${item.y}`, item)
  })

2.有了_map數(shù)據(jù)集合后,就可以在html布局中 實現(xiàn)div點擊事件傳入x,y代碼’標記無座’|'標記有座’邏輯

const didSeletedItemAction = ( x: number, y: number) => {
        if (!_map.value.get(`${x},${y}`)) { //添加
           sites.value.push({ x: x, y: y, seatNo: 0, seatId: '' })
        } else { //刪除..
           const item = _map.get(`${x},${y}`)
            if (item)
                sites.value.splice(examsits.value.indexOf(item), 1)
        }
}

3.拖拽調(diào)整位置編號

這里需要獲取拖拽相關(guān)事件邏輯,最后只是在拖拽的div以及拖拽到的目標上調(diào)換model對象的seatNo編號

實現(xiàn)拖拽相關(guān)代碼
定義starTarget開始拖拽的坐標{x,y}對象 以及拖拽后的目標對象dropTarget

const starTarget = ref({ x: 0, y: 0 })
const dropTarget = ref({ x: 0, y: 0 })

設(shè)置html中draggable=true 綁定事件dragstart dragend drop

//html布局中
<div v-for="(row, rowX) in 8" :key="row" class="x">
   <div class="y">
      <div v-for="(column, columnY) in 8" :key="column" class="site-item" draggable @dragstart="dragStart($event, rowX, columnY)" @dragend="dragEnd($event, rowX, columnY)" @drop="drop($event, rowX, columnY)">
       {{ `${rowX}, ${columnY}` }}
      </div>
   </div>
</div>
<script setup lang="ts">
function dragStart(event: MouseEvent, x: number, y: number) {
            starTarget.value.x = x
            starTarget.value.y = y
}
function dragEnd(event: MouseEvent, x: number, y: number) {
            starTarget.value.x = 0
            starTarget.value.y = 0
}
function drop(event: MouseEvent, x: number, y: number) {
            if (_map.value.get(`${x},${y}`)) {
                dropTarget.value.x = x
                dropTarget.value.y = y
                changeTarget()
            }
}
const changeTarget = () => {
        const site = _map.value.get(`${starTarget.value.x},${starTarget.value.y}`)
        const dropSite = _map.value.get(`${dropTarget.value.x},${dropTarget.value.y}`)
        if (site && dropSite) {
            const temp = site.seatNo
            site.seatNo = dropSite?.seatNo
            dropSite.seatNo = temp
        }
}
</script>

排列橫向縱向

切換橫向縱向布局主要理解到html布局與div上的x,y坐標是不變的,變化的只是座位號碼,故:只需要操作坐標對象的數(shù)組通過排序以x (0,0)(1,0),(2,0)... 以y(0,0)(0,1)(0,2)的排列給坐標對象重新設(shè)置編號即可

const x_layout = ref(false) //定義是否是橫向布局ref
生成矩陣代碼...
if (x_layout.value) {
    sites.value.sort((a, b) => {
        if (a.y !== b.y) {
            return a.y - b.y;
        } else {
            return a.x - b.x;
         }
    })
} else {
    sites.value.sort((a, b) => {
        if (a.x !== b.x) {
            return a.x - b.x;
        } else {
        return a.y - b.y;
       }
    })
}
//通過排序,重新賦值座位編號
for (let index = 0; index < sites.value.length; index++) {
    const item = sites.value[index];
    item.seatNo = index + 1
}

編輯后臺返回數(shù)據(jù)源時

這里拿到后臺返回的數(shù)據(jù)源遍歷循環(huán)通過_map集合的鍵(x,y)找到model并賦值id即可

if (props.item.examSites) { //后臺服務(wù)器數(shù)據(jù)
    props.item.examSites.forEach((item) => {
        const site = _map.get(`${item.x},${item.y}`)
        if (site) {
            site.seatId = item.seatId
        }
    })
}

最后html布局代碼
通過_map集合獲取(x,y)是否有值動態(tài)賦值class控制顯隱即可 最近發(fā)現(xiàn)不少童鞋私信我源碼,這里我把核心源碼提供出來參考,其余核心參考上面邏輯代碼即可

代碼點擊頂部即可下載 注:部分邏輯已刪除(刪除的代碼參考文章上面的邏輯即可),代碼可根據(jù)需求自行修改

代碼使用釋列

//使用3 種方式參考:
<ExamLayout :items="datas" :type="1" :map="_map"></ExamLayout>
<ExamLayout :items="datas" :type="2" :map="_map" :call-back="editExamItem"></ExamLayout>
<ExamLayout :items="datas" :type="3" :map="_map" ></ExamLayout>
-----------------------------解釋用法:----------------------------------
使用 `ExamLayout`組件
type //1不能編輯 2可標記無座有座 3可拖拽座位
傳入的數(shù)據(jù)源 datas 參考上面邏輯代碼
type ExamSiteType = {
    coordinateX: number //x坐標位置
    coordinateY: number //y坐標位置
    seatNo: number //座位號  == 如果沒有賦值為無座
    seatId: '' | number //真實的考試機器坐標位置
    status?: number //座位考試狀態(tài)  被舉報 異常 死機等
}
// 數(shù)據(jù)源1
const datas = ref<Array<ExamSiteType>>([
])
// 初始化 數(shù)據(jù)源 如8行8列 總機考數(shù) 16臺
function initExamData() {
    const row: number = 4
    const column = 4
    const total = 16
    examsits.value = []
    let i = 0
    for (let x = 0; x < row; x++) {
        for (let y = 0; y < column; y++) {
            if (i < total) {
                datas.value.push({ coordinateX: x, coordinateY: y, seatNo: i + 1, seatId: '' })
                i++
            }
        }
    }
}
initExamData()

到此這篇關(guān)于vue3 座位選座,矩陣布局,可點擊選中拖拽調(diào)換位置的文章就介紹到這了,更多相關(guān)vue3矩陣布局內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue2 Element多選表格row-click選取與行禁用方式

    Vue2 Element多選表格row-click選取與行禁用方式

    文章介紹了在表格中實現(xiàn)行選取的方法,首先,使用row-click事件實現(xiàn)行選??;其次,針對特定條件(如cTotAmt和dTotAmt不等),在row-click事件處理函數(shù)中直接returnfalse,禁用該行選??;最后,結(jié)合selectable使用達到徹底禁行選取的目的
    2026-04-04
  • 關(guān)于vue中@click.native.prevent的說明

    關(guān)于vue中@click.native.prevent的說明

    這篇文章主要介紹了關(guān)于vue中@click.native.prevent的說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Vue3獲取響應(yīng)式數(shù)據(jù)的四種方法

    Vue3獲取響應(yīng)式數(shù)據(jù)的四種方法

    Vue 3 引入了一個全新的響應(yīng)式系統(tǒng),其中最核心的就是 reactive 和 ref,它們是實現(xiàn)響應(yīng)式數(shù)據(jù)的基礎(chǔ),用于創(chuàng)建可以自動跟蹤變化并更新視圖的對象和變量,本文介紹了Vue3獲取響應(yīng)式數(shù)據(jù)的四種方法,需要的朋友可以參考下
    2024-08-08
  • vue3實現(xiàn)小程序手機號一鍵登錄功能

    vue3實現(xiàn)小程序手機號一鍵登錄功能

    這篇文章主要為大家詳細介紹了如何使用vue3實現(xiàn)小程序手機號一鍵登錄功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • Vue祖孫組件如何實現(xiàn)傳值

    Vue祖孫組件如何實現(xiàn)傳值

    這篇文章主要介紹了Vue祖孫組件如何實現(xiàn)傳值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • vue+Element實現(xiàn)分頁效果

    vue+Element實現(xiàn)分頁效果

    這篇文章主要為大家詳細介紹了vue+Element實現(xiàn)分頁效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue限制文本輸入框只允許輸入字母、數(shù)字、禁止輸入特殊字符

    vue限制文本輸入框只允許輸入字母、數(shù)字、禁止輸入特殊字符

    這篇文章主要介紹了vue限制文本輸入框只允許輸入字母、數(shù)字、不允許輸入特殊字符,通過監(jiān)聽表單輸入的內(nèi)容,使用方法的缺陷,本文通過實例代碼介紹的非常詳細,需要的朋友參考下吧
    2023-10-10
  • vue一步到位的實現(xiàn)動態(tài)路由

    vue一步到位的實現(xiàn)動態(tài)路由

    這篇文章主要介紹了vue一步到位的實現(xiàn)動態(tài)路由,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 淺談Vue.js 1.x 和 2.x 實例的生命周期

    淺談Vue.js 1.x 和 2.x 實例的生命周期

    下面小編就為大家?guī)硪黄獪\談Vue.js 1.x 和 2.x 實例的生命周期。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • el-table表格動態(tài)合并相同數(shù)據(jù)單元格(可指定列+自定義合并)

    el-table表格動態(tài)合并相同數(shù)據(jù)單元格(可指定列+自定義合并)

    工作時遇到的el-table合并單元格的需求,本文主要介紹了el-table表格動態(tài)合并相同數(shù)據(jù)單元格(可指定列+自定義合并),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論

常山县| 甘德县| 梅河口市| 枣阳市| 云霄县| 新平| 桃源县| 伊春市| 贞丰县| 绥中县| 开江县| 宜黄县| 得荣县| 新乐市| 新泰市| 新沂市| 石棉县| 嘉峪关市| 原平市| 河南省| 通河县| 台州市| 清远市| 龙井市| 崇阳县| 云阳县| 沐川县| 亚东县| 姜堰市| 九江县| 宁陵县| 山东省| 武城县| 涡阳县| 宝应县| 如东县| 壶关县| 绩溪县| 丹东市| 徐水县| 颍上县|