利用vue3仿苹果系统侧边消息提示效果实例

下面我就给您详细讲解利用vue3仿苹果系统侧边消息提示效果的完整攻略。

1. 概述

本文将介绍如何利用vue3实现仿苹果系统侧边消息提示效果。为了达到这个目的,我们将使用一些vue3的特性,如Teleport,Composition API等。

2. 准备工作

在正式开始实现之前,我们需要完成一些准备工作。

2.1 创建项目

首先,我们需要创建一个新的vue3项目。您可以使用vue-cli来完成这个任务。在终端中输入以下命令创建新的vue3项目:

npm install -g @vue/cli
vue create message-notification

2.2 安装依赖

接下来,我们需要安装几个必要的依赖,包括tailwindcss,@headlessui/vue,autoprefixerpostcss。在终端中输入以下命令安装依赖:

npm install tailwindcss @headlessui/vue autoprefixer postcss --save

2.3 配置样式

由于我们使用了tailwindcss,我们需要在项目中初始化它,为此我们需要创建一个tailwind.config.js文件:

npx tailwindcss init

2.4 组件及相关配置

现在我们已经完成了大部分的准备工作。接下来,我们需要创建两个组件,一个是MessageNotification组件,另一个是MessageList组件,用于显示通知。同时,还需要定义一些相关的vuex状态和方法。

具体代码如下:

<!-- src/components/MessageNotification.vue -->
<template>
  <div>
    <Transition
      enter-active-class="transition ease-out duration-150"
      enter-from-class="transform opacity-0 translate-y-2"
      enter-to-class="transform opacity-100"
      leave-active-class="transition ease-in duration-100"
      leave-from-class="transform opacity-100"
      leave-to-class="transform opacity-0 scale-95"
    >
      <div
        v-show="show"
        class="fixed bottom-0 right-0 mb-4 mr-4 z-50 shadow-lg rounded-lg overflow-hidden"
      >
        <div class="bg-white px-4 py-3 flex items-start">
          <div class="flex-shrink-0">
            <svg
              class="h-6 w-6 text-green-400"
              fill="none"
              stroke-linecap="round"
              stroke-linejoin="round"
              stroke-width="2"
              viewBox="0 0 24 24"
              stroke="currentColor"
            >
              <path d="M5 13l4 4L19 7"></path>
            </svg>
          </div>
          <div class="ml-3">
            <p class="text-sm font-medium text-gray-900">New message from {{ message.from }}</p>
            <p class="mt-1 text-sm text-gray-500">{{ message.content }}</p>
          </div>
        </div>
      </div>
    </Transition>
  </div>
</template>

<script>
import { defineComponent } from 'vue'
import { Transition } from '@headlessui/vue'

export default defineComponent({
  name: 'MessageNotification',
  props: {
    message: {
      type: Object,
    },
  },
  setup(props) {
    const show = true

    return {
      show,
    }
  },
})
</script>
<!-- src/components/MessageList.vue -->
<template>
  <div class="max-h-96 overflow-auto pt-3">
    <div v-for="(message, index) in messages" :key="index">
      <MessageNotification :message="message" />
    </div>
  </div>
</template>

<script>
import { defineComponent } from 'vue'
import MessageNotification from '@/components/MessageNotification.vue'

export default defineComponent({
  name: 'MessageList',
  components: {
    MessageNotification,
  },
  computed: {
    messages() {
      return this.$store.getters.getMessages
    },
  },
})
</script>
// src/store/modules/message.js
const state = {
  messages: [],
}

const getters = {
  getMessages: state => state.messages,
}

const mutations = {
  ADD_MESSAGE: (state, message) => {
    state.messages.push(message)
  },
  REMOVE_MESSAGE: (state, index) => {
    state.messages.splice(index, 1)
  },
}

const actions = {
  addMessage: ({ commit }, message) => {
    commit('ADD_MESSAGE', message)
  },
  removeMessage: ({ commit }, index) => {
    commit('REMOVE_MESSAGE', index)
  },
}

export default {
  namespaced: true,
  state,
  getters,
  mutations,
  actions,
}
// src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import store from './store'

import 'tailwindcss/dist/tailwind.css'

const app = createApp(App)

app.use(store)

app.mount('#app')
// src/store/index.js
import { createStore } from 'vuex'
import message from './modules/message'

export default createStore({
  modules: {
    message,
  },
})

3. 示例说明

现在我们已经完成了所有的准备工作。接下来,我们将展示两个例子,说明如何使用我们的MessageNotification组件。

3.1 添加新消息

我们可以在组件挂载后,通过调用store.dispatch()方法,来添加新的消息:

<template>
  <div>
    <MessageList />
  </div>
</template>

<script>
import { defineComponent, onMounted } from 'vue'
import MessageList from '@/components/MessageList.vue'
import { getRandomMessage } from '@/utils/message.js'

export default defineComponent({
  name: 'App',
  components: {
    MessageList,
  },
  setup() {
    onMounted(() => {
      const interval = setInterval(() => {
        const message = getRandomMessage()
        store.dispatch('message/addMessage', message)
      }, 1000)

      return () => clearInterval(interval)
    })
  },
})
</script>

在这个例子中,我们使用了onMounted()钩子,在组件挂载后,每隔一秒钟添加一条随机的消息到消息列表。

3.2 移除消息

我们可以使用v-for来遍历消息列表,并通过点击事件来移除指定的消息:

<template>
  <div class="max-h-96 overflow-auto pt-3">
    <div v-for="(message, index) in messages" :key="index">
      <button
        class="px-2 py-1 text-white bg-red-500"
        @click="removeMessage(index)"
      >
        X
      </button>
      <MessageNotification :message="message" />
    </div>
  </div>
</template>

<script>
import { defineComponent, computed } from 'vue'
import MessageNotification from '@/components/MessageNotification.vue'

export default defineComponent({
  name: 'MessageList',
  components: {
    MessageNotification,
  },
  computed: {
    messages() {
      return this.$store.getters.getMessages
    },
  },
  methods: {
    removeMessage(index) {
      this.$store.dispatch('message/removeMessage', index)
    },
  },
})
</script>

在这个例子中,我们在每条消息前添加了一个删除按钮,当点击按钮时,会触发removeMessage()方法,来移除指定的消息。

4. 总结

本文详细介绍了如何利用vue3实现仿苹果系统侧边消息提示效果。我们通过使用vue3的Teleport和Composition API等特性,来创建组件和定义状态,并展示了两个实例,说明如何使用这个组件。希望这篇文章能够帮助你更好地使用vue3。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用vue3仿苹果系统侧边消息提示效果实例 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue 通过公共字段,拼接两个对象数组的实例

    要完成“Vue 通过公共字段,拼接两个对象数组”的操作,可以使用Vue中的计算属性来实现。 在Vue实例的data中定义两个对象数组: data: { arr1: [ { id: 1, name: ‘A’, age: 20 }, { id: 2, name: ‘B’, age: 22 }, { id: 3, name: ‘C’, age: 18 }, ], …

    Vue 2023年5月27日
    00
  • Vue3源码解析watch函数实例

    Vue3源码解析watch函数实例 在Vue3.x中,watch函数作为一个重要的API存在,它能够对一个值进行监测,当这个值发生变化时,就可以执行相关的回调函数。本文将分享一个完整的攻略,来解析Vue3源码中watch函数的实现。 1. watch函数的基本用法 在Vue3.x中,watch函数的基本用法如下: // 监听一个值 watch( // 被监听…

    Vue 2023年5月27日
    00
  • Vue项目分环境打包的实现步骤

    实现Vue项目的环境分离,可以很好地满足开发、测试和生产环境的需求,同时也能提高代码的重用性和可维护性。以下是Vue项目分环境打包的实现步骤: 1. 创建环境变量配置文件 在Vue项目的根目录下,创建一个.env文件,用来存放全局的环境变量配置。同时在.env文件中定义两个变量:VUE_APP_API_URL和VUE_APP_DEBUG_MODE。其中,VU…

    Vue 2023年5月27日
    00
  • VUE axios每次请求添加时间戳问题

    问题描述 在使用Vue.js框架中的axios发送请求时,我们可能需要在每次请求的url后加上时间戳,以避免缓存导致的数据不同步问题。这时候,我们可以通过拦截器的方式向请求的url中添加时间戳。 攻略步骤 创建axios实例 在main.js中,我们需要引入axios,并创建一个axios的实例,通过该实例对数据请求进行管理,具体代码如下: import a…

    Vue 2023年5月29日
    00
  • axios向后台传递数组作为参数的方法

    当使用 axios 向后台传递数组作为参数时,可以通过两种方法来实现。 方法一:使用 URLSearchParams 对象 在前端将数组转换为 URLSearchParams 对象,再通过 axios 发送请求。具体代码如下: import axios from ‘axios’; const params = new URLSearchParams(); c…

    Vue 2023年5月29日
    00
  • vue判断input输入内容全是空格的方法

    要判断 Vue 组件中的 input 输入框是否全是空格,需要借助正则表达式和 trim 方法。 具体实现步骤如下: 步骤一:使用正则表达式 首先,定义一个正则表达式,用于匹配输入框中是否全是空格。正则表达式可以这样定义: const reg = /^\s*$/ 这个正则表达式的意思是:以空白符(包括空格、制表符和换行符)开头和结尾,并且中间没有其他字符。 …

    Vue 2023年5月27日
    00
  • vue3使用reactive包裹数组正确赋值问题

    当我们在Vue3中使用reactive包装一个对象时,如果该对象中存在数组,我们需要特别注意对数组进行正确的赋值。在Vue3中对数组的正确赋值方式相对于Vue2中有了一定的变化。 下面是一个使用Vue3中的reactive包装的对象的示例: import { reactive } from ‘vue’ const state = reactive({ nam…

    Vue 2023年5月28日
    00
  • vue3中reactive数据被重新赋值后无法双向绑定的解决

    在Vue3中,数据响应式的实现由Vue2中的Object.defineProperty改为了ES6的Proxy,使得Vue3的响应式系统在性能和功能上都有了提升。但是,在Vue3中,当我们直接给响应式对象中的属性进行重新赋值时,这个属性就会脱离响应式系统,从而失去了双向绑定的功能,即无法自动更新页面。下面给出两个示例,分别说明这个问题的存在及解决方式。 问题…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部