vue实现邮件展示
实现邮件展示功能
在Vue中实现邮件展示功能,通常需要结合前端界面和后端数据交互。以下是关键实现步骤:
邮件列表组件
创建邮件列表组件展示邮件概要信息:
<template>
<div class="email-list">
<div v-for="email in emails" :key="email.id" class="email-item">
<div class="email-header">
<span class="sender">{{ email.sender }}</span>
<span class="subject">{{ email.subject }}</span>
<span class="date">{{ formatDate(email.date) }}</span>
</div>
<div class="email-preview">{{ email.preview }}</div>
</div>
</div>
</template>
<script>
export default {
props: ['emails'],
methods: {
formatDate(date) {
return new Date(date).toLocaleString()
}
}
}
</script>
邮件详情组件
创建单独组件展示完整邮件内容:
<template>
<div class="email-detail">
<div class="email-header">
<h3>{{ email.subject }}</h3>
<p>发件人: {{ email.sender }}</p>
<p>收件人: {{ email.recipient }}</p>
<p>日期: {{ formatDate(email.date) }}</p>
</div>
<div class="email-body" v-html="email.body"></div>
</div>
</template>
数据获取与状态管理
使用Vuex或Composition API管理邮件状态:
// 使用Composition API示例
import { ref, onMounted } from 'vue'
import axios from 'axios'
export default {
setup() {
const emails = ref([])
const currentEmail = ref(null)
const fetchEmails = async () => {
try {
const response = await axios.get('/api/emails')
emails.value = response.data
} catch (error) {
console.error('获取邮件失败:', error)
}
}
const fetchEmailDetails = async (id) => {
try {
const response = await axios.get(`/api/emails/${id}`)
currentEmail.value = response.data
} catch (error) {
console.error('获取邮件详情失败:', error)
}
}
onMounted(fetchEmails)
return { emails, currentEmail, fetchEmailDetails }
}
}
富文本内容处理
安全地渲染HTML内容:
<template>
<div v-html="sanitizedContent"></div>
</template>
<script>
import DOMPurify from 'dompurify'
export default {
computed: {
sanitizedContent() {
return DOMPurify.sanitize(this.email.body)
}
}
}
</script>
路由配置
配置Vue Router实现邮件详情导航:
const routes = [
{
path: '/emails',
component: EmailList,
children: [
{
path: ':id',
component: EmailDetail,
props: true
}
]
}
]
响应式设计
添加CSS实现响应式布局:
.email-list {
display: grid;
gap: 1rem;
}
.email-item {
border: 1px solid #eee;
padding: 1rem;
cursor: pointer;
}
.email-item:hover {
background-color: #f5f5f5;
}
@media (max-width: 768px) {
.email-header {
flex-direction: column;
}
}
附加功能实现
标记已读状态:
const markAsRead = async (id) => {
try {
await axios.patch(`/api/emails/${id}`, { read: true })
const email = emails.value.find(e => e.id === id)
if (email) email.read = true
} catch (error) {
console.error('标记已读失败:', error)
}
}
实现这些组件和功能后,可以构建完整的邮件展示界面,包括列表视图和详情视图,支持响应式布局和基本邮件操作功能。







