Message消息组件怎么在Vue3里全局调用?
我用的是Element Plus的Message组件,想在axios拦截器里直接弹错误提示,但不知道怎么全局调用。试过ElMessage.error('出错了'),结果报错说ElMessage is not defined。
我在main.js里已经按需引入了Message:
import { createApp } from 'vue'
import App from './App.vue'
import { ElMessage } from 'element-plus'
const app = createApp(App)
app.use(ElMessage)
app.mount('#app')
但这样好像不行,是不是注册方式有问题?
app.use(ElMessage)这种方式是不对的,因为ElMessage并不是一个插件,而是一个独立的组件。正确的做法是直接挂载到Vue实例上或者使用全局属性的方式。这里推荐使用全局属性的方式来注册,这样在任何地方都能方便地调用。
首先,在main.js里,你需要这样做:
然后在你的axios拦截器或者其他地方,你可以通过
this.$message来调用它。不过在axios拦截器中,this指向可能不是Vue实例,所以你需要通过其他方式获取这个全局属性。一种常见的解决方法是将
$message挂载到window对象上,或者直接从应用实例中获取。这里推荐使用前者,简单直接:这样你就可以在axios拦截器或者其他任何地方直接使用
$message了:这样配置之后,你应该就可以在axios拦截器中正常调用Element Plus的Message组件了。希望这能解决问题。
app.use(ElMessage)这种注册方式根本不对。use()是用来安装插件的,但 ElMessage 本身不是插件,你这么整当然会报错。最简单直接的解决办法:直接在需要用的地方导入,别的配置都不用改。
在你的 axios 拦截器文件里这样写:
完事儿,不需要在 main.js 里搞任何骚操作。
如果你实在想在 main.js 里全局挂载(类似于 Vue2 的 Vue.prototype),可以这样:
然后在组件里用
this.$message.error('xxx'),但说实话没啥必要,多导入一行的事儿更省心。血泪教训:Element Plus 的组件和 Vue2 的 Element 玩法不一样,很多新手(包括以前的我)会惯性思维去用 use() 注册,结果踩坑。直接导入才是正道。