用vue3实现留言板功能

效果图:

代码:

html 复制代码
<script setup lang="ts">
import { ref } from 'vue';

interface Message {
  name: string;
  phone: string;
  message: string;
}

const name = ref<string>('');
const phone = ref<string>('');
const message = ref<string>('');
const messages = ref<Message[]>([]);

const submitMessage = () => {
  if (name.value && phone.value && message.value) {
    const phoneRegex = /^1[0123456789]\d{9}$/;
    if (!phoneRegex.test(phone.value)) {
      alert('请输入正确的手机号!');
      return;
    }
    messages.value.unshift({
      name: name.value,
      phone: phone.value,
      message: message.value
    });
    name.value = '';
    phone.value = '';
    message.value = '';
  } else {
    alert('请填写完整的信息!');
  }
};

const deleteMessage = (index: number) => {
  messages.value.splice(index, 1);
};

const editMessage = (index: number) => {
  const editedMessage = prompt('请输入编辑后的留言内容:', messages.value[index].message);
  if (editedMessage !== null) {
    messages.value[index].message = editedMessage;
  }
};
</script>

<template>
  <div id="app">
    <h1>留言板</h1>
    <div class="message-form">
      <label for="name">留言者姓名:</label>
      <input type="text" v-model="name" placeholder="留言者姓名">
      <label for="phone">手机号:</label>
      <input type="text" v-model="phone" placeholder="手机号">
      <label for="message">留言内容:</label>
      <textarea v-model="message" placeholder="留言内容"></textarea>
      <button @click="submitMessage">提交</button>
    </div>

    <div class="message-list" v-if="messages.length > 0">
      <div v-for="(msg, index) in messages" :key="index" class="message">
        <div>留言者姓名:{{ msg.name }}</div>
        <div>手机号:{{ msg.phone }}</div>
        <div>留言内容:{{ msg.message }}</div>
        <button @click="deleteMessage(index)">删除</button>
        <button @click="editMessage(index)">编辑</button>
      </div>
    </div>
  </div>
</template>

<style scoped>
#app {
  max-width: 600px;
  margin: 0 auto;
  padding: 20px;
  font-family: 'Roboto', sans-serif;
}

h1 {
  text-align: center;
  margin-bottom: 20px;
  color: #3498db;
}

.message-form {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  margin-bottom: 20px;
}
.message-form label {
  width: 100%; 
  margin-bottom: 10px;
}

.message-form input,
.message-form textarea {
  width: 100%;
  padding: 10px;
  margin-bottom: 15px;
  border: 1px solid #ddd;
  border-radius: 5px;
  font-size: 14px;
}

.message-form button {
  padding: 10px 20px;
  background-color: #3498db;
  color: white;
  border: none;
  border-radius: 5px;
  cursor: pointer;
  font-size: 14px;
  transition: all 0.3s ease;
  display: block;
  margin: 0 auto;
}

.message-form button:hover {
  background-color: #2980b9;
}
.message-list {
  margin-top: 20px;
}

.message {
  background-color: #eef5f9;
  border-left: 4px solid #007bff;
  padding: 15px;
  margin-bottom: 10px;
  border-radius: 4px;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}

.message button {
  background-color: transparent;
  color: #007bff;
  border: 1px solid #007bff;
  margin-right: 10px;
  margin-top: 10px;
  transition: background-color 0.3s ease, color 0.3s ease;
}

.message button:hover {
  background-color: #007bff;
  color: white;
}
</style>
相关推荐
江华森1 分钟前
5Mbps 小水管也能扛:K3s 上 k6 压测 + HPA 弹性伸缩实测
前端
shuangyueliao9 分钟前
103 个小游戏的商店素材,我一张图都没手动做:截图 / 封面 / 打包 / 提审全自动
前端
用户2763965765109 分钟前
放弃 JWT 后,我给 FastAPI 游戏服务端手撸了一套 token session
javascript
ZhengEnCi10 分钟前
前端项目为什么需要一份统一的 theme.css:用 CSS 变量管住全局样式与主题切换
前端·css·前端工程化
wordbaby18 分钟前
一次微信小程序 `web-view` 跳转原生页回跳后 H5 白屏的排查与修复(Hash 路由污染)
前端
用户7218804383519 分钟前
密码骰子:结合AIUI在眼镜上生成一串16位密码
前端
江华森42 分钟前
全链路可观测落地记:kube-prometheus-stack 在 K3s 上的 8 个坑与一整套修复脚本
前端
用户84298142418101 小时前
从 JavaScript 到可运行的字节码 - ByteJS 使用指南
javascript
deli0071 小时前
27 寸 4K 开 125% 为什么发虚?PPI 和缩放一次算清
前端
OpenTiny社区1 小时前
AI Agent场景组件库 TinyRobot v1.0 正式发布:一站式打造您的AI助手
vue.js·github