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

?用Vue?Demi?構(gòu)建同時(shí)兼容Vue2與Vue3組件庫(kù)

 更新時(shí)間:2022年02月17日 11:08:37   作者:杭州程序員張張  
這篇文章主要介紹了?用Vue?Demi?構(gòu)建同時(shí)兼容Vue2與Vue3組件庫(kù),我們通過(guò)考慮其功能、工作原理以及如何開(kāi)始使用它來(lái)了解?Vue?Demi,下面我們一起進(jìn)入文章學(xué)起來(lái)吧

前言:

Vue Demi 是一個(gè)很棒的包,具有很多潛力和實(shí)用性。我強(qiáng)烈建議在創(chuàng)建下一個(gè) Vue 庫(kù)時(shí)使用它。

根據(jù)創(chuàng)建者 Anthony Fu 的說(shuō)法,Vue Demi 是一個(gè)開(kāi)發(fā)實(shí)用程序,它允許用戶為 Vue 2 和 Vue 3 編寫(xiě)通用的 Vue 庫(kù),而無(wú)需擔(dān)心用戶安裝的版本。

以前,要?jiǎng)?chuàng)建支持兩個(gè)目標(biāo)版本的 Vue 庫(kù),我們會(huì)使用不同的分支來(lái)分離對(duì)每個(gè)版本的支持。對(duì)于現(xiàn)有庫(kù)來(lái)說(shuō),這是一個(gè)很好的方法,因?yàn)樗鼈兊拇a庫(kù)通常更穩(wěn)定。

缺點(diǎn)是,你需要維護(hù)兩個(gè)代碼庫(kù),這讓你的工作量翻倍。對(duì)于想要支持Vue的兩個(gè)目標(biāo)版本的新Vue庫(kù)來(lái)說(shuō),我不推薦這種方法。實(shí)施兩次功能請(qǐng)求和錯(cuò)誤修復(fù)根本就不理想。

這就是 Vue Demi 的用武之地。Vue Demi 通過(guò)為兩個(gè)目標(biāo)版本提供通用支持來(lái)解決這個(gè)問(wèn)題,這意味著您只需構(gòu)建一次即可獲得兩個(gè)目標(biāo)版本的所有優(yōu)點(diǎn),從而獲得兩全其美的優(yōu)勢(shì)。

在本文中,我們將了解 Vue Demi 是做什么的,它是如何工作的,以及如何開(kāi)始構(gòu)建一個(gè)通用的 Vue 組件庫(kù)。

一、Vue Demi 中的額外 API

除了 Vue 已經(jīng)提供的 API 之外,Vue Demi 還引入了一些額外的 API 來(lái)幫助區(qū)分用戶的環(huán)境和執(zhí)行特定于版本的邏輯。讓我們仔細(xì)看看它們!

請(qǐng)注意:Vue Demi 還包括 Vue 中已經(jīng)存在的標(biāo)準(zhǔn) API,例如 ref、onMounted 和 onUnmounted 等。

1.isVue2 and isVue3

在 Vue Demi 中,isvue2 和 isvue3 API 允許用戶在創(chuàng)建 Vue 庫(kù)時(shí)應(yīng)用特定于版本的邏輯。

例如:

import { isVue2, isVue3 } from 'vue-demi'?
if (isVue2) {?
? // Vue 2 only?
} else {?
? // Vue 3 only?
}

vue2

Vue Demi 提供了 vue2 API,它允許用戶訪問(wèn) Vue 2 的全局 API,如下所示:

import { Vue2 } from 'vue-demi'?
// in Vue 3 `Vue2` will return undefined?
if (Vue2) {?
? Vue2.config.devtools = true?
}
install()

在 Vue 2 中,Composition API 作為插件提供,在使用它之前需要安裝在 Vue 實(shí)例上:

import Vue from 'vue'?
import VueCompositionAPI from '@vue/composition-api'?

Vue.use(VueCompositionAPI)

Vue Demi 會(huì)嘗試自動(dòng)安裝它,但是對(duì)于您想要確保插件安裝正確的情況,提供了 install() API 來(lái)幫助您。

它作為 Vue.use(VueCompositionAPI) 的安全版本公開(kāi):

import { install } from 'vue-demi'?

install()

二、Vue Demi 入門

要開(kāi)始使用 Vue Demi,您需要將其安裝到您的應(yīng)用程序中。在本文中,我們將創(chuàng)建一個(gè)集成 Paystack 支付網(wǎng)關(guān)的 Vue 組件庫(kù)。

你可以像這樣安裝 Vue Demi:

// Npm?
npm i vue-demi?

// Yarn?
yarn add vue-demi

您還需要添加 vue @vue/composition-api 作為庫(kù)的對(duì)等依賴項(xiàng),以指定它應(yīng)該支持的版本。

現(xiàn)在我們可以將 Vue Demi 導(dǎo)入我們的應(yīng)用程序:

<script lang="ts">?
import {defineComponent, PropType, h, isVue2} from "vue-demi"?

export default defineComponent({
? // ...?
})?
</script>

此處所示,我們可以使用已經(jīng)存在的標(biāo)準(zhǔn) Vue API,例如 defineComponent、PropType 和 h。

現(xiàn)在我們已經(jīng)導(dǎo)入了Vue Demi,讓我們來(lái)添加我們的props。這些是用戶在使用組件庫(kù)時(shí)需要(或不需要,取決于你的口味)傳入的屬性。

<script lang="ts">
import {defineComponent, PropType, h, isVue2} from "vue-demi"
// Basically this tells the metadata prop what kind of data is should accept
interface MetaData {
? [key: string]: any
}

export default defineComponent({
? props: {
? ? paystackKey: {
? ? ? type: String as PropType<string>,
? ? ? required: true,
? ? },
? ? email: {
? ? ? type: String as PropType<string>,
? ? ? required: true,
? ? },
? ? firstname: {
? ? ? type: String as PropType<string>,
? ? ? required: true,
? ? },
? ? lastname: {
? ? ? type: String as PropType<string>,
? ? ? required: true,
? ? },
? ? amount: {
? ? ? type: Number as PropType<number>,
? ? ? required: true,
? ? },
? ? reference: {
? ? ? type: String as PropType<string>,
? ? ? required: true,
? ? },
? ? channels: {
? ? ? type: Array as PropType<string[]>,
? ? ? default: () => ["card", "bank"],
? ? },
? ? callback: {
? ? ? type: Function as PropType<(response: any) => void>,
? ? ? required: true,
? ? },
? ? close: {
? ? ? type: Function as PropType<() => void>,
? ? ? required: true,
? ? },
? ? metadata: {
? ? ? type: Object as PropType<MetaData>,
? ? ? default: () => {},
? ? },
? ? currency: {
? ? ? type: String as PropType<string>,
? ? ? default: "",
? ? },
? ? plan: {
? ? ? type: String as PropType<string>,
? ? ? default: "",
? ? },
? ? quantity: {
? ? ? type: String as PropType<string>,
? ? ? default: "",
? ? },
? ? subaccount: {
? ? ? type: String as PropType<string>,
? ? ? default: "",
? ? },
? ? splitCode: {
? ? ? type: String as PropType<string>,
? ? ? default: "",
? ? },
? ? transactionCharge: {
? ? ? type: Number as PropType<number>,
? ? ? default: 0,
? ? },
? ? bearer: {
? ? ? type: String as PropType<string>,
? ? ? default: "",
? ? },
? }
</script>

上面看到的屬性是使用 Paystack Popup JS 所必需的。

Popup JS 提供了一種將 Paystack 集成到我們的網(wǎng)站并開(kāi)始接收付款的簡(jiǎn)單方法:

data() {
? ? return {
? ? ? scriptLoaded: false,
? ? }
? },
? created() {
? ? this.loadScript()
? },
? methods: {
? ? async loadScript(): Promise<void> {
? ? ? const scriptPromise = new Promise<boolean>((resolve) => {
? ? ? ? const script: any = document.createElement("script")
? ? ? ? script.defer = true
? ? ? ? script.src = "https://js.paystack.co/v1/inline.js"
? ? ? ? // Add script to document head
? ? ? ? document.getElementsByTagName("head")[0].appendChild(script)
? ? ? ? if (script.readyState) {
? ? ? ? ? // IE support
? ? ? ? ? script.onreadystatechange = () => {
? ? ? ? ? ? if (script.readyState === "complete") {
? ? ? ? ? ? ? script.onreadystatechange = null
? ? ? ? ? ? ? resolve(true)
? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? } else {
? ? ? ? ? // Others
? ? ? ? ? script.onload = () => {
? ? ? ? ? ? resolve(true)
? ? ? ? ? }
? ? ? ? }
? ? ? })
? ? ? this.scriptLoaded = await scriptPromise
? ? },
? ? payWithPaystack(): void {
? ? ? if (this.scriptLoaded) {
? ? ? ? const paystackOptions = {
? ? ? ? ? key: this.paystackKey,
? ? ? ? ? email: this.email,
? ? ? ? ? firstname: this.firstname,
? ? ? ? ? lastname: this.lastname,
? ? ? ? ? channels: this.channels,
? ? ? ? ? amount: this.amount,
? ? ? ? ? ref: this.reference,
? ? ? ? ? callback: (response: any) => {
? ? ? ? ? ? this.callback(response)
? ? ? ? ? },
? ? ? ? ? onClose: () => {
? ? ? ? ? ? this.close()
? ? ? ? ? },
? ? ? ? ? metadata: this.metadata,
? ? ? ? ? currency: this.currency,
? ? ? ? ? plan: this.plan,
? ? ? ? ? quantity: this.quantity,
? ? ? ? ? subaccount: this.subaccount,
? ? ? ? ? split_code: this.splitCode,
? ? ? ? ? transaction_charge: this.transactionCharge,
? ? ? ? ? bearer: this.bearer,
? ? ? ? }
? ? ? ? const windowEl: any = window
? ? ? ? const handler = windowEl.PaystackPop.setup(paystackOptions)
? ? ? ? handler.openIframe()
? ? ? }
? ? },
? },

scriptLoaded 狀態(tài)幫助我們知道是否添加了Paystack Popup JS 腳本,并且 loadScript 方法加載 Paystack Popup JS 腳本并將其添加到我們的文檔頭部。

payWithPaystack 方法用于在調(diào)用時(shí)使用 Paystack Popup JS 初始化交易:

render() {
? ? if (isVue2) {
? ? ? return h(
? ? ? ? "button",
? ? ? ? {
? ? ? ? ? staticClass: ["paystack-button"],
? ? ? ? ? style: [{display: "block"}],
? ? ? ? ? attrs: {type: "button"},
? ? ? ? ? on: {click: this.payWithPaystack},
? ? ? ? },
? ? ? ? this.$slots.default ? this.$slots.default : "PROCEED TO PAYMENT"
? ? ? )
? ? }
? ? return h(
? ? ? "button",
? ? ? {
? ? ? ? class: ["paystack-button"],
? ? ? ? style: [{display: "block"}],
? ? ? ? type: "button",
? ? ? ? onClick: this.payWithPaystack,
? ? ? },
? ? ? this.$slots.default ? this.$slots.default() : "PROCEED TO PAYMENT"
? ? )
}

render 函數(shù)幫助我們創(chuàng)建沒(méi)有 標(biāo)簽的組件,并返回一個(gè)虛擬 DOM 節(jié)點(diǎn)。

如果你注意到,我們?cè)跅l件語(yǔ)句中使用了Vue Demi的一個(gè)API,isVue2,來(lái)有條件地渲染我們的按鈕。如果沒(méi)有這一點(diǎn),如果我們想在Vue 2應(yīng)用程序中使用我們的組件庫(kù),我們可能會(huì)因?yàn)閂ue 2不支持Vue 3的一些API而遇到錯(cuò)誤。

現(xiàn)在,當(dāng)我們構(gòu)建我們的庫(kù)時(shí),它可以在 Vue 2 和 Vue 3 中訪問(wèn)。

到此這篇關(guān)于用Vue Demi 構(gòu)建同時(shí)兼容Vue2與Vue3組件庫(kù)的文章就介紹到這了,更多相關(guān) 使用Vue Demi 構(gòu)建內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue+swiper實(shí)現(xiàn)左右滑動(dòng)的測(cè)試題功能

    vue+swiper實(shí)現(xiàn)左右滑動(dòng)的測(cè)試題功能

    這篇文章主要介紹了vue+swiper實(shí)現(xiàn)左右滑動(dòng)的測(cè)試題功能,本文通過(guò)實(shí)例代碼給大介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • vue2.0 子組件改變props值,并向父組件傳值的方法

    vue2.0 子組件改變props值,并向父組件傳值的方法

    下面小編就為大家分享一篇vue2.0 子組件改變props值,并向父組件傳值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • vue.js實(shí)現(xiàn)用戶評(píng)論、登錄、注冊(cè)、及修改信息功能

    vue.js實(shí)現(xiàn)用戶評(píng)論、登錄、注冊(cè)、及修改信息功能

    這篇文章主要為大家詳細(xì)介紹了vue.js實(shí)現(xiàn)用戶評(píng)論、登錄、注冊(cè)、及修改信息功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • nuxt 路由、過(guò)渡特效、中間件的實(shí)現(xiàn)代碼

    nuxt 路由、過(guò)渡特效、中間件的實(shí)現(xiàn)代碼

    這篇文章主要介紹了nuxt 路由、過(guò)渡特效、中間件的實(shí)現(xiàn)代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • vue2.* element tabs tab-pane 動(dòng)態(tài)加載組件操作

    vue2.* element tabs tab-pane 動(dòng)態(tài)加載組件操作

    這篇文章主要介紹了vue2.* element tabs tab-pane 動(dòng)態(tài)加載組件操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • 超全面的vue.js使用總結(jié)

    超全面的vue.js使用總結(jié)

    Vue.js是當(dāng)下很火的一個(gè)JavaScript MVVM庫(kù),它是以數(shù)據(jù)驅(qū)動(dòng)和組件化的思想構(gòu)建的。相比于Angular.js,Vue.js提供了更加簡(jiǎn)潔、更易于理解的API,使得我們能夠快速地上手并使用Vue.js。下面這篇文章主要給大家介紹了關(guān)于vue.js使用的相關(guān)總結(jié),需要的朋友可以參考借鑒。
    2017-02-02
  • vue實(shí)現(xiàn)多組關(guān)鍵詞對(duì)應(yīng)高亮顯示功能

    vue實(shí)現(xiàn)多組關(guān)鍵詞對(duì)應(yīng)高亮顯示功能

    最近小編遇到這樣的問(wèn)題,多組關(guān)鍵詞,這里實(shí)現(xiàn)了關(guān)鍵詞的背景色與匹配值的字體顏色值相同,下面通過(guò)定義關(guān)鍵詞匹配改變字體顏色,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2019-07-07
  • Vue事件符.capture的含義及用法說(shuō)明

    Vue事件符.capture的含義及用法說(shuō)明

    這篇文章主要介紹了Vue事件符.capture的含義及用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • vue-router子路由的實(shí)現(xiàn)方式

    vue-router子路由的實(shí)現(xiàn)方式

    這篇文章主要介紹了vue-router子路由的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • vite+ts vite.config.ts使用path報(bào)錯(cuò)問(wèn)題及解決

    vite+ts vite.config.ts使用path報(bào)錯(cuò)問(wèn)題及解決

    這篇文章主要介紹了vite+ts vite.config.ts使用path報(bào)錯(cuò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10

最新評(píng)論

固安县| 新乡县| 大庆市| 永仁县| 图木舒克市| 嘉兴市| 迁安市| 青田县| 潜山县| 定州市| 上思县| 周口市| 中西区| 绥芬河市| 汝城县| 延边| 津南区| 余江县| 皋兰县| 天台县| 开平市| 北流市| 察雅县| 静宁县| 温泉县| 海丰县| 永顺县| 临朐县| 洛隆县| 汉川市| 辉县市| 平陆县| 卢龙县| 股票| 三江| 六枝特区| 兴安盟| 金华市| 吉林市| 开江县| 天门市|