Bootstrap

ant design vue a-table 列拖拽 后两列固定 前四列可拖动

<div class="table_show" ref="table_show">         

  <a-table :columns="columns" :data-source="test" class="list_body" :customRow="rowClick"

                :rowClassName="setRowClassName" style="width:100%" @resizeColumn="handleResizeColumn">

                <template #bodyCell="{ column, record }">

                    <template v-if="column.key === 'type'">

                        <EditType v-if="record.type === 'edit'" :hasEditHistory="true"></EditType>

                        <PkgReleaseType v-else></PkgReleaseType>

                    </template>

                    <template v-if="column.key === 'editFlag'">

                        <EditIcon :id="record.id" :name="record.name" :releaseVersion="record.releaseList" :editVersion="record.editVersion"

                            :editFlag="record.type === 'edit'" @updateList="getData()"></EditIcon>

                    </template>

                </template>

            </a-table>

</div>

const columns = ref<TableColumnsType>([

    { title: t('list.common.reportId'), dataIndex: 'id', key: 'id', width: 100, resizable: true, minWidth: 100 },

    { title: t('list.common.reportName'), dataIndex: 'name', key: 'name', ellipsis: true, resizable: true, minWidth: 100, width: 150 },

    { title: t('list.common.subSystem'), dataIndex: 'subSystem', key: 'subSystem', ellipsis: true, resizable: true, width: 150, minWidth: 100 },

    { title: t('list.common.version'), dataIndex: 'releaseVersion', key: 'releaseVersion', width: 150, minWidth: 100 ,maxWidth:150},

    { title: t('list.common.type'), dataIndex: 'type', key: 'type', width: 100 },

    { title: '  ', dataIndex: 'editFlag', key: 'editFlag', width: 100 }

]);

//列拖拽时触发该方法

const handleResizeColumn = (w: number, col: any) => {

    var width = Number(columns.value[0].width) + Number(columns.value[1].width) + Number(columns.value[2].width) + Number(columns.value[3].width)

    // console.log( " width:" + width)

        if (col.key === 'id' || col.key === 'name' || col.key === 'subSystem') {

            // console.log("拖动第1列或者第2列或第三列时")

            if (Number(columns.value[3].width) > 100) {

                // console.log("压缩第四列")

                col.width = w;

                columns.value[3].width = width - Number(columns.value[0].width) - Number(columns.value[1].width) - Number(columns.value[2].width)

            } else {

                // console.log("第4列已经压缩到极限了。")

                if ((col.key === 'name' || col.key === 'id') && Number(columns.value[2].width) > 100) {

                    // console.log("拖动第2列或第1列且第3列没有压缩到极限时,压缩第3列")

                    col.width = w;

                    columns.value[2].width = width - Number(columns.value[0].width) - Number(columns.value[3].width) - Number(columns.value[1].width)

                    // console.log("第3列宽度:" + columns.value[2].width)

                } else if (col.key === 'id' && Number(columns.value[1].width) > 100) {

                    // console.log("拖动第1列且第2列没有压缩到极限时,压缩第2列")

                    col.width = w;

                    columns.value[1].width = width - Number(columns.value[0].width) - Number(columns.value[3].width) - Number(columns.value[2].width)

                }else if(col.key === 'subSystem'){

                    if(w < width - Number(columns.value[1].width) - Number(columns.value[3].width) - Number(columns.value[0].width)){

                        // console.log("第4列已经压缩到极限时,第3列只能缩小,不能再拉大")

                        col.width = w;

                        columns.value[3].width = width - Number(columns.value[0].width) - Number(columns.value[1].width) - w

                    }

                }else if(col.key === 'name'){

                    if(w < width - Number(columns.value[2].width) - Number(columns.value[3].width) - Number(columns.value[0].width)){

                        // console.log("第3列已经压缩到极限时,第2列只能缩小,不能再拉大")

                        col.width = w;

                        columns.value[2].width = width - Number(columns.value[0].width) - Number(columns.value[3].width) - w

                    }

                }else if (col.key === 'id'){

                    if(w < width - Number(columns.value[2].width) - Number(columns.value[3].width) - Number(columns.value[1].width)){

                        // console.log("第2列已经压缩到极限时,第1列只能缩小,不能再拉大")

                        col.width = w;

                        columns.value[1].width = width - Number(columns.value[2].width) - Number(columns.value[3].width) - w

                    }

                }

            }

        }

    if (width > 550) {

        isHidden.value = true

    } else {

        isHidden.value = false

    }

}

const table_show = ref()

var width = Number(columns.value[0].width) + Number(columns.value[1].width) +

    Number(columns.value[2].width) + Number(columns.value[3].width) + Number(columns.value[4].width) + Number(columns.value[5].width)

const isEnlarge = ref<boolean>(false)

//根据浏览器窗口调整表格的列宽  前四列变化 后两列固定

const windowResize = () => {

    const tableWidth = table_show.value.clientWidth

    // console.log("tableWidth"+tableWidth + "width" + width)

    if (tableWidth <= width) {

        if (!isEnlarge.value) {

            if (columns.value[3].width && Number(columns.value[3].width) > 100) {

                // console.log("第4列改变" + columns.value[3].width)

                columns.value[3].width = tableWidth - Number(columns.value[0].width) - Number(columns.value[1].width) - Number(columns.value[2].width) - Number(columns.value[4].width) - Number(columns.value[5].width)

                if(columns.value[3].width < 100){

                    columns.value[3].width = 100

                }

            }

            if (Number(columns.value[2].width) > 100 && Number(columns.value[3].width) <= 100) {

                // console.log("第3列改变" + columns.value[2].width)

                columns.value[2].width = tableWidth - Number(columns.value[0].width) - Number(columns.value[1].width) - Number(columns.value[4].width) - Number(columns.value[5].width) -  Number(columns.value[3].width)

                if(columns.value[2].width < 100){

                    columns.value[2].width = 100

                }

            }

            if (Number(columns.value[1].width) > 100 && Number(columns.value[2].width)<= 100) {

                // console.log("第2列改变" + columns.value[1].width)

                columns.value[1].width = tableWidth - Number(columns.value[0].width) - Number(columns.value[2].width) - Number(columns.value[3].width) - Number(columns.value[4].width) - Number(columns.value[5].width)

                if(columns.value[1].width < 100){

                    columns.value[1].width = 100

                }

            }

            if (Number(columns.value[0].width) > 100 && Number(columns.value[1].width)<= 100) {

                // console.log("第1列改变" + columns.value[0].width)

                columns.value[0].width = tableWidth - Number(columns.value[4].width) - Number(columns.value[5].width) - Number(columns.value[1].width) - Number(columns.value[2].width) - Number(columns.value[3].width)

            }

        }else if(isEnlarge.value){

            if (columns.value[3].width && Number(columns.value[3].width) < 150) {

                // console.log("第4列改变" + columns.value[3].width)

                columns.value[3].width = tableWidth - Number(columns.value[0].width) - Number(columns.value[1].width) - Number(columns.value[2].width) - Number(columns.value[4].width) - Number(columns.value[5].width)

            } else if (columns.value[2].width && Number(columns.value[2].width) < 150) {

                // console.log("第3列改变" + columns.value[2].width)

                columns.value[2].width = tableWidth - Number(columns.value[0].width) - Number(columns.value[1].width) - Number(columns.value[4].width) - Number(columns.value[5].width) - 150

            } else if (columns.value[1].width && Number(columns.value[1].width) <150) {

                // console.log("第2列改变" + columns.value[1].width)

                columns.value[1].width = tableWidth - Number(columns.value[0].width) - Number(columns.value[4].width) - Number(columns.value[5].width) - 300

            } else if (Number(columns.value[0].width) <100 && columns.value[0].width) {

                // console.log("第1列改变" + columns.value[0].width)

                columns.value[0].width = tableWidth - Number(columns.value[4].width) - Number(columns.value[5].width) - 450

            }

        }

    }

    // console.log("tableWidth:" + tableWidth + " width:" + width)

    // console.log("第四列宽度:"+columns.value[3].width)

    // console.log("第3列宽度:"+columns.value[2].width)

    // console.log("第2列宽度:"+columns.value[1].width)

    // console.log("第1列宽度:"+columns.value[0].width)

}

let prevWidth = ref<number>(window.innerWidth)

//拖动浏览器窗口时触发该方法

window.onresize = () => {

    const winWidth = window.innerWidth

    if (winWidth > prevWidth.value) {

        isEnlarge.value = true

    } else if (winWidth < prevWidth.value) {

        isEnlarge.value = false

    }

    windowResize()

    prevWidth.value = winWidth

}

onMounted(() => {

    windowResize()

})

//表格外层的div的样式  min-width用于控制浏览器窗口变化时的最小值

.table_show {

    margin: 0 auto;

    border: 1px solid #d7dadd;

    border-radius: 12px;

    width: 100%;

    max-width: 814px;

    min-width: 600px;

    min-height: calc(100vh - 40px * 2 - 64px);

    white-space: nowrap;

    overflow: hidden;

}

;