vue3里如何使用naive ui的useMessage

5,507 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

一、前言

之前在用naive ui的表格组件的时候,我引入了个useMessage,当时不够熟悉data-table组件和vue3语法,还以为是我写错了,后面我按照官网给的例子引入,发现一直获取不到。所以专门开了一期,来稍微讲讲useMessage组件。

二、错误示范

我先举一下当时我的错误例子

首先我在xx.vue文件里引入了

import { useMessage } from 'naive-ui'

然后我在setup函数里,调用了下面这两个语句

const message = useMessage()
message.info(`Play`)

到这里我还是觉得很正常,我引入了一个东西,然后我调用它生成了message变量,然后我给message变量赋值。这是我一贯的思维,naive ui里data-table给出的相关使用例子也是这样用的,但是现实是,此处的message会是undefined,根本就没有正确使用。

想不通的我只能点开对应的组件api,才有了第三点

三、useMessage

查了一圈,基本主流都是组件的方式,挂载到全局使用。

1、创建自定义组件usemessageComponents.vue

内容比较简单,引入useMessage之后,在setup函数里,将useMessage挂载到window上的message

<script lang="ts">
import { useMessage } from 'naive-ui'
import { defineComponent } from 'vue'

// content
export default defineComponent({
  setup () {
    window.$message = useMessage() // 关键代码
  }
})
</script>

2、ts版本的话,此时会报错

image.png

在main.ts同级,创建message.d.ts(xxx.d.ts,名称随意)

import type { MessageApiInjection } from "naive-ui/lib/message/src/MessageProvider"
declare global {
  interface Window {
      $message: MessageApiInjection
  }
}

我看到有资料说declare global在typescript 3.4之后失效(本人不确定,只是道听途说)

直接用下列写法即可

  import type { MessageApiInjection } from "naive-ui/lib/message/src/MessageProvider"
  interface Window {
      $message: MessageApiInjection
  }
  
  

我的typescript 4.8.3表示,第一种写法可以,第二种写法会读取不到。

3、在APP.vue用n-message-provider包裹内容

引入一下我们上面创建的自定义组件

  import usemessageComponents from './components/usemessageComponents.vue'
  

然后在template里写入该内容,官方推荐写法,用n-message-provider包裹

  <n-message-provider>
    <usemessageComponents />
  </n-message-provider>

n-message-provider我已经在main.ts里全局抛出,如果没有全局抛出,那就可以单独引入

  import { NMessageProvider } from "naive-ui"
  

4、之后在我们的demo文件里,调用

注意不要直接在setup里调用该函数,此时会undefined,可以用nextTick,setTimeout等方式,转异步调用,或者在setup声明好函数,在渲染完成之后,点击调用。

这两种都可以在页面加载时成功调用

 <script lang="ts">
import { nextTick } from 'vue'

setTimeout(() => {
  const message = window.$message
    console.log(message)
    message.success('naive-ui 中$message的使用方式')
}, 1000)
nextTick(() => {
  const message = window.$message
    console.log(message)
    message.success('naive-ui 中$message的使用方式')
})
</script>

或者定义好mess函数,

  <script lang="ts">
  export default defineComponent({
  setup() {

    function mess():void {
      const message = window.$message
      console.log(message)
      message.success('naive-ui 中$message的使用方式')
    }
    // 必须像vue2那样return出来
    return {
      mess
    }
  }
})
  </script>
 

在标签里点击调用

  <span @click="mess">DATA-TABLE表格</span>

效果,能正常弹出效果,具体参数和api,后续我们再一一尝试

image.png

三、 小结

今天试验了好多次,网上的资料比较少,大多数都没啥用,多方查验才终于试出来适合本项目vite构建的vue3+ts的写法, 大家伙也可以配置一下试试看,希望本文能对你们有所帮助吧。

ps: 我是地霊殿__三無,加班只能水一水了。

Snipaste_2022-07-19_15-30-26.jpg