亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue3.2?中新出的Expose用法一覽

 更新時(shí)間:2022年07月06日 10:47:28   作者:Marina?Mosti  
這篇文章主要介紹了Vue3.2?中新出的?Expose?是做啥用的,新的expose方法是非常直觀的,而且很容易在我們的組件中實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下

隨著Vue 3.2的發(fā)布,一個(gè)新的組合工具提供給我們,叫做 expose。

你是否曾經(jīng)創(chuàng)建過一個(gè)需要向模板提供一些方法和屬性的組件,但又希望這些方法對(duì)組件是私有的,不能被父類調(diào)用?

如果你在開發(fā)一個(gè)開源的組件或庫(kù),你有可能想保持一些內(nèi)部方法的私有性。在Vue 3.2之前,這并不容易實(shí)現(xiàn),因?yàn)樗性谶x項(xiàng)API中聲明的方法或數(shù)據(jù)等都是公開的,所以模板可以訪問它。

組合API也是如此。我們從setup方法中返回的所有東西都可以被父類直接訪問。

組合 API

讓我們看一個(gè)實(shí)際的例子。想象一下,我們有一個(gè)組件,它創(chuàng)建了一個(gè)計(jì)數(shù)器,每一秒都會(huì)更新這個(gè)計(jì)數(shù)器。

** MyCounter.vue**

<template>
    <p>Counter: {{ counter }}</p>

    <button @click="reset">Reset</button>
    <button @click="terminate">??</button>
</template>

<script>
import { ref } from 'vue'

export default {
  setup () {
    const counter = ref(0)

    const interval = setInterval(() => {
      counter.value++
    }, 1000)

    const reset = () => {
      counter.value = 0
    }

    const terminate = () => {
      clearInterval(interval)
    }

    return {
      counter,
      reset,
      terminate
    }
  }
}
</script>

從組合的角度來看,我希望父級(jí)組件能夠在需要時(shí)直接調(diào)用reset?方法--但我希望保持terminate? 函數(shù)和 counter 的引用只對(duì)組件可用。

如果我們把這個(gè)組件實(shí)例化到一個(gè)父類中,例如 App.vue,并給它附加一個(gè) ref 引用,我們可以很容易地讓父類調(diào)用 reset? 方法,因?yàn)楫?dāng)我們從 setup? 中返回它時(shí),它已經(jīng)和 terminate 一起被暴露了。

App.vue

<template>
  <MyCounter ref="counter" />

  <button @click="reset">Reset from parent</button>
  <button @click="terminate">Terminate from parent</button>
</template>

<script>
import MyCounter from '@/components/MyCounter.vue'

export default {
  name: 'App',
  components: {
    MyCounter
  },
  methods: {
    reset () {
      this.$refs.counter.reset()
    },
    terminate () {
      this.$refs.counter.terminate()
    }
  }
}
</script>

如果現(xiàn)在運(yùn)行這個(gè),并單擊重置或終止按鈕,兩者都可以工作。

讓我們明確說明我們要向父類暴露(expose?)的內(nèi)容,以便只有 reset 函數(shù)可用。

** MyCounter.vue**

<script>
import { ref } from 'vue'
export default {
  setup (props, context) {
    const counter = ref(null)

    const interval = setInterval(() => {
      counter.value++
    }, 1000)

    const reset = () => {
      counter.value = 0
    }

    const terminate = () => {
      console.log(interval)
      clearInterval(interval)
    }

    context.expose({ reset })

    return {
      counter,
      reset,
      terminate
    }
  }
}
</script>

這里,我們?cè)趕etup?函數(shù)中加入了 props? 和 context? 參數(shù)。我們需要有可用的上下文,因?yàn)檫@是 expose? 函數(shù)的位置。我們也可以像這樣使用重構(gòu): { expose }。

接下來,我們使用 context.expose? 來聲明一個(gè)我們想要向?qū)嵗@個(gè)組件的父類公開的元素對(duì)象;在這個(gè)例子中,我們只打算讓 reset 功能可用。

如果我們?cè)俅芜\(yùn)行這個(gè)例子,并點(diǎn)擊 "Terminate from parent" 按鈕,我們會(huì)得到一個(gè)錯(cuò)誤。

Uncaught TypeError: this.$refs.counter.terminate is not a function

terminate 功能不再可用,我們的私有API現(xiàn)在也無法訪問了。

選項(xiàng)API

上面我們?cè)?nbsp;composition API? 使用 exponse,但在options API中也可以使用這個(gè)方法。我們可以把它改寫成如下。

//  MyCounter.vue
export default {
  created () { ... },
  data: () => ({ counter: null }),
  methods: {
    reset () { ... },
    terminate () { ... }
  },
  expose: ['reset']
}

注意,我們添加了一個(gè)新的選項(xiàng)API屬性expose?,允許我們傳入一個(gè)數(shù)組,其中字符串'reset'是我們公開的函數(shù)的名稱。

組合API 渲染功能

創(chuàng)建一個(gè)強(qiáng)大臉靈活的組件的方法是利用渲染函數(shù)的力量。這對(duì)Vue 3來說并不新鮮,但是隨著composition API的建立,我們現(xiàn)在可以靈活地從setup?方法中直接返回組合API h 函數(shù)。

這就產(chǎn)生了一個(gè)問題,因?yàn)樵谖覀兊膕etup?函數(shù)中,整個(gè)return?語(yǔ)句只是包含組件正在創(chuàng)建的節(jié)點(diǎn)的 h 方法。

如果在這個(gè)時(shí)候我們選擇向父類 expose 一些東西,我們就會(huì)遇到與我們之前看到的相反的問題。沒有任何東西被暴露,因?yàn)槌薉OM元素,沒有任何東西被返回。

讓我們重寫 MyCounter.vue 組件來使用這個(gè)方法。

<script>
// The template has been deleted
import { ref, h } from 'vue'

export default {
  setup (props, context) {
    const counter = ref(0)

    const interval = setInterval(() => {
      counter.value++
    }, 1000)

    const reset = () => {
      counter.value = 0
    }

    const terminate = () => {
      clearInterval(interval)
    }

    // context.expose({ reset })

    return () => h('div', [
      h('p', `Counter: ${counter.value}`),
      h('button', { onClick: reset }, 'Reset'),
      h('button', { onClick: terminate }, 'Terminate')
    ])
  }
}
</script>

注意,我們?cè)陧敳繌腣ue導(dǎo)入了 h,因?yàn)槲覀冃枰盟鼇韯?chuàng)建我們的DOM元素。

為了說明問題,暫時(shí)注釋了context.expose方法。

現(xiàn)在的 return 語(yǔ)句復(fù)制了我們之前的 <template> 的DOM結(jié)構(gòu),如果我們運(yùn)行這個(gè)例子,我們能夠正確點(diǎn)擊元素上的重置和終止按鈕。

然而,如果我們現(xiàn)在點(diǎn)擊 "Reset from parent"按鈕,我們會(huì)遇到一個(gè)錯(cuò)誤。

Uncaught TypeError: this.$refs.counter.reset is not a function

reset?方法不再被暴露,因?yàn)樗鼪]有被setup?函數(shù)返回。為了解決這個(gè)問題,我們需要取消對(duì)context.expose的調(diào)用,使其再次可用。

總結(jié)

新的 expose 方法是非常直觀的,而且很容易在我們的組件中實(shí)現(xiàn)。它清除了一些非常重要的組成問題,這些問題在過去甚至需要重寫一個(gè)完整的組件,所以即使它不是你日常使用的API,它也是值得收藏在我們文件夾中吃灰。

到此這篇關(guān)于Vue3.2 中新出的 Expose 是做啥用的?的文章就介紹到這了,更多相關(guān)Vue3.2 Expose 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue.JS實(shí)現(xiàn)垂直方向展開、收縮不定高度模塊的JS組件

    Vue.JS實(shí)現(xiàn)垂直方向展開、收縮不定高度模塊的JS組件

    這篇文章主要介紹了Vue.JS實(shí)現(xiàn)垂直方向展開、收縮不定高度模塊的JS組件,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • 詳解Vue?自定義hook?函數(shù)

    詳解Vue?自定義hook?函數(shù)

    這篇文章主要介紹了詳解Vue自定義hook函數(shù),hook函數(shù)本質(zhì)是一個(gè)函數(shù),把setup函數(shù)中使用的Composition?API進(jìn)行了封裝,更多相關(guān)內(nèi)容感興趣的朋友可以參考一下
    2022-06-06
  • vue實(shí)現(xiàn)短信驗(yàn)證碼登錄功能(流程詳解)

    vue實(shí)現(xiàn)短信驗(yàn)證碼登錄功能(流程詳解)

    無論是移動(dòng)端還是pc端登錄或者注冊(cè)界面都會(huì)見到手機(jī)驗(yàn)證碼登錄這個(gè)功能,輸入手機(jī)號(hào),得到驗(yàn)證碼,這篇文章主要介紹了基于vue實(shí)現(xiàn)短信驗(yàn)證碼登錄功能,需要的朋友可以參考下
    2019-12-12
  • 一文帶你了解什么是Vue的前端微服務(wù)架構(gòu)(Micro Frontends)

    一文帶你了解什么是Vue的前端微服務(wù)架構(gòu)(Micro Frontends)

    微前端架構(gòu)是一種將大型前端應(yīng)用拆分為多個(gè)小型、獨(dú)立的前端應(yīng)用的架構(gòu)風(fēng)格,每個(gè)小型前端應(yīng)用都可以獨(dú)立部署、獨(dú)立開發(fā)和獨(dú)立運(yùn)行,下面我們就來學(xué)習(xí)一下它的相關(guān)使用吧
    2023-11-11
  • TypeError:res.forEach?is?not?a?function報(bào)錯(cuò)解決辦法

    TypeError:res.forEach?is?not?a?function報(bào)錯(cuò)解決辦法

    這篇文章主要給大家介紹了關(guān)于TypeError:res.forEach?is?not?a?function報(bào)錯(cuò)的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Vue3 directive自定義指令內(nèi)部實(shí)現(xiàn)示例

    Vue3 directive自定義指令內(nèi)部實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Vue3 directive自定義指令內(nèi)部實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Vue3中是如何實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式示例詳解

    Vue3中是如何實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式示例詳解

    這篇文章主要介紹了Vue3中是如何實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Vue中computed及watch區(qū)別實(shí)例解析

    Vue中computed及watch區(qū)別實(shí)例解析

    這篇文章主要介紹了Vue中computed及watch區(qū)別實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • vue中this.$message的實(shí)現(xiàn)過程詳解

    vue中this.$message的實(shí)現(xiàn)過程詳解

    Message在開發(fā)中的使用頻率很高,也算是Element-UI組件庫(kù)中比較簡(jiǎn)單的,對(duì)于感興趣的朋友可以一起探討一下Message組件的實(shí)現(xiàn),本文詳細(xì)介紹了vue中this.$message的實(shí)現(xiàn)過程,感興趣的同學(xué)可以參考一下
    2023-04-04
  • 詳解Vue3?中的watchEffect?特性

    詳解Vue3?中的watchEffect?特性

    這篇文章主要介紹了Vue3?中的?watchEffect?特性詳解,watchEffect?是?Vue3?中非常有用的一個(gè)特性,它可以讓我們輕松地監(jiān)聽響應(yīng)式數(shù)據(jù)的變化,并在數(shù)據(jù)發(fā)生變化時(shí)執(zhí)行指定的回調(diào)函數(shù),從而簡(jiǎn)化代碼并提高應(yīng)用的性能,需要的朋友可以參考下
    2023-04-04

最新評(píng)論