欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue3中g(shù)etCurrentInstance不推薦使用及在<script?setup>中獲取全局內(nèi)容的三種方式

 更新時間:2024年02月26日 09:28:18   作者:阿飛920  
這篇文章主要給大家介紹了關(guān)于vue3中g(shù)etCurrentInstance不推薦使用及在<script?setup>中獲取全局內(nèi)容的三種方式,文中通過介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下

在vue3中并沒有暴露出一個獲取全局方法的的接口

所以我們并不能通過 import {全局方法} from 'vue' 的方法來獲取

首先在main.js中定義全局的內(nèi)容

 const app = createApp(App)
 app.config.globalProperties.$test = '666'
 app.mount('#app')

方法一(不推薦)

vue 中的 getCurrentInstance 方法返回了 ctx 和 proxy,控制臺打印 ctx 和 proxy 發(fā)現(xiàn)和 vue2.x 中的 this 等同,習慣使用 this 的朋友可以用 proxy 進行替代。

import {defineComponent, getCurrentInstance} from 'vue'
export default defineComponent ({
  setup(){
  
  	//vue3-typescript
    const { proxy, ctx } = (getCurrentInstance() as ComponentInternalInstance)
	//vue3-javascript
	const { proxy, ctx } = getCurrentInstance()
	
    const _this = ctx
    
    console.log('getCurrentInstance()中的ctx:', _this)
    console.log('getCurrentInstance()中的proxy:', proxy)
    
    return {}
  }
})

本例中使用 getCurrentInstance 方法區(qū)獲取

const ctx = getCurrentInstance() console.log('ctx', ctx)

這時我們就能在控制臺中看到我們定義的內(nèi)容了

但是不推薦使用,不推薦原因其實在官網(wǎng)中已經(jīng)說的很明白了

官方解說: 在 setup() 內(nèi)部,this 不會是該活躍實例的引用(即不指向vue實例),因為 setup() 是在解析其它組件選項之前被調(diào)用的,所以 setup() 內(nèi)部的 this 的行為與其它選項中的 this 完全不同。這在和其它選項式 API 一起使用 setup() 時可能會導(dǎo)致混淆。因此setup函數(shù)中不能使用this。所以Vue為了避免我們錯誤的使用,直接將setup函數(shù)中的this修改成了 undefined)

我理解: 在Vue3中,setup 在生命周期 beforecreate 和 created 前執(zhí)行,此時 vue 對象還未創(chuàng)建,因此,無法使用我們在 vue2.x 常用的 this。在生產(chǎn)環(huán)境內(nèi)可能會獲取不到該實例!!,而且我們確實不應(yīng)該用該方法去代替this

按照魷魚須的原話就是:

Because the instance is an internal instance that exposes non-public APIs. Anything you use from that instance can technically break between any release types, since they are not subject to semver constraints.

同時也給出了應(yīng)該如何解決問題:

I’m not sure why you need the setup context in nested composables, but explicitly passing arguments to composables make then less coupled to the consuming component, thus easier to understand and test in isolation.

In general a library designed to work with Composition API should expose special variables via its own composables (e.g. useRoute from vue-router) instead of the requiring the user to grab it from the instance.

主要還是 getCurrentInstance 是一個內(nèi)部的API,并不是公開的API,使用內(nèi)部API去實現(xiàn)一些業(yè)務(wù)功能,可能會因為后續(xù) Vue 的版本迭代而造成業(yè)務(wù)上的 BUG。并且 Vue3 的 Composition API 強調(diào)的就是業(yè)務(wù)的解耦和復(fù)用性,依賴組件實例屬性并不是一個很好的開發(fā)方式。而 vue 相關(guān)生態(tài)的使用其實就是他們內(nèi)部的事情了,他們有完善的測試用例可以跑測試,但是我們并沒有,如果后續(xù)的某一個版本Vue變更了這個API,那么如果沒有經(jīng)過完整測試就部署上去的項目就會出現(xiàn)大規(guī)模的BUG反饋了。

vue3 github issu反饋截圖

魷魚須反饋截圖

方法二(推薦)

使用 Provide / Inject

v3.cn.vuejs.org/guide/compo…
在main.js中provide
app.provide('$test', '666')

在組件內(nèi)獲取

import { inject } from 'vue'
const test = inject('$test')
console.log('inject的$test', test)
這樣就可以獲取到了

擴展

掛載方法 在main.js中provide

import dayjs from 'dayjs'
const formatTime = (time, format) => (time ? dayjs(time).format(format || 'YYYY-MM-DD') : '-')
app.provide('dayjs', formatTime)

在組件中獲取
const dayjs = inject('dayjs')
const formatResult = dayjs(1639014286)
console.log('dayFormat', formatResult)

方式三(不推薦 只適合應(yīng)急的時候使用 因為我覺得這樣用怪怪的)

使用兩個script標簽來獲取this并保存

首先現(xiàn)在main.js中像之前一樣定義全局變量

import { createApp } from 'vue'
import App from './App.vue'
const app = createApp(App)
// 官方推薦將全局變量寫進 globalProperties下
app.config.globalProperties.myOption = 'myOption'
app.mount('#app')
然后在組件中獲取
<script>
import HelloWorld from './components/HelloWorld.vue'
import { onBeforeMount, defineComponent } from 'vue'
let that = this
export default defineComponent({
  beforeCreate() {
    that = this
  },
})
</script>
<script setup>
onBeforeMount(() => {
  console.log('that', that.myOption)
})
</script>
這樣就可以獲取到啦

在setup標簽中一定要在 onBeforeMount之后再讀取this?。?!

一些問題

為什么要創(chuàng)建兩個script標簽?

因為在setup標簽中是不綁定this的 所以只能在另一個script標簽中獲取

為什么一定要在onBeforeMount之后才能獲取呢?

因為setup的生命周期是在beforeCreate,created之前執(zhí)行的 我們在beforeCreate時保存的this,所以要在beforeCreate之后獲取,onBeforeMount是在beforeCreate之后執(zhí)行的 所以可以獲取到 note

如果按這樣寫了兩個script標簽?zāi)敲淳筒豢梢栽跊]寫setup中再執(zhí)行setup函數(shù)

<script>
import HelloWorld from './components/HelloWorld.vue'
import { onBeforeMount, defineComponent } from 'vue'
let that = this
export default defineComponent({
  beforeCreate() {
    console.log('beforeCreate')
    that = this
  },
  setup() {
    // 這里面的內(nèi)容不會執(zhí)行
    console.log('非單標簽的setup')
  }
})
</script>
<script setup>
console.log('setup')
onBeforeMount(() => {
  console.log('that', that.myOption)
})
</script>

為啥

因為在標簽中寫setup本身就是一個語法糖 vue會檢驗是否有

// 這是options方式

<script>
import HelloWorld from './components/HelloWorld.vue'
export default defineComponent({
  setup() {
    // 這里面的內(nèi)容還是不會執(zhí)行
    console.log('非單標簽的setup')
  }
})
</script>
// 這是<script setup>
<script setup></script>

你可能回想(會不會是因為 setup標簽放到下方 所以覆蓋了上方的setup方法呢?) 經(jīng)測試 這個執(zhí)行方式無關(guān)你放置的位置 哪怕將其放到options方式上方他仍然不會執(zhí)行!

總結(jié)

到此這篇關(guān)于vue3中g(shù)etCurrentInstance不推薦使用及在<script setup>中獲取全局內(nèi)容的三種方式的文章就介紹到這了,更多相關(guān)vue3在<script setup>獲取全局內(nèi)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue中ref的用法小結(jié)

    vue中ref的用法小結(jié)

    在項目中使用ref時有時候直接取值,有時候返回的卻是一個數(shù)組,不知其中緣由,后查了一下ref用法,在這里給大家分享vue中ref的用法,感興趣的朋友一起看看吧
    2023-11-11
  • vue-upload上傳圖片詳細使用方法

    vue-upload上傳圖片詳細使用方法

    這篇文章主要介紹了使用vue-upload上傳圖片的詳細使用說明,文中有相關(guān)的代碼示例供大家參考,感興趣的小伙伴一起跟著小編來學習吧
    2023-05-05
  • Vue.JS實現(xiàn)垂直方向展開、收縮不定高度模塊的JS組件

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

    這篇文章主要介紹了Vue.JS實現(xiàn)垂直方向展開、收縮不定高度模塊的JS組件,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-06-06
  • 在vue中使用防抖函數(shù)組件操作

    在vue中使用防抖函數(shù)組件操作

    這篇文章主要介紹了在vue中使用防抖函數(shù)組件操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • vue學習筆記之v-if和v-show的區(qū)別

    vue學習筆記之v-if和v-show的區(qū)別

    本篇文章主要介紹了vue學習筆記之v-if和v-show的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • vue3使用Facebook嵌入式視頻播放器API方法詳解

    vue3使用Facebook嵌入式視頻播放器API方法詳解

    這篇文章主要為大家介紹了vue3使用Facebook嵌入式視頻播放器API方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • vue 路由視圖 router-view嵌套跳轉(zhuǎn)的實現(xiàn)

    vue 路由視圖 router-view嵌套跳轉(zhuǎn)的實現(xiàn)

    這篇文章主要介紹了vue 路由視圖 router-view嵌套跳轉(zhuǎn),主要實現(xiàn)的內(nèi)容有制作一個登錄頁面,跳轉(zhuǎn)到首頁,首頁包含菜單欄、頂部導(dǎo)航欄、主體,標準的后臺網(wǎng)頁格式,菜單點擊顯示不同的頁面,感興趣的小伙伴請參考下面文章內(nèi)容
    2021-09-09
  • Vue組件之間傳值/調(diào)用幾種方式

    Vue組件之間傳值/調(diào)用幾種方式

    這篇文章主要介紹了Vue組件之間傳值/調(diào)用的幾種方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • 詳解vue組件通信的三種方式

    詳解vue組件通信的三種方式

    本篇文章主要介紹了詳解vue組件通信的三種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • VUE前端刪除和批量刪除實現(xiàn)代碼

    VUE前端刪除和批量刪除實現(xiàn)代碼

    這篇文章主要給大家介紹了關(guān)于VUE前端刪除和批量刪除的相關(guān)資料, 在實際的開發(fā)中,我們可以使用Vue.js來快速實現(xiàn)批量刪除功能,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-07-07

最新評論