【问题标题】:How to use Vue.prototype or global variable in Vue 3?如何在 Vue 3 中使用 Vue.prototype 或全局变量?
【发布时间】:2021-03-18 21:35:54
【问题描述】:

如题,想将Axios加入Vue原型。所以当我想用的时候,可以像this.$axios一样使用,而不是每次都导入。

代码:

//plugins/axios.ts

import axios from 'axios'
import router from '../router/index'

const errorHandle = (): void => {};

const instance = axios.create({
  // baseURL: process.env.NODE_ENV == 'development' ? '' : ''
  baseURL: 'http://localhost:3000',
  timeout: 1000 * 12
});

instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

export default instance
import { createApp } from 'vue'
import App from './App.vue'
import installElementPlus from './plugins/element'
import instance from './plugins/axios'
import router from './router'

const app = createApp(App).use(router)
installElementPlus(app)
// app.config.globalProperties.http = instance
app.config.globalProperties.$axios= instance
app.mount('#app')

但是,当我尝试像这样使用它时出现问题:this.$axios

TS2339: Property '$axios' does not exist on type 'ComponentPublicInstance<{}, {}, {}, {}, {}, EmitsOptions, {}, {}, false, ComponentOptionsBase<{}, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, EmitsOptions, string, {}>>'.

我该如何解决这个问题?

【问题讨论】:

    标签: javascript vue.js axios vuejs3


    【解决方案1】:

    您可以使用 provide/inject 或定义一个全局配置属性,在 Vue 3 中替换 Vue.prototype

    1。 provide/inject(用于组合或选项 API)

    提供

    import axios from 'axios';
    
    const app = Vue.createApp(App);
    app.provide('$axios', axios);  // Providing to all components during app creation
    

    注入

    组合 API:

    const { inject } = Vue;
    ...
    setup() {
      const $axios = inject('$axios');   // injecting in a component that wants it
      // $axios.get(...)
    }
    

    选项 API:

    inject: ['$axios'],   // injecting in a component that wants it
    

    2。 Global config(用于选项 API)

    import axios from 'axios';
    
    const app = Vue.createApp(App);
    app.config.globalProperties.$axios = axios;
    

    选项 API:

    this.$axios
    

    注意:这仅适用于选项 API。 Evan You(Vue 创建者)says:“config.globalProperties 旨在作为复制Vue.prototype 行为的逃生舱口。在setup 函数中,只需导入您需要的内容或明确使用provide/ inject 向应用公开属性。"

    【讨论】:

    • 选项 #2 作为替代品效果很好。用于通过应用程序添加分析跟踪。
    【解决方案2】:

    有一种方法可以在设置函数中使用globalProperties。尽管这可能被认为是反模式。如果可能,最好使用提供/注入。但是,如果有一个使用 globalProperties 的库,并且您确实需要从设置中访问它,那么您可以这样做。

    <script setup>
        import { getCurrentInstance } from 'vue'
    
        const app = getCurrentInstance()
        const progressBar = app.appContext.config.globalProperties.$Progress
    
        progressBar.start()
    </script>
    

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 1970-01-01
      • 2020-04-18
      • 2021-09-06
      • 2021-02-22
      • 2021-09-01
      • 2010-11-05
      • 2020-05-20
      • 1970-01-01
      相关资源
      最近更新 更多