0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Vue3時(shí)遇到的一些問題

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 2023-09-13 10:16 ? 次閱讀

來源| OSCHINA 社區(qū)

作者 |葡萄城技術(shù)團(tuán)隊(duì)

Vue3 目前已經(jīng)趨于穩(wěn)定,不少代碼庫都已經(jīng)開始使用它,很多項(xiàng)目未來也必然要遷移至 Vue3。本文記錄我在使用 Vue3 時(shí)遇到的一些問題,希望能為其他開發(fā)者提供幫助。

1.使用 reactive 封裝基礎(chǔ)數(shù)據(jù)類型

傳統(tǒng)開發(fā)模式中,數(shù)據(jù)聲明很簡單。但是在 Vue 中有多個響應(yīng)式變量聲明方式,整體的使用規(guī)則如下:

使用 reactive 來封裝 Object,Array,Map,Set 數(shù)據(jù)類型;

使用 ref 封裝 String,Number,Boolean 類型。

如果使用 reactive 來封裝基礎(chǔ)數(shù)據(jù)類型,會產(chǎn)生警告,同時(shí)封裝的值不會成為響應(yīng)式對象。



但是,可以使用 ref 來封裝 Object、Array 等數(shù)據(jù)類型,內(nèi)部會調(diào)用 reactive。

2.解構(gòu) reactive 對象

下面代碼中,count 封裝成了 reactive 對象,點(diǎn)擊按鈕時(shí),count 會自增。



 

如果需要使用 ES6 結(jié)構(gòu)賦值對 state 進(jìn)行結(jié)構(gòu),需要使用如下的代碼:




結(jié)構(gòu)復(fù)制完成之后,點(diǎn)擊按鈕,效果如下: 代碼看起來比較相似,而且根據(jù)以前的表現(xiàn),邏輯是可以正常執(zhí)行的。但事實(shí)上,Vue 的響應(yīng)式追蹤通過屬性獲取,這意味著我們不能去解構(gòu)響應(yīng)式對象,會導(dǎo)致引用連接丟失。這是響應(yīng)式代理的限制之一。

3.使用.value 造成的困惑

Ref 接受一個值并返回一個響應(yīng)式對象,該值只有在內(nèi)部對象.value 屬性下可用。
const count = ref(0)

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

 count.value++
 console.log(count.value) // 1

但是 ref 如果應(yīng)用在 template 中,不需要對 ref 進(jìn)行解包,也就是不需要使用.vue。




需要注意的是,解包只作用于一級屬性,下邊的代碼會返回 [object Object]



正確使用.value 需要時(shí)間,初學(xué)者偶爾會忘記它。在使用時(shí),要注意只在合適的場景下使用它。

4.Emitted 事件

從 Vue 發(fā)布以來,子組件可以通過 emits 與父組件通信,只需要添加一個自定義的監(jiān)聽器來監(jiān)聽事件即可。
this.$emit('my-event')

Vue3 中,需要使用編譯器宏 defineEmits 來聲明 emits。
const emit = defineEmits(['my-event'])
 emit('my-event')
 

在 setup 語法糖下,defineEmits 和 defineProps 會被自動引入。其它情況下,需要主動引入。


最后,由于 Vue3 中,事件必須聲明,因此再需要使用.native 修飾符,該修飾符已被移除。

5. 聲明組件選項(xiàng)

setup 不支持如下組件選項(xiàng)聲明:

name

inheritAttrs

customOptions

如果需要繼續(xù)使用這些屬性,可以聲明多個 script 腳本,如下所示:





6. 使用 Reactivity Transform

Reactivity Transform 是 Vue3 中一個預(yù)覽屬性,有一定的爭議性,默認(rèn)是禁用的。它主要用來簡化組件的聲明方式。這個想法是利用編譯時(shí)轉(zhuǎn)換來自動解包 ref,從而避免使用.value。從 Vue3.3 中已經(jīng)刪除該功能,作為一個擴(kuò)展包提供。由于它不是 Vue 的核心部分,且目前風(fēng)險(xiǎn)還是比較多,建議先不要在此方面投入太多事件。

7.定義異步組件

異步組件以前是通過將它們包含在方法中來聲明的。
const asyncModal = () => import('./Modal.vue')

Vue3 中需要使用 defineAsyncComponent 來聲明異步組件。

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

8.template 中使用不必要的包裝元素

 

Vue3 中支持多個根元素,不再需要使用外層 div 元素包裹。



9.生命周期函數(shù)

所有組件生命周期函數(shù)都通過添加 on 前綴或完全更名實(shí)現(xiàn),下圖詳細(xì)列出了具體的變化:7e6d476c-5160-11ee-a25d-92fbcf53809c.png

10.產(chǎn)品文檔

官方對文檔已經(jīng)做了更新,補(bǔ)充更新了 API,并包含很多有價(jià)值的注釋、指南和最佳實(shí)踐。即使你現(xiàn)在使用的是 Vue2,通過閱讀新的文檔也會學(xué)到一些新知識。 總結(jié) 每個框架都有學(xué)習(xí)曲線,Vue3 相對 Vue2 更加陡峭,在框架切換之間也會有一定的學(xué)習(xí)成本。但 Vue3 組合式 API 相對 Vue2 選項(xiàng)式 API 確實(shí)更加簡潔易用。如果您在使用過程中有什么疑問,也歡迎留言交流。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 封裝
    +關(guān)注

    關(guān)注

    126

    文章

    7901

    瀏覽量

    142959
  • 數(shù)據(jù)類型
    +關(guān)注

    關(guān)注

    0

    文章

    236

    瀏覽量

    13624
  • string
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    4735

原文標(biāo)題:Vue3中的幾個坑,你都見過嗎?

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    ESP8266模塊和機(jī)智云學(xué)習(xí)中遇到一些問題

    正點(diǎn)原子STM32開發(fā)板+ESP8266使用機(jī)智云最近學(xué)習(xí)STM32,學(xué)長和大佬建議我去學(xué)習(xí)下ESP8266模塊和機(jī)智云,于是開始摸索。在這里記錄以下學(xué)習(xí)中遇到一些問題,希望幫助得到大家。
    發(fā)表于 08-24 06:28

    學(xué)習(xí)32輸入捕獲時(shí)遇到一些問題

    在學(xué)習(xí)32輸入捕獲時(shí)遇到一些問題以及得出的答案最近學(xué)習(xí)輸入捕獲時(shí)參考了原子哥的程序,前面的引腳設(shè)置,定時(shí)器設(shè)置,中斷設(shè)置啥的都看的懂,(不懂的可以去網(wǎng)上搜下,講解的有很多)但是在中斷設(shè)置里有些
    發(fā)表于 01-06 06:16

    固態(tài)繼電器及在應(yīng)用中一些問題的探討

    固態(tài)繼電器及在應(yīng)用中一些問題的探討   摘  要:闡述了固態(tài)繼電器的原理、結(jié)構(gòu)、特點(diǎn)及交流直
    發(fā)表于 07-27 10:45 ?627次閱讀

    cadence畫板中遇到一些問題

    cadence畫板中遇到一些問題,在這里分享給大家,多多指教
    發(fā)表于 02-25 16:01 ?0次下載

    關(guān)于紅外通信的一些問題知識點(diǎn)

    關(guān)于紅外通信的一些問題知識點(diǎn)。
    發(fā)表于 05-05 17:40 ?4次下載

    繪制原理圖和PCB圖的過程中常遇到一些問題

    繪制原理圖和PCB圖的過程中常遇到一些問題.doc
    發(fā)表于 07-12 10:42 ?0次下載

    LED照明一些問題的解決方案英文資料

    本文的主要內(nèi)容是LED照明一些問題的解決方案英文資料
    發(fā)表于 04-16 09:59 ?15次下載
    LED照明<b class='flag-5'>一些問題</b>的解決方案英文資料

    一些關(guān)于手機(jī)信號放大器在安裝時(shí)會遇到一些問題

    隨著時(shí)代的發(fā)展,手機(jī)信號放大器也普布出現(xiàn)在的家庭中。最近收集了一些關(guān)于手機(jī)信號放大器在安裝時(shí)會遇到一些問題,整理了四大類常見問題與處理方式,具體內(nèi)容可以看詳細(xì)~ 對通訊基站造成干擾的處理 1.
    發(fā)表于 09-01 14:24 ?2583次閱讀

    光端機(jī)使用過程中碰到的一些問題

    光端機(jī),就是光信號傳輸?shù)慕K端設(shè)備,我們在使用的過程中難免會碰到一些問題,接下來杭州飛暢的小編為大家詳細(xì)列舉了光端機(jī)在使用過程中遇到一些常見問題以及對應(yīng)的解決方案,感興趣的朋友就起來
    的頭像 發(fā)表于 12-25 14:54 ?1084次閱讀

    關(guān)于vue如何去水印的解決方法的介紹

    很多人都懂一些簡單的電腦系統(tǒng)問題的解決方案,但是vue怎么去水印的解決思路卻鮮為人知,小編前幾天就遇到vue怎么去水印的問題,于是準(zhǔn)備整理一些
    發(fā)表于 03-24 17:33 ?3421次閱讀

    STM32中遇到的問題--關(guān)于串口的一些常見問題

    在單片機(jī)的開發(fā)過程中,最常用的外設(shè)就是串口了,是用來進(jìn)行bug糾錯、log輸出的常用工具,也是用來與外部通訊的常見協(xié)議之。 但是在使用串口的過程中難免會遇到一些問題,下面就我在工作遇到
    發(fā)表于 12-24 18:51 ?2次下載
    STM32中<b class='flag-5'>遇到</b>的問題--關(guān)于串口的<b class='flag-5'>一些</b>常見問題

    關(guān)于React和Vue產(chǎn)生定的認(rèn)知

    Vue2 相較 Vue3 版本而言牢牢占據(jù)著大部分 Vue 開發(fā)者的視野,但是因?yàn)?Vue 官方已經(jīng)把 Vue3 作為默認(rèn)的版本,所以在此同
    的頭像 發(fā)表于 11-02 13:18 ?829次閱讀

    【躍昉科技BF2開發(fā)板試用體驗(yàn)】遇到過的一些問題

    本文來源電子發(fā)燒友社區(qū),作者:不羈小生, 帖子地址: https://bbs.elecfans.com/jishu_2289347_1_1.html 分享一些遇到一些遇到
    的頭像 發(fā)表于 11-10 11:04 ?671次閱讀
    【躍昉科技BF2開發(fā)板試用體驗(yàn)】<b class='flag-5'>遇到</b>過的<b class='flag-5'>一些問題</b>

    文看懂Vue3響應(yīng)式系統(tǒng)原理

    Vue3 中,響應(yīng)式系統(tǒng)的實(shí)現(xiàn)基于 ES6 的 Proxy 對象。Proxy 可以直接監(jiān)聽對象和數(shù)組的變化,而無需對每個屬性進(jìn)行監(jiān)聽,從而大大提高性能。同時(shí),Proxy 也可以解決 Object.defineProperty 無法監(jiān)聽數(shù)組的問題。
    的頭像 發(fā)表于 12-07 10:55 ?1713次閱讀
    <b class='flag-5'>一</b>文看懂<b class='flag-5'>Vue3</b>響應(yīng)式系統(tǒng)原理

    Vue3設(shè)計(jì)思想及響應(yīng)式源碼剖析

    作者:京東物流 喬盼盼 、Vue3結(jié)構(gòu)分析 1、Vue2與Vue3的對比 ?對TypeScript支持不友好(所有屬性都放在了this對象上,難以推倒組件的數(shù)據(jù)類型) ?大量的API
    的頭像 發(fā)表于 12-20 10:24 ?92次閱讀