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

Vue如何優(yōu)雅地復(fù)制一行帶附件的表格數(shù)據(jù)

 更新時間:2025年09月15日 10:17:51   作者:網(wǎng)羅開發(fā)  
在做 Vue 項目的時候,大家是不是經(jīng)常遇到這樣的需求,點一下復(fù)制按鈕,把這行表格數(shù)據(jù)復(fù)制一份放在下方,除了附件字段之外其他都保留,所以本文我們就來看看如何優(yōu)雅地復(fù)制一行帶附件的數(shù)據(jù),不破壞原始數(shù)據(jù)結(jié)構(gòu)吧

前言

在做 Vue 項目的時候,大家是不是經(jīng)常遇到這樣的需求:

“點一下復(fù)制按鈕,把這行表格數(shù)據(jù)復(fù)制一份放在下方,除了附件字段之外其他都保留。”

聽起來簡單?但一不小心就會踩到“對象引用”的大坑 —— 你以為復(fù)制的是一份新數(shù)據(jù),結(jié)果卻把原來的數(shù)據(jù)也一塊改了,尤其是像 poFile 這樣的附件字段,本來是保留原數(shù)據(jù),現(xiàn)在全被你“順手”置空了。

這篇文章就來聊聊:如何優(yōu)雅地復(fù)制一行帶附件的數(shù)據(jù),不破壞原始數(shù)據(jù)結(jié)構(gòu)?

需求背景與常見問題

我們有一個表格,每一行代表一個訂單物料。每一行可能有個附件字段 poFile,類型是數(shù)組,像這樣:

{
  id: 'row-1',
  name: '電容',
  amount: 10,
  poFile: [{ name: '報價單.pdf', url: '...' }]
}

現(xiàn)在我們要做一個“復(fù)制”功能:

  • 把這行數(shù)據(jù)原樣復(fù)制;
  • 附件字段 poFile 需要置空;
  • 原始數(shù)據(jù)不受影響。

于是很多同學(xué)很自然地寫了這樣一段邏輯:

const tableobj = dataList.value[index]
tableobj.poFile = [] // 清空附件
dataList.value.splice(index + 1, 0, cloneDeep(tableobj))

表面上看沒問題,但運行完你會發(fā)現(xiàn):原始那一行的 poFile 也被清空了!

為什么?因為你直接修改了原始對象的引用。

背后的 JS 原理小科普:對象是“引用類型”

在 JavaScript 里,對象是引用類型。當(dāng)你執(zhí)行:

const tableobj = dataList.value[index]

其實 tableobjdataList.value[index] 指向的是同一個對象地址。

所以當(dāng)你:

tableobj.poFile = []

其實也就等于把 dataList.value[index].poFile 清空了。

正確做法:用 cloneDeep 深拷貝新對象

解決這個問題的方法很簡單:

修改前先 cloneDeep 一份副本,所有的“清空字段”都操作副本,原始對象不動。

我們來重寫一下邏輯,分為兩種場景處理:普通復(fù)制 和 合并單元格模式復(fù)制。

Demo 代碼模塊

import cloneDeep from 'lodash/cloneDeep'

const copyData = (record, index) => {
  let tableobj
  if (props.isMergeCells) {
    const curIndex = dataList.value.findIndex(items => {
      return items.some(item => item.groupId === record.groupId)
    })

    const groupId = generateUUID()
    // cloneDeep 是關(guān)鍵
    tableobj = cloneDeep(dataList.value[curIndex]).map(item => {
      item.id = generateUUID()
      item.groupId = groupId
      item.overLimitApproval = ''
      item.poFile = [] // 附件置空
      return item
    })
    dataList.value.splice(curIndex + 2, 0, ...tableobj, initTotalRow(groupId))
  } else {
    const originalRow = dataList.value[index]
    if (originalRow) {
      const copyRow = cloneDeep(originalRow)
      if (copyRow?.id) {
        delete copyRow.id
        copyRow.groupId = generateUUID()
        copyRow.overLimitApproval = ''
        copyRow.poFile = [] // 清空附件
        dataList.value.splice(index, 0, copyRow)
      }
    }
  }

  emit('edit', { key: 'amount' })
}

拆解講講:為啥這段代碼能解決問題

cloneDeep 是靈魂

lodash/cloneDeep 是做深拷貝的神器,它可以遞歸復(fù)制對象中的每一層結(jié)構(gòu),確保你拿到的是一個“全新”的副本。

const copyRow = cloneDeep(originalRow)

這一行就保證了:你對 copyRow 的任何改動,都不會影響原始 originalRow。

清空 poFile 的方式建議用[]而不是''

附件字段通常是數(shù)組,代表可能有多個上傳文件。如果你把它清空成 ''

copyRow.poFile = ''

雖然能通過某些后端校驗,但可能會導(dǎo)致前端的 v-modelel-upload 報錯。

建議統(tǒng)一使用:

copyRow.poFile = []

更符合結(jié)構(gòu)預(yù)期,也方便后續(xù)前端判斷文件上傳是否為空。

更進(jìn)一步:提取清理邏輯為復(fù)用函數(shù)

如果將來要清空的字段不止 poFileoverLimitApproval,可以提取成一個統(tǒng)一的清理函數(shù):

function resetCopyFields(row) {
  row.poFile = []
  row.overLimitApproval = ''
  // 其他字段...
  return row
}

調(diào)用時只需要:

resetCopyFields(copyRow)

讓邏輯更清晰,也更方便維護。

實際場景舉例:審批單據(jù)、銷售訂單、費用報銷

這種“復(fù)制數(shù)據(jù)行但清空部分字段”的需求在很多系統(tǒng)里都有,比如:

  • 審批系統(tǒng):復(fù)制上次填寫的數(shù)據(jù),但需要清空附件和備注;
  • 銷售訂單:客戶下單的某個產(chǎn)品需要復(fù)制行修改數(shù)量,附件不帶;
  • 報銷系統(tǒng):上個月差旅報銷復(fù)制,但要重新上傳票據(jù)。

這些場景下,如果不小心用了原始對象引用去處理,一不小心就把原始數(shù)據(jù)也改壞了,影響用戶體驗。

總結(jié)

本文通過一個簡單的復(fù)制邏輯,講清了一個非常常見但又容易忽略的問題 —— 引用對象修改導(dǎo)致原數(shù)據(jù)被篡改。

最后送上一句話:

只要是對象類型數(shù)據(jù),就別相信“復(fù)制了就是新的”這件事,除非你用 cloneDeep!

到此這篇關(guān)于Vue如何優(yōu)雅地復(fù)制一行帶附件的表格數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Vue復(fù)制表格數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3中使用ref標(biāo)簽對組件進(jìn)行操作方法

    Vue3中使用ref標(biāo)簽對組件進(jìn)行操作方法

    這篇文章主要介紹了Vue3中使用ref標(biāo)簽對組件進(jìn)行操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • vue vue-Router默認(rèn)hash模式修改為history需要做的修改詳解

    vue vue-Router默認(rèn)hash模式修改為history需要做的修改詳解

    今天小編就為大家分享一篇vue vue-Router默認(rèn)hash模式修改為history需要做的修改詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Vue-Ant Design Vue-普通及自定義校驗實例

    Vue-Ant Design Vue-普通及自定義校驗實例

    這篇文章主要介紹了Vue-Ant Design Vue-普通及自定義校驗實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • vue中深度選擇器圖文詳解

    vue中深度選擇器圖文詳解

    在Vue的開發(fā)中,我們經(jīng)常會用到外部組件庫,下面這篇文章主要給大家介紹了關(guān)于vue中深度選擇器的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • vue3使用vis繪制甘特圖制作timeline可拖動時間軸及時間軸中文化(推薦)

    vue3使用vis繪制甘特圖制作timeline可拖動時間軸及時間軸中文化(推薦)

    這篇文章主要介紹了vue3使用vis繪制甘特圖制作timeline可拖動時間軸,時間軸中文化,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • Vue實現(xiàn)路由守衛(wèi)的示例代碼

    Vue實現(xiàn)路由守衛(wèi)的示例代碼

    Vue路由守衛(wèi)是控制頁面導(dǎo)航的鉤子函數(shù),主要用于鑒權(quán)、數(shù)據(jù)預(yù)加載等場景,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • 詳解Vue如何將多個空格被合并顯示成一個空格

    詳解Vue如何將多個空格被合并顯示成一個空格

    這篇文章主要為大家詳細(xì)介紹了在Vue中如何將多個空格被合并顯示成一個空格,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Element的穿梭框數(shù)據(jù)量大時點擊全選卡頓的解決方案

    Element的穿梭框數(shù)據(jù)量大時點擊全選卡頓的解決方案

    本文主要介紹了Element的穿梭框數(shù)據(jù)量大時點擊全選卡頓的解決方案,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • vue左側(cè)菜單,樹形圖遞歸實現(xiàn)代碼

    vue左側(cè)菜單,樹形圖遞歸實現(xiàn)代碼

    這篇文章主要介紹了vue左側(cè)菜單,樹形圖遞歸實現(xiàn)代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • vue的一個分頁組件的示例代碼

    vue的一個分頁組件的示例代碼

    本篇文章主要介紹了vue的一個分頁組件的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12

最新評論

凤台县| 行唐县| 称多县| 巫溪县| 梓潼县| 崇州市| 崇明县| 青州市| 襄城县| 高唐县| 邹城市| 凤凰县| 巴林右旗| 罗田县| 成武县| 新丰县| 稻城县| 洱源县| 青海省| 利津县| 咸丰县| 方正县| 晋江市| 佳木斯市| 南召县| 连云港市| 漳浦县| 平利县| 江安县| 阿尔山市| 监利县| 安新县| 邵武市| 益阳市| 藁城市| 商丘市| 广宁县| 嘉义市| 龙岩市| 吴川市| 云安县|