vue+Element中table表格實現可編輯(select下拉框)

最近在工作中遇到一個問題,需要在表格中實現數據可編輯狀態,具體情況是需要在單元格里加入下拉框;並且每個下拉框的數組數據是不一樣的,具體是根據當前行前面數據的id查詢而來,前面的是數據是動態生成的,後面的下拉框數據也是根據id動態生成的,內容不同;有點類似於樹形二級狀態,後面的下拉框數據來源並沒有在前面內容裏,而是另外一個接口查詢,具體操作如下:
在這裏插入圖片描述
HTML代碼:

1.在處理人列加入一個下拉框模板,其中v-model必須要scope.row.proJbruserValue來綁定,意思是這個值綁定到當前行所選中的人;如果直接綁定proJbruserValue,將不能進行差異化選擇,(這裏scope.row.proJbruserValue 相當於對象點屬性,在本地臨時添加了一個屬性來存儲不同行的選中處理人id)

2.通過點擊當前行下拉框獲取焦點,根據當前行id查詢對應的下拉框數據,並賦值給data中我們設置的數組接收,

3.一個重要的注意點,:key=item.id 這個key儘量綁定id,不推薦使用Index, 因爲在這裏使用Index的時候,會讓選中項出現數字bug,這是我在坑裏呆了好久才通過我的一個朋友得到的答案,具體bug原因尚未深究,請重點注意;

4.最後點擊按鈕提交流程配置;

<el-table :data="processNodelist" style="width: 100%" border stripe>
	<el-table-column type="index" label="序號" width="50"></el-table-column>
	<el-table-column prop="nodename" label="流程節點名稱"></el-table-column>
	<el-table-column label="處理人名稱">
		<template slot-scope="scope">
			<el-select v-model="scope.row.proJbruserValue"  @focus="getDatalist(scope.row)" placeholder="請選擇" filterable allow-create>
				<el-option v-for="item in projectJbrUserlist " :key="item.id" :label="item.username" :value="item.id">
				</el-option>
			</el-select>
		</template>
	</el-table-column>
</el-table>
<el-button @click="submitConfigHandle" type="primary" size="mini" icon="el-icon-upload">提交配置</el-button>

js邏輯代碼:

data() {
    return {
        processNodelist: [], // 流程節點數據
        projectJbrUserlist: [], // 處理人員數據
        nodeidlist: [], // 所有流程節點Id
        selectedUserlist: [], // 被選中的處理人員id數組
    }
},
created() {
    this.getProcessNodelist();
},
methods: {
    // 查詢流程節點數據
        async getProcessNodelist() {
            const { data: res } = await this.$http.post('querynode', {
                userid: this.sessionInfo.userid,
                sid: this.sessionInfo.session,
                developerid: this.sessionInfo.companyId
            });
            if (res.code !== 0) {
                return this.$message.error('獲取流程節點數據失敗');
            }
            this.processNodelist = res.msg;
        },
        // select下拉框獲取焦點的時候查詢id對應的下拉框數據源
        async getDatalist(row) {
            const { data: res } = await this.$http.post('query', {
                userid: this.sessionInfo.userid,
                sid: this.sessionInfo.session,
                queryid: 9,
                nodeid: row.nodeid
            });
            if (res.code !== 0) {
                return this.$message.error('獲取處理人數據失敗');
            }
            this.projectJbrUserlist = res.msg;
        },
        // 提交流程配置接口
        async submitConfig() {
            const { data: res } = await this.$http.post('bindTask', {
                userid: this.sessionInfo.userid,
                sid: this.sessionInfo.session,
                flowid: 9,
                table_name: 'pt_base',
                key_value: this.sessionInfo.proId,
                nodeid: this.nodeidlist,
                uid: this.selectedUserlist
            });
            if (res.code !== 0) {
                return this.$message.error('流程節點配置失敗');
            }
            this.$message.success('流程節點配置成功');
        },
        // 發起請求
        submitConfigHandle() {
            // 循環流程節點數組將所有nodeid取出添加到新數組
            for (let i = 0; i < this.processNodelist.length; i++) {
                this.nodeidlist.push(this.processNodelist[i].nodeid);
            }
            // 循環流程節點數組將所有被選擇的處理人員id :proJbruserValue取出添加到新數組
            for (let i = 0; i < this.processNodelist.length; i++) {
                this.selectedUserlist.push(
                    this.processNodelist[i].proJbruserValue
                );
            }
            // 調用接口函數
            this.submitConfig();
        }
}

這次實現表格可編輯功能(select下拉框),主要有兩個注意點,一是v-model的綁定問題,而是:key的綁定問題;這次我的數據接口是通過id返回的不同數據源,可以借鑑上面代碼,如果你的(select下拉框)數據源是多個接口查詢而來,你需要在通過接口查詢到各個數據源,保存到data裏面,然後還要做一些改變:
1.將v-for循環的數據改成通過函數傳遞當前行數據(id):

<el-option v-for="item in getdatalist(scope.row) "> </el-option>

2.通過傳遞過來的id來判斷當前行需要返回的數據源;

getdatalist(row) {
    const id = row.nodeid;
    if ( id === '1') {
        return this.data1 
	} else if (id === '2') {
        return this.data2
	}
}

希望我的方法能給大家一些幫助和思路,最後有問題的朋友可以在下方評論一起交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章