element-ui表格組件el-table實現行編輯與新增功能

       element前端ui組件挺美觀的,我們也使用了他們的table組件,但是默認沒有提供行編輯功能,我們可以通過將table的每個單元格換成input框來巧妙實現。默認每個單元格就是一個template數據填充,不可編輯;我們可以在template裏面包裹一個input框來實現單元格可編輯;等每一個單元格都可編輯的時候,我們可以在每一行後面加一個按鈕來控制只可編輯當前行。

      先來看一下原始不可編輯的寫法:

<el-table width  :data="list"  element-loading-text="Loading"  border fit highlight-current-row>
      <el-table-column label="電話" width="260px" align="center">
        <template slot-scope="scope">
          {{ scope.row.tel }}
        </template>
      </el-table-column>
</el-table>

     再來看一下可編輯的寫法:

<el-table width  :data="list"  element-loading-text="Loading"  border fit highlight-current-row>

      <el-table-column label="序號"  type="index" width="50"></el-table-column>
      <el-table-column label="電話" width="350%" align="center">
        <template slot-scope="scope">
          <el-input v-model="scope.row.tel" :disabled="!scope.row.disabled"></el-input>
        </template>
      </el-table-column>
      <el-table-column label="地址" width="350%" align="center">
        <template slot-scope="scope">
          <el-input v-model="scope.row.address" :disabled="!scope.row.disabled"></el-input>
        </template>
      </el-table-column>

<!-- 此處省略了一些按鈕代碼,後面會講到-->

.................
  </el-table> 

      注意在每一個template元素裏面我都放了一個input元素,依然使用v-model綁定值,只不過加了一個disable屬性來控制是否可編輯;頁面初始化的時候,默認整個表格不可編輯,只有點擊了某一行後面的編輯按鈕以後,這一行纔可以編輯。

      由於在vue的精華與核心就是“數據綁定”,頁面上的幾乎所有屬性都可以通過數據來定義,所以我這裏採用將disable屬性定義在每一行的disable變量裏面,這樣點擊當前行的編輯按鈕時,只會改變當前行的編輯狀態。我們先來看一下上面改進後遺留的按鈕代碼:

<el-table-column align="center" label="操作" width="200%">
        <template slot-scope="scope">
          <el-button v-if="scope.row.edit" type="success" size="mini"
                     icon="el-icon-circle-check-outline" @click="confirmEdit(scope.row)">保存
          </el-button>
          <el-button v-else type="primary" size="mini"
                     @click="startEdit(scope.row)">編輯
          </el-button>
          <el-button v-if="scope.row.edit" class="cancel-btn" size="mini" icon="el-icon-refresh"
                     type="warning" @click="cancelEdit(scope.row)">取消
          </el-button>
          <!--<el-button type="danger" size="mini" @click="handleConfig(scope.row)">刪除</el-button>-->
        </template>
</el-table-column>

     我在每一行後面添加了一個“編輯”按鈕,當點擊編輯按鈕時,按鈕欄變爲保存和取消兩個按鈕;他們的狀態更換變量通過edit來定義實現

// 編輯

startEdit(row) {
      row.edit = !row.edit;
      row.disabled = true;
    },

// 保存
confirmEdit(row) {
      row.edit = false;
      row.originalValue = row.address;
      if (row.tel == null || row.address == null) {
        this.loadAppConfigs();
        return;
      }
      let name= this.params.name;
      const p = {...row, name};

      // 調用更新方法
      updateXXXXx(p);
      this.$message({
        message: '已修改!',
        type: 'success'
      });
      row.disabled = false;
      if (row.id === undefined) {
        // 重新加載該頁面
      }
},

    // 取消
cancelEdit(row) {
      row.address = row.originalValue;
      row.edit = false;
      row.disabled = false;
      this.$message({
        message: '已取消修改!',
        type: 'warning'
      });
      if (row.id === undefined) {

        // 重新加載該頁面
      }
    }

}

      表格綁定數據源data本身是一個數組,新增一行即是往數組中再添加一個元素,不過如果我們想新增一行時顯示在表格的第一行,那麼就要用到unshift方法,另外需要在新增一行時處於可編輯狀態,還要注意定義一個新行時的狀態變量值,因爲新增的是一個空輸入框,需要我們來輸入值,而不是一個默認值幫我們自動生成:

// 增加行
    addRow () {
      let newLine = {
        tel: this.tel,
        address: this.address,
        edit: true, // 新增時處於可編輯狀態,所以按鈕是保存和取消
        disabled: true // 打開編輯狀態
      };
      this.list.unshift(newLine); // 移到第一行
    },

     另外爲input框設置了disable屬性以後,當不可編輯時處於禁用狀態,此時文本字體顏色比較暗淡不清晰,看上去不美觀,我們的目的是不讓他編輯,但是依然需要正常顯示顏色,這種情況只能通過重新定義input的樣式來實現:

<style>
  input[disabled], input:disabled, input.disabled {
    color: #000000;
    -webkit-text-fill-color: #000000;
    -webkit-opacity: 1;
    opacity: 1;
    font-weight: 900;
  }
</style>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章