当前位置:首页 > 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 文件中创建插件,用于全局注册和使用

实现vue message

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 中添加过渡动画

实现vue message

<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 中添加关闭按钮和方法

<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实现tab换行

vue实现tab换行

Vue实现Tab切换的常见方法 使用Vue实现Tab切换功能可以通过多种方式完成,以下是几种常见的方法: 动态组件结合v-if或v-show 通过v-if或v-show控制不同Tab内容的显示与隐…

vue 实现弹幕

vue 实现弹幕

vue 实现弹幕的方法 使用 CSS 动画和动态渲染 在 Vue 中实现弹幕效果,可以通过动态渲染弹幕元素并结合 CSS 动画实现。以下是具体步骤: 数据准备 创建一个数组存储弹幕数据,每条弹幕包…

vue实现定位

vue实现定位

Vue 中实现定位的方法 在 Vue 中实现定位可以通过以下几种方式: 使用 CSS 定位 通过 CSS 的 position 属性实现定位,Vue 中可以直接在组件的 <style>…

vue实现webapp

vue实现webapp

Vue 实现 WebApp 的基本步骤 环境准备 确保已安装 Node.js 和 npm/yarn。通过 Vue CLI 或 Vite 创建项目: npm install -g @vue/cli v…

vue实现tap

vue实现tap

Vue 实现 Tap 事件 在移动端开发中,Tap 事件比 Click 事件更常用,因为 Click 事件有 300ms 延迟。以下是几种在 Vue 中实现 Tap 事件的方法。 使用第三方库 安装…

vue 实现遮罩

vue 实现遮罩

Vue 实现遮罩层的方法 使用固定定位和透明背景 在Vue中实现遮罩层可以通过CSS固定定位结合透明背景色完成。创建一个全屏遮罩组件,利用position: fixed覆盖整个视窗。 <tem…