在uni-app中如何從Options API遷移到Composition API?

uni-app 從 Options API 遷移到 Composition API 的詳細指南

一、遷移前的準備
  1. 升級環境

    • 確保 HBuilderX 版本 ≥ 3.2.0
    • 項目 uni-app 版本 ≥ 3.0.0
  2. 了解 Composition API 基礎

    • 響應式系統:refreactive
    • 生命周期鉤子:onMountedonUnload
    • 組合函數:提取可復用邏輯
  3. 備份項目

    • 遷移前務必備份代碼
    • 建議使用版本控制系統(如 Git)
二、漸進式遷移策略
  1. 組件級別遷移

    • 先遷移簡單、獨立的組件
    • 再處理復雜、依賴多的組件
  2. 功能模塊遷移

    • 先遷移數據邏輯
    • 再遷移生命周期鉤子
    • 最后處理計算屬性和監聽器
  3. 保持兩種 API 并存

    • 遷移期間允許兩種 API 在項目中共存
    • 新組件使用 Composition API,舊組件逐步遷移
三、基礎語法遷移
1. 數據定義
// Options API
export default {data() {return {count: 0,user: {name: 'John',age: 30}};}
}// Composition API
import { ref, reactive } from 'vue';export default {setup() {// 基本類型用 refconst count = ref(0);// 對象用 reactiveconst user = reactive({name: 'John',age: 30});return {count,user};}
}
2. 方法定義
// Options API
export default {methods: {increment() {this.count++;}}
}// Composition API
import { ref } from 'vue';export default {setup() {const count = ref(0);const increment = () => {count.value++;};return {count,increment};}
}
3. 計算屬性
// Options API
export default {computed: {doubleCount() {return this.count * 2;}}
}// Composition API
import { ref, computed } from 'vue';export default {setup() {const count = ref(0);const doubleCount = computed(() => count.value * 2);return {count,doubleCount};}
}
4. 監聽器
// Options API
export default {watch: {count(newVal, oldVal) {console.log('count changed:', newVal, oldVal);}}
}// Composition API
import { ref, watch } from 'vue';export default {setup() {const count = ref(0);watch(count, (newVal, oldVal) => {console.log('count changed:', newVal, oldVal);});return {count};}
}
四、生命周期鉤子遷移
// Options API
export default {onLoad() {console.log('頁面加載');},onShow() {console.log('頁面顯示');},onUnload() {console.log('頁面卸載');}
}// Composition API
import { onLoad, onShow, onUnload } from 'vue';export default {setup() {onLoad(() => {console.log('頁面加載');});onShow(() => {console.log('頁面顯示');});onUnload(() => {console.log('頁面卸載');});return {};}
}
五、組合函數提取復用邏輯
// Options API (mixins)
const counterMixin = {data() {return {count: 0};},methods: {increment() {this.count++;}}
};export default {mixins: [counterMixin]
}// Composition API (組合函數)
// useCounter.js
import { ref } from 'vue';export function useCounter(initialValue = 0) {const count = ref(initialValue);const increment = () => {count.value++;};return {count,increment};
}// 組件中使用
import { useCounter } from './useCounter';export default {setup() {const { count, increment } = useCounter(5);return {count,increment};}
}
六、使用 <script setup> 簡化語法
<template><view><text>{{ count }}</text><button @click="increment">+1</button></view>
</template><script setup>
import { ref, onLoad } from 'vue';// 響應式數據
const count = ref(0);// 方法
const increment = () => {count.value++;
};// 生命周期鉤子
onLoad(() => {console.log('頁面加載');
});
</script>
七、處理組件通信
1. Props
// Options API
export default {props: {message: String},methods: {handleClick() {console.log(this.message);}}
}// Composition API
import { defineProps } from 'vue';export default {props: {message: String},setup(props) {const handleClick = () => {console.log(props.message);};return {handleClick};}
}// 或使用 <script setup>
<script setup>
const props = defineProps({message: String
});const handleClick = () => {console.log(props.message);
};
</script>
2. Emits
// Options API
export default {emits: ['update'],methods: {triggerUpdate() {this.$emit('update', 'new value');}}
}// Composition API
import { defineEmits } from 'vue';export default {emits: ['update'],setup(props, { emit }) {const triggerUpdate = () => {emit('update', 'new value');};return {triggerUpdate};}
}// 或使用 <script setup>
<script setup>
const emit = defineEmits(['update']);const triggerUpdate = () => {emit('update', 'new value');
};
</script>
八、處理特殊情況
1. 訪問實例屬性
// Options API
export default {methods: {callMethod() {this.$refs.myRef.focus();}}
}// Composition API
import { getCurrentInstance } from 'vue';export default {setup() {const { proxy } = getCurrentInstance();const callMethod = () => {proxy.$refs.myRef.focus();};return {callMethod};}
}
2. 處理 ref
// Options API
export default {mounted() {this.$refs.myRef.focus();}
}// Composition API
import { ref, onMounted } from 'vue';export default {setup() {const myRef = ref(null);onMounted(() => {myRef.value.focus();});return {myRef};}
}
九、測試與驗證
  1. 單元測試

    • 確保遷移后的組件行為不變
    • 使用 Vue Test Utils 3.0+ 測試 Composition API
  2. 集成測試

    • 驗證組件間交互正常
    • 測試路由、狀態管理等集成功能
  3. 性能測試

    • 對比遷移前后的內存使用
    • 驗證響應式系統性能
十、遷移建議
  1. 從簡單組件開始

    • 先遷移無依賴的基礎組件
    • 再遷移復雜業務組件
  2. 利用工具輔助

    • 使用 IDE 插件(如 Vetur)提供的代碼轉換功能
    • 參考 Vue 官方遷移工具
  3. 團隊培訓

    • 組織 Composition API 培訓
    • 編寫內部遷移指南和最佳實踐
  4. 持續重構

    • 新功能優先使用 Composition API
    • 逐步重構舊組件

總結

從 Options API 遷移到 Composition API 是一個漸進的過程,需要耐心和規劃。建議采用"組件級別遷移"和"功能模塊遷移"相結合的策略,先易后難,逐步推進。在遷移過程中,充分利用 Composition API 的優勢,如邏輯復用、更好的 TypeScript 支持等,提高代碼質量和可維護性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/82950.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/82950.shtml
英文地址,請注明出處:http://en.pswp.cn/web/82950.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

408第一季 - 數據結構 - 圖

圖的概念 完全圖 無向圖的完全圖可以這么想&#xff1a;如果有4個點&#xff0c;每個點都會連向3個點&#xff0c;每個點也都會有來回的邊&#xff0c;所以除以2 有向圖就不用除以2 連通分量 不多解釋 極大連通子圖的意思就是讓你把所有連起來的都圈出來 強連通圖和強連通…

31.2linux中Regmap的API驅動icm20608實驗(編程)_csdn

regmap 框架就講解就是上一個文章&#xff0c;接下來學習編寫的 icm20608 驅動改為 regmap 框架。 icm20608 驅動我們在之前的文章就已經編寫了&#xff01; 因為之前已經對icm20608的設備樹進行了修改&#xff0c;所以大家可以看到之前的文章&#xff01;當然這里我們還是帶領…

Vue速查手冊

Vue速查手冊 CSS deep用法 使用父class進行限定&#xff0c;控制影響范圍&#xff1a; <template><el-input class"my-input" /> </template><style scoped> /* Vue 3 推薦寫法 */ .my-input :deep(.el-input__inner) {background-color…

振動力學:無阻尼多自由度系統(受迫振動)

本文從頻域分析和時域分析揭示系統的運動特性&#xff0c;并給出系統在一般形式激勵下的響應。主要討論如下問題&#xff1a;頻域分析、頻響函數矩陣、反共振、振型疊加法等。 根據文章1中的式(1.7)&#xff0c;可知無阻尼受迫振動的初值問題為&#xff1a; M u ( t ) K u …

真實案例分享,Augment Code和Cursor那個比較好用?

你有沒有遇到過這種情況&#xff1f;明明知道自己想要什么&#xff0c;寫出來的提示詞卻讓AI完全理解錯了。 讓AI翻譯一篇文章&#xff0c;結果生成的中文不倫不類&#xff0c;機器僵硬&#xff0c;詞匯不同&#xff0c;雞同鴨講。中國人看不懂&#xff0c;美國人表示聳肩。就…

zotero及其插件安裝

zotero官網&#xff1a;Zotero | Your personal research assistant zotero中文社區&#xff1a;快速開始 | Zotero 中文社區 插件下載鏡像地址&#xff1a;Zotero 插件商店 | Zotero 中文社區 翻譯&#xff1a;Translate for Zotero 接入騰訊翻譯API&#xff1a;總覽 - 控制…

【SSM】SpringMVC學習筆記8:攔截器

這篇學習筆記是Spring系列筆記的第8篇&#xff0c;該筆記是筆者在學習黑馬程序員SSM框架教程課程期間的筆記&#xff0c;供自己和他人參考。 Spring學習筆記目錄 筆記1&#xff1a;【SSM】Spring基礎&#xff1a; IoC配置學習筆記-CSDN博客 對應黑馬課程P1~P20的內容。 筆記2…

從認識AI開始-----變分自編碼器:從AE到VAE

前言 之前的文章里&#xff0c;我已經介紹了傳統的AE能夠將高維輸入壓縮成低維表示&#xff0c;并重建出來&#xff0c;但是它的隱空間結構并沒有概率意義&#xff0c;這就導致了傳統的AE無法自行生成新的數據&#xff08;比如新圖像&#xff09;。因此&#xff0c;我們希望&a…

智慧賦能:移動充電樁的能源供給革命與便捷服務升級

在城市化進程加速與新能源汽車普及的雙重推動下&#xff0c;移動充電樁正成為能源供給領域的一場革命。傳統固定充電設施受限于布局與效率&#xff0c;難以滿足用戶即時、靈活的充電需求&#xff0c;而移動充電樁通過技術創新與服務升級&#xff0c;打破了時空壁壘&#xff0c;…

發版前后的調試對照實踐:用 WebDebugX 與多工具構建上線驗證閉環

每次產品發版都是一次“高壓時刻”。版本升級帶來的不僅是新功能上線&#xff0c;更常伴隨隱藏 bug、兼容性差異與環境同步問題。 為了降低上線風險&#xff0c;我們逐步構建了一套以 WebDebugX 為核心、輔以 Charles、Postman、ADB、Sentry 的發版調試與驗證流程&#xff0c;…

如何安裝huaweicloud-sdk-core-3.1.142.jar到本地倉庫?

如何安裝huaweicloud-sdk-core-3.1.142.jar到本地倉庫&#xff1f; package com.huaweicloud.sdk.core.auth does not exist 解決方案 # 下載huaweicloud-sdk-core-3.1.142.jar wget https://repo1.maven.org/maven2/com/huaweicloud/sdk/huaweicloud-sdk-core/3.1.142/huawe…

Python學習(7) ----- Python起源

&#x1f40d;《Python 的誕生》&#xff1a;一段圣誕假期的奇妙冒險 &#x1f4cd;時間&#xff1a;1989 年圣誕節 在荷蘭阿姆斯特丹的一個寒冷冬夜&#xff0c;燈光昏黃、窗外飄著雪。一個程序員 Guido van Rossum 正窩在家里度假——沒有會議、沒有項目、沒有 bug&#xf…

DiMTAIC 2024 數字醫學技術及應用創新大賽-甲狀腺B超靜態及動態影像算法賽-參賽項目

參賽成績 項目介紹 去年參加完這個比賽之后&#xff0c;整理了項目文件和代碼&#xff0c;雖然比賽沒有獲獎&#xff0c;但是參賽過程中自己也很有收獲&#xff0c;自己一個人搭建了完整的pipeline并基于此提交了多次提高成績&#xff0c;現在把這個項目梳理成博客&#xff0c…

繪制餅圖詳細過程

QtCharts繪制餅圖 說明&#xff1a;qcustomplot模塊沒有繪制餅圖的接口和模塊&#xff0c;所以用Qt官方自帶的QtCharts進行繪制。繪制出來還挺美觀。 1 模塊導入 QT chartsQT_BEGIN_NAMESPACE以上這兩行代碼必須得加 2 總體代碼 widget.h #ifndef WIDGET_H #defin…

本地windows主機安裝seafile部署詳解,及無公網IP內網映射外網訪問方案

在Windows上部署Seafile服務器是一個相對直接的過程&#xff0c;但需要你具備一定的系統管理知識。Seafile是一個開源的文件共享和協作平臺&#xff0c;類似于Dropbox或Google Drive。 以下是在Windows上部署Seafile服務器的步驟&#xff1a; 1. 準備環境 確保你的Windows系…

Vue學習之---nextTick

前言&#xff1a;目前來說&#xff0c;nextTick我們遇到的比較少&#xff0c;至少對我來說是這樣的&#xff0c;但是有一些聰明的小朋友早早就注意到這個知識點了。nextTick 是前端開發&#xff08;尤其是 Vue 生態&#xff09;中的核心知識點&#xff0c;原理上跟Vue的異步更新…

MS2691 全頻段、多模導航、射頻低噪聲放大器芯片,應用于導航儀 雙頻測量儀

MS2691 全頻段、多模導航、射頻低噪聲放大器芯片&#xff0c;應用于導航儀 雙頻測量儀 產品簡述 MS2691 是一款具有 1164MHz ? 1615MHz 全頻段、低功耗的低噪聲放大器芯片。該芯片通過對外圍電路的簡單配置&#xff0c;使得頻帶具有寬帶或窄帶特性。支持不同頻段的各種導…

學習STC51單片機30(芯片為STC89C52RCRC)

每日一言 當你感到疲憊時&#xff0c;正是成長的關鍵時刻&#xff0c;再堅持一下。 IIC協議 是的&#xff0c;IIC協議就是與我們之前的串口通信協議是同一個性質&#xff0c;就是為了滿足模塊的通信&#xff0c;其實之前的串口通信協議叫做UART協議&#xff0c;我們千萬不要弄…

python打卡day47@浙大疏錦行

昨天代碼中注意力熱圖的部分順移至今天 知識點回顧&#xff1a; 熱力圖 作業&#xff1a;對比不同卷積層熱圖可視化的結果 以下是不同卷積層特征圖可視化的對比實現&#xff1a; import torch import matplotlib.pyplot as pltdef compare_conv_layers(model, input_tensor):# …

藍橋杯單片機之通過實現同一個按鍵的短按與長按功能

實現按鍵的短按與長按的不同功能 問題分析 對于按鍵短按&#xff0c;通常是松開后實現其功能&#xff0c;而不會出現按下就進行后續的操作&#xff1b;而對于按鍵長按&#xff0c;則不太一樣&#xff0c;按鍵長按可能分為兩種情況&#xff0c;一是長按n秒后實現后續功能&…