【Element-plus+Vue3】使用VNode作为ElNotification组件的message属性

前言

ElNotification组件是Element-plus组件库中的一个通知组件,一般用来通知文本消息,但是也可以通过在message中渲染一个Vue.VNode来实现更复杂的功能。本文将会讲解如何在ElNotification组件中渲染一个ElProgress进度条。

ElNotification组件的message属性

下面是Element-plus官方文档给出的message属性的两种基本写法
message属性描述

ElMessage('this is a message.') // message为一个字符串
ElMessage({ // message为一个h函数构造的VNode
  message: h('p', null, [
    h('span', null, 'Message can be '),
    h('i', { style: 'color: teal' }, 'VNode'),
  ]),
})

如果要在消息组件中渲染复杂的内容,就需要使用h函数构造一个VNode,下面先来介绍h函数。

h函数

h函数是一个辅助创建虚拟DOM的工具函数,它接收3个参数,分别是type, props, children,其中只有type是必传参数,h函数的返回值类型是VNode。关于h函数更详细的说明可以看渲染函数API

function h(
  type: string | Component, // 第一个参数,原生DOM元素的字符串或组件
  props?: object | null, // 第二个参数,要传递给子组件的prop
  children?: Children | Slot | Slots // 第三个参数,子节点
): VNode

实现代码

在notiBox中调用ElNotification组件,并借助h函数向ElNotification组件传入一个progress组件。

notiBox.vue
<script>
import { ElNotification } from 'element-plus'
import { h } from 'vue'
import progress from './progress.vue'

export default {
  name: 'CalculationBook',
  setup() {
    let a = 1
	let notice = ElNotification({
  	  title: '下载进度',
  	  position: 'bottom-right',
 	  duration: 0,
      message: h(progress, {
        propA: a, // 传递给子组件progress的prop
        // 事件要以onXxx的形式书写
        onFinish: (status) => { 
          if (status.value == 'ok') {
            notice.close() // 关闭ElNotification
          }
        }
      })
    })
  }
</script>
progress.vue
<template>
  <div class="task-list">
    <div class="task-item">
      <i class="iconfont icon-file-folder"></i>
      <span>下载任务列表</span>
      <el-progress
        :percentage="progress"
      />
      <span>{{ propA }}</span>
    </div>
  </div>
</template>

<script>
import { ref } from 'vue'
import { ElProgress } from 'element-plus'

export default {
  name: 'progress',
  props: ['propA'], // 接收父组件传递的prop
  emits: ['finish'], // 接收父组件传递的事件
  setup(props, { emit }) {
    let progress = ref(0)
    let status = ref('')
    // 改变进度条状态的相关逻辑代码
    function changeProgress() {
      ...
      if (progress.value >= 100 || status.value == 'ok') {
        emit('finish', status.value) // 发射事件,并传递一个参数
      }
      ...
    }
    return {
      progress,
      status,
    }
  }
}
</script>

<style scoped>
  .task-item {
    width: 290px;
    display: grid;
    grid-template-columns: 50px 1fr;
    grid-template-rows: 2fr 1fr 2fr;
    align-items: center;
  }
  .task-item i {
    font-size: 30px;
    color: rgb(252, 203, 66);
    grid-column-start: 1;
    grid-column-end: 2;
    grid-row-start: 1;
    grid-row-end: 4;
  }
</style>

实现效果

实现效果

参考资料

vue3中h函数的常见使用方式

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我们开始吧! 首先,我们需要在项目中安装 `element-plus`,你可以使用 npm 或 yarn 进行安装,比如: ``` npm install element-plus --save ``` 或者 ``` yarn add element-plus ``` 安装完成后,我们需要在 `main.ts` 中引入并使用 `element-plus`,代码如下: ```typescript import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' import App from './App.vue' const app = createApp(App) app.use(ElementPlus) app.mount('#app') ``` 现在我们已经成功引入了 `element-plus`,接下来我们可以开始编写一些组件。 例如,在 `src/components` 目录下创建一个名为 `HelloWorld.vue` 的组件,代码如下: ```vue <template> <div class="hello"> <el-button type="primary" @click="handleClick">Click me!</el-button> </div> </template> <script lang="ts"> import { defineComponent } from 'vue' import { ElButton } from 'element-plus' export default defineComponent({ name: 'HelloWorld', components: { ElButton }, methods: { handleClick() { console.log('Hello, world!') } } }) </script> ``` 在这个组件中,我们使用了 `ElButton` 组件,并在它的点击事件中打印了一条消息。 接下来,我们可以在 `App.vue` 中使用这个组件,代码如下: ```vue <template> <div id="app"> <HelloWorld /> </div> </template> <script lang="ts"> import { defineComponent } from 'vue' import HelloWorld from './components/HelloWorld.vue' export default defineComponent({ name: 'App', components: { HelloWorld } }) </script> ``` 现在,我们已经成功使用 `element-plus` 来创建了一个简单的组件,并在 `App.vue` 中使用它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值