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

Vue 3 + Element Plus 封裝單列控制編輯的可編輯表格組件的方法

 更新時(shí)間:2024年09月11日 11:22:45   作者:前端學(xué)步  
在Web應(yīng)用開(kāi)發(fā)中實(shí)現(xiàn)表格數(shù)據(jù)編輯功能至關(guān)重要,本文將詳細(xì)介紹如何使用Vue3和ElementPlus庫(kù)來(lái)構(gòu)建一個(gè)支持單列編輯的表格組件,本教程詳細(xì)闡述了組件創(chuàng)建過(guò)程和數(shù)據(jù)綁定機(jī)制,幫助你快速掌握Vue3中表格編輯功能的實(shí)現(xiàn),感興趣的朋友一起看看吧

在Web應(yīng)用開(kāi)發(fā)中,經(jīng)常需要提供表格數(shù)據(jù)的編輯功能。本文將介紹如何使用Vue 3結(jié)合Element Plus庫(kù)來(lái)實(shí)現(xiàn)一個(gè)支持單列控制編輯功能的表格,并通過(guò)封裝組件的形式提高代碼的復(fù)用性。通過(guò)本教程,你將學(xué)會(huì)如何構(gòu)建一個(gè)具備單列控制編輯功能的表格組件,并在表單提交時(shí)保存更改。

目標(biāo)

  • 實(shí)現(xiàn)一個(gè)基本的表格,其中包含日期、名稱和描述等列。
  • 表格中的每一項(xiàng)都可以在點(diǎn)擊編輯圖標(biāo)后進(jìn)入編輯模式。
  • 編輯模式下可以修改表格單元格的內(nèi)容。
  • 編輯完成后,可以通過(guò)失去焦點(diǎn)的方式提交更改。
  • 支持單列控制編輯,即可以單獨(dú)控制每一列表格單元格的編輯狀態(tài)。
  • 封裝成可復(fù)用的組件,便于在其他項(xiàng)目中使用。

創(chuàng)建表格組件

我們將創(chuàng)建一個(gè)主組件App.vue和一個(gè)子組件EditableCell.vue來(lái)實(shí)現(xiàn)表格的編輯功能。

主組件 App.vue

<template>
    <div class="table-layout">
      <el-table :data="tableData">
        <el-table-column type="index" label="序號(hào)" width="60" />
        <el-table-column prop="id" label="ID" width="80" />
        <el-table-column prop="date" label="日期">
          <template #default="scope">
            <EditableCell
              :cell-data="scope.row.date"
              :is-editing="scope.row.isEditDate"
              :column="scope.column.property"
              :row="scope.row"
              @toggleEdit="toggleEdit"
              @applyChanges="applyChanges"
            />
          </template>
        </el-table-column>
        <el-table-column prop="name" label="名稱">
          <template #default="scope">
            <EditableCell
              :cell-data="scope.row.name"
              :is-editing="scope.row.isEditName"
              :column="scope.column.property"
              :row="scope.row"
              @toggleEdit="toggleEdit"
              @applyChanges="applyChanges"
            />
          </template>
        </el-table-column>
        <el-table-column prop="description" label="描述">
          <template #default="scope">
            <EditableCell
              :cell-data="scope.row.description"
              :is-editing="scope.row.isEditDescription"
              :column="scope.column.property"
              :row="scope.row"
              @toggleEdit="toggleEdit"
              @applyChanges="applyChanges"
            />
          </template>
        </el-table-column>
      </el-table>
    </div>
  </template>
  <script setup>
  import { ref } from 'vue';
  import EditableCell from './EditableCell.vue'; // 確保路徑正確
  import { ElTable, ElTableColumn, ElInput, ElIcon } from 'element-plus';
  import { Edit } from '@element-plus/icons-vue';
  // 優(yōu)化后的tableData
  const tableData = ref([
    {
      id: 1,
      date: '2024-08-01',
      name: '項(xiàng)目A',
      description: '這是一個(gè)關(guān)于項(xiàng)目A的描述',
      isEditDate: false,
      isEditName: false,
      isEditDescription: false
    },
    {
      id: 2,
      date: '2024-08-15',
      name: '項(xiàng)目B',
      description: '這是一個(gè)關(guān)于項(xiàng)目B的描述',
      isEditDate: false,
      isEditName: false,
      isEditDescription: false
    },
    {
      id: 3,
      date: '2024-09-01',
      name: '項(xiàng)目C',
      description: '這是一個(gè)關(guān)于項(xiàng)目C的描述',
      isEditDate: false,
      isEditName: false,
      isEditDescription: false
    }
  ]);
  function toggleEdit(column, row) {
    if (column && row) {
      const editKey = `isEdit${column.charAt(0).toUpperCase() + column.slice(1)}`;
      row[editKey] = !row[editKey];
    }
  }
  function applyChanges(newValue, column, row) {
    if (column && row) {
      row[column] = newValue;
      const editKey = `isEdit${column.charAt(0).toUpperCase() + column.slice(1)}`;
      row[editKey] = false;
    }
  }
  </script>
  <style scoped>
  .table-layout {
    width: 60%;
    margin: 60px auto;
  }
  .edit-icon {
    margin: 10px 0 0 10px;
  }
  </style>

子組件 EditableCell.vue

<template>
  <div>
    <span v-if="!isEditing">{{ displayData }}</span>
    <el-input
      v-else
      v-model="displayData"
      style="width: 120px;"
      @blur="onBlur"
    />
    <el-icon color="#409EFF" class="edit-icon" @click="onToggleEdit">
      <Edit />
    </el-icon>
  </div>
</template>
<script>
export default {
  name: 'EditableCell',
 props: ['cellData', 'isEditing', 'column', 'row'], // 添加row屬性
  emits: ['toggleEdit', 'applyChanges'],
  data() {
    return {
      displayData: this.cellData
    };
  },
  watch: {
    cellData(newVal) {
      this.displayData = newVal;
    }
  },
  methods: {
    onToggleEdit() {
      this.$emit('toggleEdit', this.column, this.row); // 傳遞column和row
    },
    onBlur() {
      this.$emit('applyChanges', this.displayData, this.column, this.row); // 傳遞column和row
    }
  }
}
</script>
<style scoped>
.edit-icon {
  margin: 10px 0 0 10px;
}
</style>

說(shuō)明

子組件 (EditableCell.vue):

  • 使用內(nèi)部狀態(tài)displayData來(lái)存儲(chǔ)編輯時(shí)的值,并通過(guò)watch確保它與cellData同步。
  • 在模板中,根據(jù)編輯狀態(tài)顯示不同的內(nèi)容。
  • onBlur方法中提交更改,并正確調(diào)用applyChanges方法。

父組件 (App.vue):

  • 在模板中,通過(guò)scope.column.property獲取列的屬性名稱,并將其傳遞給子組件。
  • 在模板中,通過(guò)scope.row將行數(shù)據(jù)傳遞給子組件。
  • toggleEdit方法中,通過(guò)構(gòu)造的editKey來(lái)切換編輯狀態(tài)。
  • applyChanges方法中,通過(guò)構(gòu)造的editKey來(lái)更新編輯狀態(tài),并保存新值。

通過(guò)這種方式,我們實(shí)現(xiàn)了表格的編輯功能,并確保了編輯狀態(tài)下數(shù)據(jù)的正確提交。

總結(jié)

本文介紹了如何使用Vue 3和Element Plus實(shí)現(xiàn)一個(gè)帶有編輯功能的表格。通過(guò)本文的步驟,你可以輕松地在自己的項(xiàng)目中實(shí)現(xiàn)類似的表格編輯功能。希望這篇教程對(duì)你有所幫助!

到此這篇關(guān)于Vue 3 + Element Plus 封裝單列控制編輯的可編輯表格組件的文章就介紹到這了,更多相關(guān)Vue 3 Element Plus 編輯表格組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue中的ref/reactive區(qū)別及原理解析

    vue中的ref/reactive區(qū)別及原理解析

    Vue中的ref和reactive是兩種不同的數(shù)據(jù)響應(yīng)式管理方式,通過(guò)ref創(chuàng)建的響應(yīng)式對(duì)象在訪問(wèn)和修改時(shí)會(huì)自動(dòng)觸發(fā)重新渲染,本文給大家介紹vue中的ref/reactive區(qū)別及原理解析,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • vue如何實(shí)現(xiàn)本項(xiàng)目頁(yè)面之間跳轉(zhuǎn)

    vue如何實(shí)現(xiàn)本項(xiàng)目頁(yè)面之間跳轉(zhuǎn)

    這篇文章主要介紹了vue如何實(shí)現(xiàn)本項(xiàng)目頁(yè)面之間跳轉(zhuǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue+Openlayers自定義軌跡動(dòng)畫(huà)

    Vue+Openlayers自定義軌跡動(dòng)畫(huà)

    這篇文章主要為大家詳細(xì)介紹了Vue+Openlayers自定義軌跡動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • vue2 vue3中使用Echarts詳細(xì)

    vue2 vue3中使用Echarts詳細(xì)

    這篇文章主要給大家介紹的是vue2 vue3中使用Echarts的相關(guān)資料,下面文章 會(huì)詳細(xì)介紹該內(nèi)容,感興趣的小伙伴不要錯(cuò)過(guò)喲
    2021-09-09
  • vue 數(shù)據(jù)操作相關(guān)總結(jié)

    vue 數(shù)據(jù)操作相關(guān)總結(jié)

    這篇文章主要介紹了vue 數(shù)據(jù)操作的相關(guān)資料,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2020-12-12
  • Vue Router深扒實(shí)現(xiàn)原理

    Vue Router深扒實(shí)現(xiàn)原理

    在看這篇文章的幾點(diǎn)要求:需要你先知道Vue-Router是個(gè)什么東西,用來(lái)解決什么問(wèn)題,以及它的基本使用。如果你還不懂的話,建議上官網(wǎng)了解下Vue-Router的基本使用后再回來(lái)看這篇文章
    2022-09-09
  • Vue中Pinia狀態(tài)管理的四大實(shí)戰(zhàn)場(chǎng)景指南

    Vue中Pinia狀態(tài)管理的四大實(shí)戰(zhàn)場(chǎng)景指南

    Pinia 是 Vue 官方推薦的狀態(tài)管理庫(kù),這篇文章主要為大家詳細(xì)介紹了Vue中Pinia狀態(tài)管理的四大實(shí)戰(zhàn)場(chǎng)景,感興趣的小伙伴可以了解一下
    2025-10-10
  • vue2.0 自定義日期時(shí)間過(guò)濾器

    vue2.0 自定義日期時(shí)間過(guò)濾器

    本文給大家?guī)?lái)兩種方法實(shí)現(xiàn)vue2.0 自定義日期時(shí)間過(guò)濾器,需要的的朋友參考下吧
    2017-06-06
  • Vue3+Element?Plus實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁(yè)以及右鍵菜單功能

    Vue3+Element?Plus實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁(yè)以及右鍵菜單功能

    這篇文章主要給大家介紹了關(guān)于Vue3+Element?Plus實(shí)現(xiàn)動(dòng)態(tài)標(biāo)簽頁(yè)以及右鍵菜單功能的相關(guān)資料,Vue?3和Element?Plus提供了一種簡(jiǎn)單的方法來(lái)實(shí)現(xiàn)側(cè)邊菜單欄與標(biāo)簽頁(yè)之間的聯(lián)動(dòng),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Vue使用openlayers加載天地圖

    Vue使用openlayers加載天地圖

    這篇文章主要為大家詳細(xì)介紹了Vue如何使用openlayers加載天地圖,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下
    2024-02-02

最新評(píng)論

丰城市| 盐亭县| 铜鼓县| 淮安市| 开平市| 汕尾市| 荆门市| 什邡市| 南和县| 堆龙德庆县| 广安市| 德昌县| 马山县| 邯郸县| 澄迈县| 光泽县| 景宁| 蚌埠市| 昌吉市| 大港区| 乐昌市| 定日县| 葫芦岛市| 介休市| 定远县| 双鸭山市| 宁波市| 庆安县| 延庆县| 会泽县| 和田市| 安顺市| 南木林县| 麻栗坡县| 宜宾县| 海安县| 金沙县| 临清市| 弥勒县| 安福县| 呈贡县|