当前位置:首页 > VUE

实现vue message

2026-03-07 14:32:55VUE

实现 Vue Message 组件

使用 Vue 3 Composition API 创建 Message 组件

创建一个 Message.vue 文件,定义组件的基本结构和样式

<template>
  <div v-if="visible" class="message" :class="type">
    {{ content }}
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'

const props = defineProps({
  content: String,
  type: {
    type: String,
    default: 'info'
  },
  duration: {
    type: Number,
    default: 3000
  }
})

const visible = ref(false)

onMounted(() => {
  visible.value = true
  setTimeout(() => {
    visible.value = false
  }, props.duration)
})
</script>

<style scoped>
.message {
  position: fixed;
  top: 20px;
  left: 50%;
  transform: translateX(-50%);
  padding: 10px 20px;
  border-radius: 4px;
  color: white;
  z-index: 9999;
}

.info {
  background-color: #1890ff;
}

.success {
  background-color: #52c41a;
}

.warning {
  background-color: #faad14;
}

.error {
  background-color: #f5222d;
}
</style>

创建 Message 插件

message.js 文件中创建插件,用于全局注册和使用

import { createApp, h } from 'vue'
import Message from './Message.vue'

const message = {
  install(app) {
    const showMessage = (options) => {
      const { content, type, duration } = options

      const messageApp = createApp({
        render() {
          return h(Message, {
            content,
            type,
            duration
          })
        }
      })

      const fragment = document.createDocumentFragment()
      messageApp.mount(fragment)
      document.body.appendChild(fragment)
    }

    app.config.globalProperties.$message = showMessage
  }
}

export default message

在 main.js 中注册插件

import { createApp } from 'vue'
import App from './App.vue'
import message from './message'

const app = createApp(App)
app.use(message)
app.mount('#app')

使用 Message 组件

在组件中可以通过以下方式调用

// 在 setup 中获取
import { getCurrentInstance } from 'vue'

const { proxy } = getCurrentInstance()
proxy.$message({
  content: '这是一条消息',
  type: 'success',
  duration: 2000
})

// 在选项式 API 中
this.$message({
  content: '这是一条消息',
  type: 'error'
})

添加动画效果

在 Message.vue 中添加过渡动画

<template>
  <transition name="fade">
    <div v-if="visible" class="message" :class="type">
      {{ content }}
    </div>
  </transition>
</template>

<style scoped>
.fade-enter-active,
.fade-leave-active {
  transition: opacity 0.3s, transform 0.3s;
}

.fade-enter-from,
.fade-leave-to {
  opacity: 0;
  transform: translate(-50%, -20px);
}
</style>

支持多个消息同时显示

修改 message.js 以支持多个消息

const message = {
  install(app) {
    const showMessage = (options) => {
      const { content, type = 'info', duration = 3000 } = options
      const mountNode = document.createElement('div')
      document.body.appendChild(mountNode)

      const messageApp = createApp({
        render() {
          return h(Message, {
            content,
            type,
            duration,
            onClose: () => {
              messageApp.unmount()
              document.body.removeChild(mountNode)
            }
          })
        }
      })

      messageApp.mount(mountNode)
    }

    app.config.globalProperties.$message = showMessage
  }
}

添加关闭方法

在 Message.vue 中添加关闭按钮和方法

实现vue message

<template>
  <transition name="fade">
    <div v-if="visible" class="message" :class="type">
      {{ content }}
      <span class="close-btn" @click="close">×</span>
    </div>
  </transition>
</template>

<script setup>
const emit = defineEmits(['close'])

const close = () => {
  visible.value = false
  emit('close')
}
</script>

<style scoped>
.close-btn {
  margin-left: 15px;
  cursor: pointer;
}
</style>

标签: vuemessage
分享给朋友:

相关文章

vue广告实现

vue广告实现

Vue 广告实现方法 在 Vue 项目中实现广告功能可以通过多种方式完成,具体取决于广告类型和需求。以下是几种常见的实现方法: 使用第三方广告平台 许多广告平台如 Google AdSense、百…

vue 实现拖拉

vue 实现拖拉

Vue 实现拖拽功能的方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue实现curd

vue实现curd

Vue实现CRUD操作 初始化Vue项目 使用Vue CLI创建新项目,安装必要依赖如axios用于HTTP请求 vue create crud-demo cd crud-demo npm inst…

vue实现刷新

vue实现刷新

Vue 实现页面刷新的方法 在Vue中实现页面刷新可以通过多种方式,以下是几种常见的方法: 使用 window.location.reload() 通过调用浏览器的原生方法强制刷新当前页面:…

vue实现数据

vue实现数据

Vue 实现数据绑定的方法 Vue.js 提供了多种方式实现数据绑定,包括双向绑定、单向绑定以及动态数据绑定。以下是几种常见的实现方式: 双向数据绑定(v-model) 双向数据绑定通常用于表单元素…

vue实现layout

vue实现layout

Vue 实现 Layout 布局的方法 在 Vue 中实现 Layout 布局通常涉及路由嵌套、组件化设计和动态渲染。以下是几种常见的实现方式: 使用嵌套路由 通过 Vue Router 的嵌套路由…