準備將您的Vue應用遷移到Vue 3

2021-01-08 志學Python

嘿!

在這篇文章中,我想分享一下我最近試用Vue 3 Beta版本的經驗,特別是有關您計劃將現有Vue 2應用程式遷移到升級版本Vue 3時可能要注意的一些注意事項!

下面的列表將幫助您邁向Vue 3最佳實踐,並避免在Vue 2中遷移到Vue 3時可能遇到麻煩的一些用例。

讓我們繼續!

避免使用Vue事件總線

簡短總結:不要使用\$on/$once/$off API,因為它會在Vue公司3被棄用。

如果您聽說過事件總線,那麼當您遇到需要為從孩子向父母發送事件或從孩子向父母發送事件的快捷方式的情況下,它是Vue開發中的常用術語。您只需在瀏覽器中搜索「事件事件總線」,就會發現很多說明它的文章。

需要注意的一件事是,這不是Vue recommended 推薦的官方方法。我之所以這麼說,是因為您可能永遠不會在Vue官方文檔中看到Event Bus。最接近的參考來自Vue 1.x的遷移指南,該指南在此處稱為「 eventHub」,建議您改用Vuex。

在簡單的情況下,該模式可以代替$ dispatch和$ broadcast,但是對於更複雜的情況,建議使用專用的狀態管理層,例如Vuex。

您也可以查看RFC文檔,以了解為什麼他們不推薦它。

由於事件總線概念實際上是一種發布-訂閱模式,這是編程中的一種常用方法,因此您實際上仍然可以使用該概念,但是可以使用mitt之類的不同庫。

這是事件總線以及如何重構它的示例:

// Vue 2 example of event busimport Vue from'vue';const eventBus = new Vue();// subscribeeventBus.$on('sandwich-made', () => console.log('sandwich made!'));// publisheventBus.$emit('sandwich-made');// Refactor to use 3rd party library like mittimport mitt from'mitt';const eventBus = mitt();// subscribeeventBus.on('sandwich-made', () => console.log('sandwich made!'));// publisheventBus.emit('sandwich-made');將Filter函數重構為Method

根據RFC docs,過濾器將被刪除。

Filter在那裡可以幫助您「格式化」您的值,例如:大寫,添加貨幣,短url等。也許它也受到Angular Filter的啟發。看起來不錯,因為您可以在模板語法中實現它。例如,下面是一個toCurrency將貨幣格式添加到價格整數值的過濾器:

<divclass="currency">{{ price | toCurrency }}</div>注意:價格值為25,然後過濾toCurrency為$ 25.00

儘管它看起來不錯,但是請記住,它實際上是一個「語法糖」,因為在運行時,toCurrency只要更新價格,它就始終會運行以格式化價格。

如果你重構toCurrency作為method替代,它會被寫成這樣:

<divclass="currency">{{ toCurrency(price) }}</div>Vue腳本中的重構僅是將函數從filter移至method:

// before{filter: { toCurrency (value) {return`$${value.toFixed(2)}` } }}// after{methods: { toCurrency (value) {return`$${value.toFixed(2)}` } }}涼!但是,如果將filter登記為全局過濾器怎麼辦?

Vue.filter('toCurrency', function (value) {return`$${value.toFixed(2)}`})在這種情況下,我建議您刪除上面的全局過濾器代碼,並將過濾器功能移到首先成為可以共享的純輔助功能。例如:

// helper/filter.jsexportfunctiontoCurrency (value) {return`$${value.toFixed(2)}`}然後,您可以將輔助函數導入到需要使用它的組件中。例如:

// price-component.vueimport { toCurrency } from'./helper/filter'// your vue object{methods: { toCurrency }}注意:只是toCurrency可以使用;)感謝ES6對象屬性的簡寫

將組件重構model為.sync

根據RFC文檔,Vue 3將棄用modelVue組件中的選項,並將其替換sync為multiple model。

如果您model在組件中使用了選項來設置雙向數據綁定,則可以將其重構為.sync。例子如下:

// BEFORE// parent component<child-component v-model="visible"/>// the model option in the child component's Vue object<script>{model: {prop: 'visible',event: 'change' }}</script>重構使用.sync:

// AFTER// parent component<child-componentv-bind:visible.sync="visible"/>// delete the model option in the child component's Vue object當您需要升級到Vue 3的時候,您只需將重命名為.sync即可v-model:

// Vue 3// parent component<child-componentv-model:visible="visible"/>容易擠檸檬!

警惕使用第三方插件

與其他框架一樣,Vue框架的魅力在於,它為社區提供了創建自己的插件的API。

但是在Vue 3中,將進行重大更改,這將使某些插件不再兼容。一個主要的變化是,插件的安裝和應用程式的初始化將與原始Vue實例保持不變。例如:

BEFORE, in Vue 2Vue.use(myPlugin);new Vue({/* your vue initialization */});// AFTER, in Vue 3const app = createApp(); // new method to initialize Vueapp.use(myPlugin); 在插件的作者對其進行升級之前,最有可能無法重構代碼以使用Vue 3中的插件。因此,這意味著,如果您打算進行遷移,則應考慮使用第三方插件,因為這將成為阻止程序。

檢查您正在使用的插件的問題或路線圖,以查看它們是否計劃升級以支持Vue3。這是將支持Vue 3的插件的示例:

Bootstrap VueVue MultiselectVuetify如果您使用過的插件還沒有升級到Vue 3的計劃,則可以通過要求該問題的作者支持Vue 3甚至參與其中的升級來幫助您做出貢獻。

使用@vue/composition-api寫您的組件

我非常感謝Vue社區提供的@vue/composition-api。它不僅可以供開發人員使用Composition API進行動手操作,而且還提供API,它將成為Vue 3中的核心方法。

例如,defineComponent。它將成為在Vue 3中編寫Vue組件的新標準,並且您已經可以在Vue 2應用程式中使用它了!

要使用它,請安裝@vue/composition-api並更換Vue對象組件啟動。例如:

// BEFOREimport Vue from'vue';exportdefault Vue.extend({name: 'my-component',/* your component props, data, methods, etc. */});只需替換它即可使用defineComponent:

// AFTERimport { defineComponent } from'@vue/composition-api';exportdefault defineComponent({name: 'my-component',/* your component props, data, methods, etc. */});你問有什麼區別?幾乎沒有區別,這就是它的美!您的組件應與往常一樣工作,並添加了「props」,現在您可以重構組件以使用Composition API,如果您希望:

// Refactor to use setup()import { defineComponent } from'@vue/composition-api';exportdefault defineComponent({name: 'my-component', setup (props) {/* your component props, data, methods, etc. */ }});注意:如果您喜歡Typescript,我敢肯定您會喜歡composition API,因為它將有助於改善組件的輸入。;)

更重要的是

還會有另一個重大變化,例如:

渲染功能API更改將作用域內的插槽統一為僅插槽要刪除的keyCode修飾符內聯模板將被刪除但是,如果您不經常使用它,並且您認為可以輕鬆地對其進行重構,則取決於您決定是早晚進行更改。

摘要

我希望本文能幫助您為升級到Vue 3做好準備。作為Vue開發人員,我很高興看到它的到來,因為它使用更好的API來處理反應性,更多的Typescript支持以及開發中的更好做法。

如果我錯過了要定義的任何API或說明,請告訴我們,感謝您的反饋。謝謝,祝你有美好的一天!

相關焦點

  • 尤雨溪在Vue3.0 Beta直播裡聊到了這些…
    全新文檔RFCsVue.js 3.0 Beta發布後的工作重點是保證穩定性和推進各類庫集成所有的進度和文檔都將在全新RFCs文檔可以看到。2. 六大亮點很多時候,我們並不需要 vue提供的所有功能,在 vue 2 並沒有方式排除掉,但是 3.0 都可能做成了按需引入。5. Composition API
  • 使用electron+vue開發一個跨平臺todolist(便籤)桌面應用
    直到我真的需要開發一個跨平臺桌面應用的時候,我又認真的嘗試了一下electron,我開始意識到:這才是我理想中的跨平臺桌面應用開發的最終形態,它簡直太優秀了。# 2在使用electron期間,我順便寫了一個簡單的todolist(便籤)應用,用於學習和嘗試;項目地址:https://github.com/xiajingren/xhznl-todo-list 界面參考了小黃條便籤。
  • 一張圖教你快速玩轉vue-cli3
    但是如果其中一個依賴需要特殊的 polyfill,默認情況下 Babel 無法將其檢測出來。我們可以通過如下三種方式解決此類問題:將依賴添加到 vue.config.js 中的 transpileDependencies 選項// vue.config.js
  • Vue框架之生命周期鉤子
    vue中三大常用屬性的小結、生命周期鉤子的了解,以及指令的初步接觸。指令有點多,只能留到明天繼續補全了。一、回顧與生命周期補充說明三大屬性,當然vue肯定不止這些,只不過時間有限,只學下最常見的。1回顧每次new一個Vue實例都需要關聯模板,Vue會基於此模板進行視圖渲染。
  • 技術分享:vue 過濾器
    vue 過濾器 1 關於 vue 過濾器 在vue1.0的時候其實是內置了過濾器的,但是考慮到好多過濾器並不一定會被開發所調用,所以把原本內置的過濾器就給去掉了,但是過濾器還是比較普遍的,所以我們從vue2.0之後就需要自己定義過濾器
  • vue 渲染函數插槽專題及常見問題 - CSDN
    // app.vue 在開始和結束frame標記之間的內容將插入到插槽所在的frame組件中,替換slot標記。這是最基本的方法。 就像之前一樣,如果我們想將內容添加到默認槽中,只需將其直接放在titled-frame組件中。
  • vuex實現預熱篇-vue插件開發
    #泛舟計劃·讓知識更好看#1.如何引用vue插件呢?Vue.use(Vuex)2.use做了什麼事呢?plugin.install.apply(plugin, args); } elseif (typeof plugin === 'function') {// 如果你傳入的不是個對象是函數,那麼我就直接執行函數 plugin.apply(null, args); } installedPlugins.push(plugin);returnthis };3.
  • 基於Vue實現一個有點意思的拼拼樂小遊戲
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言為了加深大家對vue的了解和vue項目實戰,筆者採用vue生態來重構此項目,方便大家學習和探索。
  • Vue.js系列:生命周期鉤子
    開發人員提供了一個Web開發人員可以在Vue.js應用程式的整個生命周期中使用的各種方法的討論。生命周期鉤子是在Vue對象生命周期的某個階段執行的已定義方法。從初始化開始到它被破壞時,對象都會遵循不同的生命階段。這是一個著名的圖表,表示掛鈎順序。讓我們將代碼添加到鉤子並查看它們如何被解僱的階段。<!
  • vue的$nextTick的使用+源碼分析
    上面,我拋了一個問題,現在來聊一聊這個問題,首先說一說nextTick的作用,這裡我就直接引用官網api上的一句話,我覺得已經說的非常清楚了:將回調延遲到下次 DOM 更新循環之後執行。在修改數據之後立即使用它,然後等待 DOM 更新。它跟全局方法 Vue.nextTick 一樣,不同的是回調的 this 自動綁定到調用它的實例上。
  • Vue標籤
    v-show<script> var vm=new Vue({ el:"#app", data:{ "str1":"aa", "str2":"bb", "str3"
  • 如何創建vue項目並使用element框架中的el-select
    1、在電腦硬碟上,找到一個位置,新建一個文件夾wmn;滑鼠右鍵選擇Git Bash Here,並在Git窗口輸入cnpm install --global vue-cli命令:cnpm install --global vue-cli
  • 我發現了 Vue.js 中的性能陷阱
    我們做了一款單頁應用形式的遊戲,到了請求域的時候內存佔用爆表了。雖然遊戲大賽已經結束了,但是我依舊不能釋懷。這個問題一直困擾著我。問題出在 Vue.js 嗎?是 Netlify 嗎?還是因為我們的代碼有缺陷?我必須找出答案。 我內心深處對遊戲的熱愛,讓我一直渴望能自己製作一些電子遊戲。幾個月前我開始將這種夢想變為現實,並第一次參加了全球遊戲大賽(Global Game Jam)。
  • 我在 JPM 的 HireVue,不小心錄下了穿著熱褲的下半身…
    一次Hirevue Interview中你將會被問到5~6個問題,其中80%是Behavioral,20%將是特定於部門。每個問題,你將有30秒的時間準備每一個答案,還有兩分鐘的時間與鏡頭對話,沒有第二次機會。整個流程控制在15分鐘內。
  • 如何寫一個vue組件專題及常見問題 - CSDN
    允許外部環境將額外的內容組合在組件中prop組件具有自身狀態,當沒有相關 porps 傳入時,使用自身狀態完成渲染和交互邏輯;當該組件被調用時,如果有相關 props 傳入,那麼將會交出控制權,由父組件控制其行為僅一個值傳入組件如果該組件設計上支持雙向綁定,可使用v-model將該參數傳入組件,減少記憶成本(畢竟 vue 官方的語法糖,不用白不用)
  • 前端娛樂圈大瓜:前端人因為 Vue3 的 Ref-sugar 提案打起來了!
    首先明確一件事情,想要吃這個前端娛樂圈的大瓜,各位看官姥爺得先用一下剛新鮮出爐、十分熱乎的 Vue3.0 版本,否則,這個瓜可能不太甜:)  咱們來捋一捋到底咋回事。 其中最具爭議的就是 ref 的語法糖問題;  為了將問題更加聚焦,前幾天,尤大大將這個提案的兩個內容,分離到了各自的 PR 中,setup 是 RFC 227(https://github.com/vuejs/rfcs/pull/227),ref sugar 是 RFC 228(https://github.com/vuejs/rfcs/
  • 優美的v-for列表加載動畫:vue動畫鉤子實踐
    原文轉自 優美的v-for列表加載動畫:vue動畫鉤子實踐 https://juejin.im/post/6869195042599206919最近忙完工作,重新擼了一遍vue官方文檔,發現很少被我用到的vue動畫神器,JavaScript鉤子函數
  • Vue超好玩的新特性:DOM傳送門
    前言自從上一篇《Vue超好玩的新特性:在CSS中引入JS變量》大火之後,很多小夥伴紛紛點讚留言,所以我決定將《Vue超好玩的新特性》做成一個系列。它的意義就在於:從組件角度來看,它倆仍舊是同一個組件,組件內定義的變量以及邏輯依然生效從 DOM 結構來看,面板控制點的 DOM 結構已經成為了別人的子元素了用法首先咱們先根據《今日凌晨Vue3 beta版震撼發布,竟然公開支持腳手架項目》這篇文章來搭建一個支持 vue 3 的一個項目
  • 10個簡單的技巧讓你的 vue.js 代碼更優雅 - 酷扯兒
    vue中的$props、$attrs和$listeners(可用來二次封裝組件)$props:當前組件接收到的 props 對象。Vue 實例代理了對其 props 對象屬性的訪問。假如有個input輸入框。我們有很多的原生屬性,比如:name、placeholder、disabled等等。
  • Vue.js最佳靜態站點生成器對比
    在過去的幾年中,Vue.js 已成為 Web 應用程式開發的流行選項。用戶變多後,這個框架開始將觸角伸向了靜態站點生成,一個曾經由 React 統治的領域。就像 React 這邊的 Gatsby 和 NextJS 一樣,Vue.js 這邊支持靜態網站生成的框架也有不少。但考慮到它們提供的眾多功能,想要挑一個合適的並不容易。