博客 分类专栏 专题 成员
用原生JS和vue3开发一个静态留言板
2023-02-10 03:51:29
分类专栏: Vue3

使用原生js开发

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>留言板</title>
    <style type="text/css">
        body {
            text-align: center;
            background: #ddd;
        }

        .message-board {
            background: #fff;
            margin: 0px auto;
            width: 1000px;
            text-align: left;
            padding: 20px;
        }

        .no-data {
            color: rgb(63, 63, 63);
            text-align: center;
        }

        .message-item {
            border-bottom: 1px solid #ddd;
            padding: 10px;
        }

        .message-item .nick-name {
            color: rgb(81, 80, 80);
            font-size: 14px;
        }

        .send-time {
            margin-left: 10px;
            font-size: 13px;
        }

        .del {
            cursor: pointer;
            color: red;
            margin-left: 10px;
        }

        .message-item .message {
            margin-top: 5px;
        }

        .part-title {
            font-size: 18;
            border-left: 2px solid rgb(16, 106, 202);
            padding-left: 10px;
            font-weight: bold;
            margin-top: 10px;
        }

        .input-panel {
            display: flex;
            align-items: center;
            margin-top: 5px;
        }

        .input-panel textarea {
            height: 50px;
            width: 100%;
            flex: 1;
            padding: 0px;
            resize: none;
        }

        .input-panel .send-btn {
            width: 51px;
            height: 51px;
            line-height: 50px;
            background: rgb(8, 141, 194);
            color: #fff;
            text-decoration: none;
            text-align: center;
            margin-left: 10px;
        }
    </style>
    <script type="text/javascript">
        const messageList = [];
        const render = () => {
            const messageListDom = document.querySelector("#message-list");
            messageListDom.innerHTML = "";
            messageList.forEach((item, index) => {
                const messageItem = document.createElement("div");
                messageItem.setAttribute("class", "message-item");
                messageListDom.appendChild(messageItem);

                const nickNameDom = document.createElement("div");
                nickNameDom.setAttribute("class", "nick-name");
                messageItem.appendChild(nickNameDom);

                //昵称
                const nameSpan = document.createElement("span");
                nameSpan.innerHTML = item.nickName;
                nickNameDom.appendChild(nameSpan);

                //时间
                const timeSpan = document.createElement("span");
                timeSpan.setAttribute("class", "send-time");
                timeSpan.innerHTML = item.sendTime;
                nickNameDom.appendChild(timeSpan);

                //删除
                const delSpan = document.createElement("span");
                delSpan.setAttribute("class", "del");
                delSpan.innerHTML = "删除";
                delSpan.addEventListener("click", () => {
                    delMessage(index);
                });
                nickNameDom.appendChild(delSpan);

                const messageDom = document.createElement("div");
                messageDom.setAttribute("class", "message");
                messageDom.innerHTML = item.message;
                messageItem.appendChild(messageDom);
            })
            if (messageList.length == 0) {
                const noData = document.createElement("div");
                noData.setAttribute("class", "no-data");
                noData.innerHTML = "暂无留言,请留言";
                messageListDom.appendChild(noData);
            }
        }

        const sendMsg = () => {
            const nickNameDom = document.querySelector("#nick-name-input");
            const messageDom = document.querySelector("#message-input");
            const nickNameDomValue = nickNameDom.value.trim();
            const messageDomValue = messageDom.value.trim();
            if (nickNameDomValue === "") {
                alert("请输入昵称");
                return;
            }
            if (messageDomValue === "") {
                alert("请输入留言内容");
                return;
            }
            messageList.push({
                nickName: nickNameDomValue,
                message: messageDomValue,
                sendTime: new Date().toLocaleString()
            })
            nickNameDom.value = "";
            messageDom.value = "";
            render();
        }

        //删除留言
        const delMessage = (index) => {
            messageList.splice(index, 1);
            render();
        }
    </script>
</head>

<body>
    <div class="message-board">
        <div class="part-title">留言列表</div>
        <div id="message-list">
            <div class="no-data">暂无留言,请留言</div>
            <!--  <div class="message-item">
                <div class="nick-name">
                    <span>昵称</span>
                    <span class="send-time">2023-02-08 12:41</span>
                    <span class="del" onclick="delMessage()">删除</span>
                </div>
                <div class="message">
                    留言内容留言内容留言内容留言内容留言内容留言内容
                </div>
            </div> -->
        </div>
        <div class="part-title">发送留言</div>
        <div class="form-panel">
            <form>
                <div class="user-name">
                    昵称:<input type="input" id="nick-name-input" />
                </div>
                <div class="input-panel">
                    <div>留言:</div>
                    <textarea id="message-input"></textarea>
                    <a href="javascript:void(0)" onclick="sendMsg()" class="send-btn">发送</a>
                </div>
            </form>
        </div>
    </div>
</body>

</html>

使用vue3开发

<template>
  <div>
    <div class="message-board">
      <div class="part-title">留言列表</div>
      <div id="message-list">
        <div class="no-data" v-if="messageList.length == 0">
          暂无留言,请留言
        </div>
        <div class="message-item" v-for="(item, index) in messageList">
          <div class="nick-name">
            <span>{{ item.nickName }}</span>
            <span class="send-time">{{ item.sendTime }}</span>
            <span class="del" @click="delMessage(index)">删除</span>
          </div>
          <div class="message">
            {{ item.message }}
          </div>
        </div>
      </div>
      <div class="part-title">发送留言</div>
      <div class="form-panel">
        <form>
          <div class="user-name">
            昵称:<input
              type="input"
              id="nick-name-input"
              v-model.trim="nickName"
            />
          </div>
          <div class="input-panel">
            <div>留言:</div>
            <textarea id="message-input" v-model="message"></textarea>
            <a href="javascript:void(0)" @click="sendMsg()" class="send-btn"
              >发送</a
            >
          </div>
        </form>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref } from "vue";

const messageList = ref([]);

const nickName = ref();
const message = ref();

const sendMsg = () => {
  const nickNameDomValue = nickName.value;
  const messageDomValue = message.value.trim();
  if (nickNameDomValue === "") {
    alert("请输入昵称");
    return;
  }
  if (messageDomValue === "") {
    alert("请输入留言内容");
    return;
  }
  messageList.value.push({
    nickName: nickNameDomValue,
    message: messageDomValue,
    sendTime: new Date().toLocaleString(),
  });
  nickName.value = "";
  message.value = "";
};

const delMessage = (index) => {
  messageList.value.splice(index, 1);
};
</script>

<style lang="scss" >
body {
  text-align: center;
  background: #ddd;
}

.message-board {
  background: #fff;
  margin: 0px auto;
  width: 1000px;
  text-align: left;
  padding: 20px;
}

.no-data {
  color: rgb(63, 63, 63);
  text-align: center;
}

.message-item {
  border-bottom: 1px solid #ddd;
  padding: 10px;
}

.message-item .nick-name {
  color: rgb(81, 80, 80);
  font-size: 14px;
}

.send-time {
  margin-left: 10px;
  font-size: 13px;
}

.del {
  cursor: pointer;
  color: red;
  margin-left: 10px;
}

.message-item .message {
  margin-top: 5px;
}

.part-title {
  font-size: 18;
  border-left: 2px solid rgb(16, 106, 202);
  padding-left: 10px;
  font-weight: bold;
  margin-top: 10px;
}

.input-panel {
  display: flex;
  align-items: center;
  margin-top: 5px;
}

.input-panel textarea {
  height: 50px;
  width: 100%;
  flex: 1;
  padding: 0px;
  resize: none;
}

.input-panel .send-btn {
  width: 51px;
  height: 51px;
  line-height: 50px;
  background: rgb(8, 141, 194);
  color: #fff;
  text-decoration: none;
  text-align: center;
  margin-left: 10px;
}
</style>

可以发现,使用vue这样的高级框架能提高我们的开发效率,我们只需要关注数据的处理,无需关注页面动态渲染。