記錄--開始使用Vue 3時應避免的10個錯誤

来源:https://www.cnblogs.com/smileZAZ/archive/2023/06/09/17469881.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 Vue 3 穩定已經有一段時間了。許多代碼庫正在生產中使用它,其他人最終也必須進行遷移。我有機會與它一起工作,並記錄了我的錯誤,這可能是你想避免的。 1.使用響應式助手聲明基本類型 數據聲明曾經很簡單,但現在有多個輔助工具可用。現在的一般 ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

Vue 3 穩定已經有一段時間了。許多代碼庫正在生產中使用它,其他人最終也必須進行遷移。我有機會與它一起工作,並記錄了我的錯誤,這可能是你想避免的。

1.使用響應式助手聲明基本類型

數據聲明曾經很簡單,但現在有多個輔助工具可用。現在的一般規則是:

  • 使用 reactive 代替 Object, Array, Map, Set
  • 使用 ref 代替 String, Number, Boolean

對於原始值使用響應式會導致警告,並且該值不會被設置為響應式:

/* DOES NOT WORK AS EXPECTED */
<script setup>
import { reactive } from "vue";

const count = reactive(0);
</script>

[Vue warn]: value cannot be made reactive

事例:codesandbox.io/s/jolly-ish…

矛盾的是,反過來卻行得通!例如,使用 ref 聲明 Array 將在內部調用 reactive

2.解構失去響應式值

讓我們想象一下,有一個具有計數器和一個按鈕以增加計數器的響應式對象。

<template>
  Counter: {{ state.count }}
  <button @click="add">Increase</button>
</template>

<script>
import { reactive } from "vue";
export default {
  setup() {
    const state = reactive({ count: 0 });

    function add() {
      state.count++;
    }

    return {
      state,
      add,
    };
  },
};
</script>
這個過程相當直接,也能如預期般工作,但你可能會想利用 JavaScript 的解構特性來進行下麵的操作。
/* DOES NOT WORK AS EXPECTED */
<template>
  <div>Counter: {{ count }}</div>
  <button @click="add">Increase</button>
</template>

<script>
import { reactive } from "vue";
export default {
  setup() {
    const state = reactive({ count: 0 });

    function add() {
      state.count++;
    }

    return {
      ...state,
      add,
    };
  },
};
</script>

1917575667-64715be19a793.gif

地址:codesandbox.io/s/gracious-…

代碼看起來一樣,根據我們以前的經驗,應該可以運行,但實際上,Vue 的反應性跟蹤是基於屬性訪問的。這意味著我們不能賦值或解構一個響應性對象,因為與第一個引用的響應性連接會丟失。這是使用 reactive helper 的限制之一。

3.對".value"屬性感到困惑

使用 ref 的怪癖之一可能很難適應。Ref 接受一個值並返回一個響應式對象。該值在對象內部在 .value 屬性下可用。

const count = ref(0)

console.log(count) // { value: 0 }
console.log(count.value) // 0

count.value++
console.log(count.value) // 1
但是在模板中使用時,引用會被解包, .value 不需要。
<script setup>
import { ref } from 'vue'

const count = ref(0)

function increment() {
  count.value++
}
</script>

<template>
  <button @click="increment">
    {{ count }} // no .value needed
  </button>
</template>
但請註意!解包(Unwrapping)只能在頂層屬性上有效。下麵的代碼片段將產生 [object Object]
// DON'T DO THIS
<script setup>
import { ref } from 'vue'

const object = { foo: ref(1) }

</script>

<template>
  {{ object.foo + 1 }}  // [object Object]
</template>

正確使用 ".value" 需要時間。儘管我偶爾會忘記它,但我發現我自己最初比需要的時候用得更頻繁。

4. Emitted Events

自 Vue 初始版本以來,子組件可以使用 emits 與父組件通信。只需要添加一個自定義監聽器來監聽事件即可。

this.$emit('my-event')

<my-component @my-event="doSomething" />
現在需要使用 defineEmits 巨集來聲明emits。
<script setup>
const emit = defineEmits(['my-event'])
emit('my-event')
</script>
記住的另一件事是,無論是 defineEmits 還是 defineProps (用於聲明props),都不需要導入。當使用 script setup. 時,它們會自動可用。
<script setup>
const props = defineProps({
  foo: String
})

const emit = defineEmits(['change', 'delete'])
// setup code
</script>

5.聲明額外選項

有一些 Options API 方法的屬性在 script setup 中不受支持。

  • name
  • inheritAttrs
  • 插件或庫需要的自定義選項

解決方案是在同一組件中定義兩個不同的腳本,如腳本設置RFC中所定義的那樣:

<script>
  export default {
    name: 'CustomName',
    inheritAttrs: false,
    customOptions: {}
  }
</script>

<script setup>
  // script setup logic
</script>

6.使用 Reactivity Transform

響應性轉換是 Vue 3 的一項實驗性但有爭議的特性,其目標是簡化聲明組件的方式。這個想法是利用編譯時轉換來自動解包 ref 並使 .value 變得過時。但現在已經被取消,並將在 Vue 3.3 中被移除。它仍然會以一個包的形式存在,但由於它不是 Vue 核心的一部分,所以最好不要在它上面投入時間。

7. 定義非同步組件

非同步組件以前是通過將它們包含在一個函數中來聲明的。

const asyncModal = () => import('./Modal.vue')
自 Vue 3 開始,非同步組件需要使用 defineAsyncComponent 輔助函數進行顯式定義:
import { defineAsyncComponent } from 'vue'

const asyncModal = defineAsyncComponent(() => import('./Modal.vue'))

8. 在模板中使用不必要的包裝器

在Vue 2中,組件模板需要一個單一的根元素,這有時會引入不必要的包裝器:

<!-- Layout.vue -->
<template>
  <div>
    <header>...</header>
    <main>...</main>
    <footer>...</footer>
  </div>
</template>
這不再是問題,因為現在支持多個根元素。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # 日誌分段切分條件 日誌分段文件切分包含以下4個條件,滿足其一即可: 1. 當前日誌分段文件的大小超過了broker端參數 `log.segment.bytes` 配置的值。`log.segment.bytes`參數的預設值為 `1073741824`,即1GB 2. 當前日誌分段中消息的最小時間 ...
  • 摘要:與伙伴一起,共建繁榮開放的GaussDB資料庫新生態。 本文分享自華為雲社區《華為雲新一代分散式資料庫GaussDB,給世界一個更優選擇》,作者:華為雲頭條。 6月7日,在華為全球智慧金融峰會2023上,華為常務董事、華為雲CEO張平安以“一切皆服務,做好金融數字化雲底座和使能器”為主題發表演 ...
  • 點擊查看代碼 ``` begin merge into ly_yjs_hxsj.T_XSGL_XSXX_CZRZ rz using ( select a.XS_ID xsid, xh, xm, '02' as bglx,'修改學生:'||xm||':學位操作撤銷學位證書號,原學位證書號:'|| BJ ...
  • 本文記錄 Mysql 分庫分表 和 Elasticsearch Join 查詢的實現思路,瞭解分散式場景數據處理的設計方案。文章從常用的關係型資料庫 MySQL 的分庫分表Join 分析,再到非關係型 ElasticSearch 來分析 Join 實現策略。逐步深入Join 的實現機制。 ...
  • > 芬達,《芬達的資料庫學習筆記》公眾號作者,開源愛好者,擅長 MySQL、ansible。 ## 背景 ### openEuler 是什麼 openEuler22.03 LTS 是 openEuler 社區於 2022 年 3 月發佈的開源操作系統(從系統版本的命名不難發現吧)。openEuler ...
  • es操作同一個索引里數據的複製語法 複製數據: POST _reindex { "source": { "index": "source_index" }, "dest": { "index": "destination_index" } } 欄位值修改: POST source_index/_up ...
  • 在Oracle 19c多租戶環境的PDB資料庫下麵創建一個DIRECTORY時,遇到了“ORA-65254: invalid path specified for the directory”,下麵簡單演示一下所遇到的這個案例 SQL> CREATE PLUGGABLE DATABASE PDB6  ...
  • 📝背景 公司高級表單組件ProForm高階組件都建立在jsx的運用配置上,項目在實踐落地過程中積累了豐富的經驗,也充分感受到了jsx語法的靈活便捷和可維護性強大,享受到了用其開發的樂趣,獨樂樂不如眾樂樂,為了幫助大家更好的運用jsx,開發提效,特此總結分享。 💎效果對比 以前 以往我們開發一個列 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...