按照文档说明,在vue3中通过globalProperties全局注册message后,如何使用?
H-Sven opened this issue · 12 comments
- I have searched the issues of this repository and believe that this is not a duplicate.
What problem does this feature solve?
app.config.globalProperties.$message = message
这样注册后,组件中如何使用
What does the proposed API look like?
app.config.globalProperties.$message = message
这样注册后,组件中如何使用
vue 3 也支持 vue 2的 options API,如果你用 options API 的写法,应该就可以 this.$message({/.../})
调用了。
至于 vue 3 想在 composition API 中使用,我也没找到什么好的方法...或许可以使用 provide/inject
,要不就每次import { Message } from 'ant-design-vue'
。这种方法我没有详细去研究,可能每次引入都会创建一个新的对象,有点耗性能吧....
关于全局变量的使用方法,我也从 vue 3 的 issue 一直找,都没找到好的(或许我没注意吧),似乎尤大有在 issue 中回复说全局的东西用 provide/inject
注入,这样也能够清晰知道是来自哪里😂
如果兄弟你找到了好的方法,还麻烦告知一声~
大致研究了一下,个人猜测是这样的(实测行得通)。
const app = createApp(App)
const value = 'Hello Vue3 and Vite!'
app.use(antd)
// Vue3 中Composition API 可用 (inject('$message'))
app.provide('$message', value)
// Vue2 中Option API可用 (this.$message)
app.config.globalProperties.$message = value
@gk-shi @dong19950 之前在vantUI的交流群中得到了解答
可以使用如下方法获取,但是这个api并没有在vue3的文档中写,所以好像是说不建议使用
app.config.globalProperties.$message = message
全局注册后
setup() {
const { ctx } = getCurrentInstance() // 获取上下文,类似原来的this
const showMessage = () => {
ctx.$message.success('this is message')
}
return {
showMessage
}
}
import { message } from 'ant-design-vue'
可以在 setup
里面直接调用
大致研究了一下,个人猜测是这样的(实测行得通)。
const app = createApp(App)
const value = 'Hello Vue3 and Vite!'app.use(antd)
// Vue3 中Composition API 可用 (inject('$message'))
app.provide('$message', value)// Vue2 中Option API可用 (this.$message)
app.config.globalProperties.$message = value
大致研究了一下,个人猜测是这样的(实测行得通)。
const app = createApp(App)
const value = 'Hello Vue3 and Vite!'app.use(antd)
// Vue3 中Composition API 可用 (inject('$message'))
app.provide('$message', value)// Vue2 中Option API可用 (this.$message)
app.config.globalProperties.$message = value
试了下,不行 啊
大致研究了一下,个人猜测是这样的(实测行得通)。
const app = createApp(App)
const value = 'Hello Vue3 and Vite!'
app.use(antd)
// Vue3 中Composition API 可用 (inject('$message'))
app.provide('$message', value)
// Vue2 中Option API可用 (this.$message)
app.config.globalProperties.$message = value大致研究了一下,个人猜测是这样的(实测行得通)。
const app = createApp(App)
const value = 'Hello Vue3 and Vite!'
app.use(antd)
// Vue3 中Composition API 可用 (inject('$message'))
app.provide('$message', value)
// Vue2 中Option API可用 (this.$message)
app.config.globalProperties.$message = value试了下,不行 啊
// main.ts
import { message } from 'ant-design-vue'
const app = createApp(App)
app.config.globalProperties.$message = message
app.provide('$message', message)
// ...
// home.vue
// .... Composition API vue 3.0 写法
setup () {
const mes = inject('$message')
mes.success('test $message injected.')
}
// .... options API // vue 2.0 写法,去绑定事件或者其他操作都行
methods: {
testMessage () {
this.$message.success('测试 options API message')
}
}
// ...
这两种方式我测试都是可行的,对于getCurrentInstance()
在 Composition API 中我前面有使用验证过,也是可行的(当然,我偶尔碰到过一次是 null
的,忘记是怎么个情形了)
不知道你还有哪里设置不可以吗😋
大致研究了一下,个人猜测是这样的(实测行得通)。
const app = createApp(App)
const value = 'Hello Vue3 and Vite!'
app.use(antd)
// Vue3 中Composition API 可用 (inject('$message'))
app.provide('$message', value)
// Vue2 中Option API可用 (this.$message)
app.config.globalProperties.$message = value大致研究了一下,个人猜测是这样的(实测行得通)。
const app = createApp(App)
const value = 'Hello Vue3 and Vite!'
app.use(antd)
// Vue3 中Composition API 可用 (inject('$message'))
app.provide('$message', value)
// Vue2 中Option API可用 (this.$message)
app.config.globalProperties.$message = value试了下,不行 啊
// main.ts import { message } from 'ant-design-vue' const app = createApp(App) app.config.globalProperties.$message = message app.provide('$message', message) // ...// home.vue // .... Composition API vue 3.0 写法 setup () { const mes = inject('$message') mes?.success('test $message injected.') } // .... options API // vue 2.0 写法,去绑定事件或者其他操作都行 methods: { testMessage () { this.$message.success('测试 options API message') } } // ...
这两种方式我测试都是可行的,对于
getCurrentInstance()
在 Composition API 中我前面有使用验证过,也是可行的(当然,我偶尔碰到过一次是null
的,忘记是怎么个情形了)不知道你还有哪里设置不可以吗😋
// .... Composition API vue 3.0 写法 setup () { const mes = inject('$message') mes?.success('test $message injected.') }
我使用是可以的。特意重试了一遍,你那边有错误
1.、结构出来的组件是Message,而不是message
2、mes? 不知道是不是笔误?
统一回复,provide/inject这样使用,可以直接复制代码运行
// main.js
import { createApp } from 'vue'
import App from './App.vue'
import { Message } from 'ant-design-vue'
// 没有按需引入的话,需要引入以下css
// import 'ant-design-vue/dist/antd.css'
const app = createApp(App)
app.provide('$message', Message)
app.mount('#app')
// HelloWorld.vue
import { onMounted, inject } from 'vue'
export default {
setup() {
const message = inject('$message')
onMounted(() => {
message.warning('听说不能成功?')
})
}
}
@gk-shi @dong19950 之前在vantUI的交流群中得到了解答
可以使用如下方法获取,但是这个api并没有在vue3的文档中写,所以好像是说不建议使用
app.config.globalProperties.$message = message
全局注册后setup() { const { ctx } = getCurrentInstance() // 获取上下文,类似原来的this const showMessage = () => { ctx.$message.success('this is message') } return { showMessage } }
如果项目是完整引入了Antd的组件而不是按模块引入message组件,该如何使用provide/inject?哪位壮士给解答一下?
大致研究了一下,个人猜测是这样的(实测行得通)。
const app = createApp(App)
const value = 'Hello Vue3 and Vite!'
app.use(antd)
// Vue3 中Composition API 可用 (inject('$message'))
app.provide('$message', value)
// Vue2 中Option API可用 (this.$message)
app.config.globalProperties.$message = value大致研究了一下,个人猜测是这样的(实测行得通)。
const app = createApp(App)
const value = 'Hello Vue3 and Vite!'
app.use(antd)
// Vue3 中Composition API 可用 (inject('$message'))
app.provide('$message', value)
// Vue2 中Option API可用 (this.$message)
app.config.globalProperties.$message = value试了下,不行 啊
// main.ts import { message } from 'ant-design-vue' const app = createApp(App) app.config.globalProperties.$message = message app.provide('$message', message) // ...// home.vue // .... Composition API vue 3.0 写法 setup () { const mes = inject('$message') mes?.success('test $message injected.') } // .... options API // vue 2.0 写法,去绑定事件或者其他操作都行 methods: { testMessage () { this.$message.success('测试 options API message') } } // ...
这两种方式我测试都是可行的,对于
getCurrentInstance()
在 Composition API 中我前面有使用验证过,也是可行的(当然,我偶尔碰到过一次是null
的,忘记是怎么个情形了)
不知道你还有哪里设置不可以吗😋
// .... Composition API vue 3.0 写法 setup () { const mes = inject('$message') mes?.success('test $message injected.') }
我使用是可以的。特意重试了一遍,你那边有错误
1.、结构出来的组件是Message,而不是message
2、mes? 不知道是不是笔误?
第一点:
我解构出来 message
我是真实代码实验过了的,Message
我没试过,但我估计Message
解构的是组件,message
解构的是全局方法吧。
第二点:那个问号,因为我自己写的是ts
,然后这里回复的时候我把类型判断全去了,那个问号应该是我习惯性对属性的非空判断加上去了😹
@gk-shi @dong19950 之前在vantUI的交流群中得到了解答
可以使用如下方法获取,但是这个api并没有在vue3的文档中写,所以好像是说不建议使用
app.config.globalProperties.$message = message
全局注册后setup() { const { ctx } = getCurrentInstance() // 获取上下文,类似原来的this const showMessage = () => { ctx.$message.success('this is message') } return { showMessage } }
如果项目是完整引入了Antd的组件而不是按模块引入message组件,该如何使用provide/inject?哪位壮士给解答一下?
完整引入之后,antd
是在全局挂载了对应方法的。
如果是用options API
的方法,还是直接this.$message
就能调用。
如果是用Composition API
的话,我目前知道的是可以通过上面说到的getCurrentInstance()
方法获取到根实例,然后.$message
调用的。
如果想provide/inject
,我暂时没有去实验过,但我觉得可能还是要自己单独把message
解构,然后再app.provide('$message', message)
这样吧,因为我觉得这样会比较符合vue 3
设计的准则,就是你在inject
的时候,能明确知道是哪里provide
的。
虽然这样看起来变繁琐了,但可能对于属性、方法流向比较明确吧.😊
如果所述有误或者没有涉及的,还望各位大佬批评指正和补充一下,我也能顺带学习一下😋