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

從Vue2升級Vue3過程中遇到作用域插槽語法變更問題的解決方法

 更新時間:2026年02月12日 09:53:32   作者:愛看星星的豬_  
在將項目從 Vue 2 升級到 Vue 3 的過程中,遇到了兩處典型的兼容性問題,主要涉及 作用域插槽語法變更 和 響應(yīng)式數(shù)據(jù)類型處理差異,本文通過具體代碼示例,說明問題原因、Vue 版本機制差異,并給出推薦改法,需要的朋友可以參考下

一、問題代碼片段及功能說明

場景 1:表格中動態(tài)字段的樣式與標(biāo)題控制(輸入框)

<!-- Vue 2 原始寫法 -->
<template slot-scope="scope">
  <el-input-number
    :class="{ 'text-red': originTableDataCopy[scope.$index]['EXT_FIELD' + (firstChidIndex + 1)]?.split('?')[1] !== 'null' }"
    :title="originTableDataCopy[scope.$index]['EXT_FIELD' + (firstChidIndex + 1)]?.split('?')[1] || ''"
    v-model="scope.row['EXT_FIELD' + (firstChidIndex + 1)]"
  />
</template>

功能說明

  • 根據(jù)字段值是否包含 ?error 形式的后綴(如 "100?超限"),決定是否顯示紅色樣式;
  • title 顯示錯誤信息(即 ? 后的內(nèi)容);
  • 使用 v-model 雙向綁定當(dāng)前行的擴展字段。

場景 2:更復(fù)雜的動態(tài)字段名與條件渲染

<!-- Vue 2 原始寫法 -->
<template slot-scope="scope">
  <el-input-number
    :class="{ 'text-red': 
      loanAccounttype === 'issued' &&
      originTableDataCopy[scope.$index]['EXT_FIELD.' + firstChid.functFldEnNm + (index + 1)]?.split('?')[1] &&
      originTableDataCopy[scope.$index]['EXT_FIELD.' + firstChid.functFldEnNm + (index + 1)]?.split('?')[1] !== 'null'
    }"
    v-model="scope.row['EXT_FIELD.' + firstChid.functFldEnNm + (index + 1)]"
    v-if="!secondChid.name?.includes('參考值')"
  />
  <span v-else>{{ scope.row['REF_VALUE_0'] }}...</span>
</template>

功能說明

  • 字段名由多個變量拼接生成(如 EXT_FIELD.income1);
  • 僅當(dāng) loanAccounttype === 'issued' 且字段包含非 'null' 錯誤信息時,標(biāo)紅;
  • 若字段為“參考值”,則不顯示輸入框,改用文本展示。

二、Vue 2 與 Vue 3 的機制差異

維度Vue 2Vue 3
作用域插槽語法<template slot-scope="scope"><template #default="{ row, $index }">
插槽參數(shù)scope 是對象,含 row, $index 等屬性直接解構(gòu) { row, $index }$index 仍可用但非必須
$index 是否存在? 存在? 存在(作為默認(rèn)屬性),但不再通過 scope.$index 訪問
響應(yīng)式代理方式Object.defineProperty + __ob__Proxy 包裝,控制臺顯示為 Proxy(Array)
數(shù)據(jù)訪問建議可通過 data[index]scope.row強烈推薦直接使用 row,避免依賴外部數(shù)組索引

關(guān)鍵變化
Vue 3 中 slot-scope 已廢棄,且雖然 $index 仍可解構(gòu)使用,但只要用不到索引,就不應(yīng)引入。更重要的是,row 就是當(dāng)前行的真實引用,等價于 originTableDataCopy[$index],且更安全。

三、遷移后的正確寫法(Vue 3 兼容)

改造原則:

  1. 使用 #default="{ row }" 替代 slot-scope="scope"
  2. row['xxx'] 替代 originTableDataCopy[scope.$index]['xxx']
  3. 添加 typeof ... === 'string' 防御性判斷,避免 .split() 報錯

示例:場景 2 的 Vue 3 安全寫法

<template #default="{ row }">
  <el-input-number
    type="number"
    :controls="false"
    :class="{
      'text-red':
        loanAccounttype === 'issued' &&
        typeof row['EXT_FIELD.' + firstChid.functFldEnNm + (index + 1)] === 'string' &&
        row['EXT_FIELD.' + firstChid.functFldEnNm + (index + 1)].split('?')[1] &&
        row['EXT_FIELD.' + firstChid.functFldEnNm + (index + 1)].split('?')[1] !== 'null'
    }"
    :title="
      loanAccounttype === 'issued' &&
      typeof row['EXT_FIELD.' + firstChid.functFldEnNm + (index + 1)] === 'string' &&
      row['EXT_FIELD.' + firstChid.functFldEnNm + (index + 1)].split('?')[1]
        ? row['EXT_FIELD.' + firstChid.functFldEnNm + (index + 1)].split('?')[1]
        : ''
    "
    v-model="row['EXT_FIELD.' + firstChid.functFldEnNm + (index + 1)]"
    v-if="originTableDataCopy.length > 0 && editable && !secondChid.name?.includes('參考值')"
  />
  <el-input-number
    v-else-if="!secondChid.name?.includes('參考值')"
    type="number"
    :controls="false"
    v-model="row['EXT_FIELD.' + firstChid.functFldEnNm + (index + 1)]"
  />
  <span class="text-red" v-else>
    {{ 
      row['REF_VALUE_0'] + 
      (secondChid.twolvlClsf?.includes('輕度') ? '1' : 
       secondChid.twolvlClsf?.includes('中度') ? '2' : '3')
    }}
  </span>
</template>

關(guān)鍵改進:

  • 移除 scope.$index,使用 row 直接訪問;
  • 添加 typeof ... === 'string' 防止 .split() 在非字符串上調(diào)用;
  • 保留業(yè)務(wù)邏輯不變,提升健壯性。

四、總結(jié)與最佳實踐

問題類型Vue 2 寫法Vue 3 推薦寫法原因
作用域插槽slot-scope="scope"#default="{ row }"語法標(biāo)準(zhǔn)化,更簡潔
行數(shù)據(jù)訪問originTableDataCopy[scope.$index]row更安全,避免索引錯位
類型安全無防御typeof val === 'string'防止 .split() 在 number/null 上調(diào)用
布爾表達式cond ? true : false直接用 cond冗余,JS 表達式本身即布爾值

最佳實踐建議:

  1. 永遠優(yōu)先使用 row 而非 data[index]:它更可靠,不受數(shù)組變更影響;
  2. .split(), .replace() 等字符串方法做類型檢查;
  3. 避免 JSON.parse(JSON.stringify()) 深拷貝,改用 structuredClone{...} + map;
  4. 按需解構(gòu)插槽參數(shù):不用 $index 就不要寫它。

以上就是從Vue2升級Vue3過程中遇到作用域插槽語法變更問題的解決方法的詳細內(nèi)容,更多關(guān)于Vue2升級Vue3作用域插槽語法變更的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 完美解決iview 的select下拉框選項錯位的問題

    完美解決iview 的select下拉框選項錯位的問題

    下面小編就為大家分享一篇完美解決iview 的select下拉框選項錯位的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • Vue遞歸實現(xiàn)樹形菜單方法實例

    Vue遞歸實現(xiàn)樹形菜單方法實例

    學(xué)習(xí)vue有一段時間了,最近使用vue做了一套后臺管理系統(tǒng),其中使用最多就是遞歸組件,下面這篇文章主要給大家介紹了關(guān)于Vue利用遞歸實現(xiàn)樹形菜單的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-11-11
  • vue 實現(xiàn)移動端鍵盤搜索事件監(jiān)聽

    vue 實現(xiàn)移動端鍵盤搜索事件監(jiān)聽

    今天小編就為大家分享一篇vue 實現(xiàn)移動端鍵盤搜索事件監(jiān)聽,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Vue3使用路由VueRouter4的簡單示例

    Vue3使用路由VueRouter4的簡單示例

    在vue.js項目中使用vue-router,可以使用路由進行界面或路徑跳轉(zhuǎn),下面這篇文章主要給大家介紹了關(guān)于Vue3使用路由VueRouter4的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-07-07
  • iview實現(xiàn)動態(tài)表單和自定義驗證時間段重疊

    iview實現(xiàn)動態(tài)表單和自定義驗證時間段重疊

    這篇文章主要介紹了iview實現(xiàn)動態(tài)表單和自定義驗證時間段重疊,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • vue實現(xiàn)拖拽的簡單案例 不超出可視區(qū)域

    vue實現(xiàn)拖拽的簡單案例 不超出可視區(qū)域

    這篇文章主要為大家詳細介紹了vue實現(xiàn)拖拽的簡單案例,不超出可視區(qū)域,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Vue3框架使用報錯以及解決方案

    Vue3框架使用報錯以及解決方案

    這篇文章主要介紹了Vue3框架使用報錯以及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 詳解Vue方法與事件

    詳解Vue方法與事件

    本篇文章主要介紹了詳解Vue方法與事件。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Vue3?源碼解讀之?Teleport?組件使用示例

    Vue3?源碼解讀之?Teleport?組件使用示例

    這篇文章主要為大家介紹了Vue3?源碼解讀之?Teleport?組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Vue3導(dǎo)出pdf文件詳細方案

    Vue3導(dǎo)出pdf文件詳細方案

    這篇文章主要給大家介紹了關(guān)于Vue3導(dǎo)出pdf文件的相關(guān)資料,最近項目有個需求,將系統(tǒng)統(tǒng)計的數(shù)據(jù)生成分析報告,然后可以導(dǎo)出成PDF,這里給大家總結(jié)下,需要的朋友可以參考下
    2023-08-08

最新評論

甘孜县| 凯里市| 婺源县| 莱阳市| 游戏| 青州市| 新乡市| 工布江达县| 阳泉市| 巢湖市| 莒南县| 上高县| 独山县| 阳朔县| 海晏县| 曲沃县| 交城县| 图片| 苏尼特右旗| 巴东县| 泰安市| 利川市| 衢州市| 肇东市| 松阳县| 米泉市| 定安县| 龙泉市| 白水县| 南江县| 平邑县| 和田市| 东明县| 新绛县| 万宁市| 故城县| 平舆县| 黑龙江省| 山丹县| 峡江县| 宽甸|