【后端速成 Vue】实现动态表白墙

news2024/9/24 15:26:44

前言:

通过前面几篇的文章的讲解,已经学习到了很多的 Vue 指令了,那么现在就将学习到的指令利用起来,做一个小的 demo。

最终效果图:

通过效果图可以发现,一共有这几个功能:

● 渲染列表:也就是动态的展示表白的数据。

● 删除功能:每条数据后面有一个删除按钮,单击即可删除指定数据。

● 添加功能:可以输入对应的文字,添加到表白列表中。

● 统计清空:程序会统计当前表白的条数,单击清空按钮会清空所有的表白。


1、渲染列表

这个功能很简单,使用 v-for 就可以实现,首先需要准备要渲染的元素和数据,这里使用一个 list 的装需要渲染的数据,每个 list 里面放一个对象,对象分别有两个属性,id 和 content,伪代码实现:

<ul class="data-list" id="dataList">
    <li class="data-item" v-for="item in list" :key="item.id">
        <span class="content">{{ item.content }}</span>
        <button class="delete-btn" @click="del(item.id)">删除</button>
    </li>
</ul>
<script>
    const app = new Vue({
        el: '#app',
        data: {
            list: [
                { id: 1, content: '篮球哥太帅了吧!!!' },
                { id: 2, content: '我要去篮球哥的心里.' }
            ]
        }
    }
</script>

2、删除功能

删除类似之前写过的音乐清单,通过 id,进行删除,伪代码如下:

del (id) {
    this.list = this.list.filter(item => item.id !== id)
}

3、添加功能

这里直接往 list 数组中最前面插入一条数据就是,此处采取的是 unshift 方法,id 使用当前的时间戳表示,正常来说这里的数据是通过后端返回的,目前为了演示功能,暂时先这样写。

add () {
    this.list.unshift({
        id: +new Date(),
        content: this.value
    })
    // 插入完成后, 清空值
    this.value = ''
}

4、统计清空

统计只需要统计当前的 list.length 就可以了,所以使用差值表达式即可。

<div><p>共 <span id="count">{{ list.length }}</span> 条数据</p></div>

清空只需要将 list 等于一个新的空 list 即可。

clear() {
    this.list = []
}

5、完整代码

<!DOCTYPE html>
<html>
<head>
  <title>表白墙</title>
  <style>
    * {
        margin: 0;
        padding: 0;
    }
    body {
        background-color: #edecec;
    }
    .container {
      max-width: 600px;
      margin: 50px auto;
      padding: 20px;
      background-color: white;
      border-radius: 10px;
      box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3);
    }
    .container h1 {
        text-align: center;
    }
    .input-container {
        padding: 20px 0;
        display: flex;
        justify-content: space-between;
        align-items: center;
    }
    .input-container input {
        width: 90%;
        height: 40px;
        border: 1px solid black;
        border-right: none;
        padding-left: 10px;
      box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3);

    }
    .input-container button {
        width: 10%;
        height: 41px;
        border: 1px solid black;
        border-left: none;
        cursor: pointer;
      box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.3);

    }
    .data-list {
      list-style-type: none;
      padding: 0;
    }
    .data-item {
      height: 40px;
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin: 10px 0;
      background-color: rgb(255, 255, 255);
      box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.2);
      border-radius: 5px;
      border: 1px solid green;
    }
    .content {
        padding-left: 20px;
    }
    .delete-btn {
      color: #ff0000;
      border: none;
      padding: 5px 10px;
      cursor: pointer;
      background: none;
    }
    .stats {
      margin-top: 20px;
      display: flex;
      justify-content: space-between;
    }
    #clearBtn {
        cursor: pointer;
        background: none;
        border: none;
    }
    .clear-btn {
      background-color: #ff0000;
      color: #fff;
      border: none;
      padding: 5px 10px;
      cursor: pointer;
    }
  </style>
</head>
<body>
  <div class="container" id="app">
    <h1>表白墙</h1>
    <div class="input-container">
      <input type="text" id="messageInput" placeholder="输入表白内容" v-model="value">
      <button id="addBtn" @click="add()">添加</button>
    </div>
    <ul class="data-list" id="dataList">
        <li class="data-item" v-for="item in list" :key="item.id">
            <span class="content">{{ item.content }}</span>
            <button class="delete-btn" @click="del(item.id)">删除</button>
        </li>
    </ul>
    <div class="stats" v-show=" list.length > 0">
      <div><p>共 <span id="count">{{ list.length }}</span> 条数据</p></div>
      <button id="clearBtn" @click="clear()">清空数据</button>
    </div>
  </div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
<script>
    const app = new Vue({
        el: '#app',
        data: {
            value: '',
            list: [
                { id: 1, content: '篮球哥太帅了吧!!!' },
                { id: 2, content: '我要去篮球哥的心里.' }
            ]
        },
        methods: {
            del (id) {
                this.list = this.list.filter(item => item.id !== id)
            },
            add () {
                this.list.unshift({
                    id: +new Date(),
                    content: this.value
                })
                // 插入完成后, 清空值
                this.value = ''
            },
            clear() {
                this.list = []
            }
        }
    })
</script>
</html>

对于这个小 demo 需要注意,当 list 没有元素的时候,是不能展示最下面的统计和清空数据按钮的,所以此处采用 v-show 来控制元素的显示和隐藏,其他的就是把前面学习的指令给综合起来了,这个 demo 没有什么难度,重点是练习前面学习的指令,建议看完这个功能之后,自己能写出来一个类似的,这样就能很好的巩固指令的知识点了。

6、更多建议

就业市场的行情愈发严峻,对于计算机专业的毕业生和求职者来说,找工作似乎变得更加具有挑战性。但别担心,机会总是留给有准备的人。

最新招聘可以通过下面小程序获取最新企业招聘信息,都是新岗位,可内推,完善好简历投递,可以简历托管,让HR主动联系你。加油,计算机人!未来仍可期!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Raft分布式存储

文章目录 前言一、项目大纲二、Raft模块1.Raft介绍2.大致内容Leader与选举日志同步、心跳raft日志的两个特点 3.主要流程1. raft类的定义2.启动初始化3.竞选leaderelectionTimeOutTicker:doElectionsendRequestVoteRequestVote 4.日志复制、心跳leaderHearBeatTickerdoHeartBea…

华媒舍:6种明星代言推广策略,轻松吸引消费者目光!

1. 背书代言 背书代言是最常见的明星代言策略之一&#xff0c;也是最直接有效的一种方式。背书代言通过让明星以自己的名义、形象和声誉来推荐特定产品或服务&#xff0c;以吸引消费者的关注和购买意愿。这种策略依托于明星在社交媒体、电视广告等渠道的影响力&#xff0c;可以…

【npm】如何将自己的插件发布到npm上

前言 简单说下 npm 是什么&#xff1a; npm 是一个 node 模块管理工具&#xff0c;也是全球最大的共享源。 npm 工具与 nodejs 配套发布&#xff0c;便利开发人员共享代码。npm 主要包括 npm 官方网站、CLI&#xff08;控制台命令行工具&#xff09;、和 registry&#xff08;…

【可能是全网最丝滑的LangChain教程】二十、LangChain进阶之Chains

我们笑着说再见&#xff0c;却深知再见遥遥无期。 01 Chain介绍 在LangChain 中&#xff0c;“Chain” 是指一系列可以串联起来执行特定任务的组件或模型。这些链条可以包括预处理、模型调用、后处理等步骤&#xff0c;它们共同工作以完成一个复杂的语言处理任务。 咱说点人话…

3:svgicon的使用的整体步骤

1&#xff1a;在src下创建icons文件放入svg文件的icon&#xff0c;并切创建index.js, 来处理icon 主要创建&#xff1a;1&#xff1a;src/icons/svg/svg格式icon 2&#xff1a;src/icons/index.js 2&#xff1a;src/icons/index.js 写入代码如下&#xff08;注释比较明确&#…

【数据结构】六、图:5.图的最小生成树MST(普里姆(Prim)算法、克鲁斯卡尔(Kruskal)算法、Boruvka 算法)

2.最小生成树MST 文章目录 2.最小生成树MST2.1 普里姆(Prim)算法算法思路 2.2 克鲁斯卡尔(Kruskal)算法算法思路 2.3 Boruvka 算法2.3.1基本原理2.3.2基本过程 一个图可以有多个生成树&#xff0c;我们定义无向连通图的 最小生成树&#xff08;Minimum Spanning Tree&#xff…

PHP餐厅点餐系统小程序源码

&#x1f37d;️【餐厅点餐新纪元&#xff0c;点餐系统让用餐更便捷&#xff01;】&#x1f4f1; &#x1f50d; 一键浏览&#xff0c;菜单尽在掌握 &#x1f4f1; 走进餐厅&#xff0c;无需再担心找不到服务员或菜单被抢光&#xff01;餐厅点餐系统让你轻松扫描桌上的二维码…

机器学习笔记:门控循环单元的建立

目录 介绍 结构 模型原理 重置门与更新门 候选隐状态 输出隐状态 模型实现 引入数据 初始化参数 定义模型 训练与预测 简洁实现GRU 思考 介绍 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;简称GRU&#xff09;是循环神经网络一种较为复杂的构成形式…

轻量级的灰度配置平台|得物技术

一、前言 随着近几年得物的业务和技术的快速发展&#xff0c;我们不管是在面向C端场景还是B端供应链&#xff1b;业务版本的迭代更新&#xff0c;技术架构的不断升级&#xff1b;不管是业务稳定性还是架构稳定性&#xff0c;业务灰度的能力对我们来说都是一项重要的技术保障&a…

x264 编码器 PSNR算法源码分析

PSNR PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)是一种常用的图像质量评价指标,用于衡量图像或视频的清晰度和质量。PSNR是基于信号的最大可能功率与影响信号的噪声功率之间的比率。在图像处理领域,PSNR通常用来评估图像压缩或图像增强算法的效果。 PSNR的计算公式是…

思科CCNP最新考证流程

CCNP CCNP全称思科网络高级工程师认证&#xff08;Cisco Certified Network Professional&#xff09;&#xff0c;是Cisco思科认证中的中级认证。获得ccnp证书表示着资深网络工程师具有对100个节点到超过500个节点的融合局域网和广域网进行安装、配置和故障排除的能力。能够管…

LeetCode257 二叉树的所有路径

前言 题目&#xff1a; 257. 二叉树的所有路径 文档&#xff1a; 代码随想录——二叉树的所有路径 编程语言&#xff1a; C 解题状态&#xff1a; 没思路&#xff0c;简单题强度好高… 思路 本题利用了递归加回溯的思路。 这道题目要求从根节点到叶子的路径&#xff0c;所以需…

一个Indie Hacker的微SaaS技术栈

如今&#xff0c;可用的技术非常多&#xff0c;我们每个月都会看到各种新的 JS 框架发布&#xff0c;有时&#xff0c;如果你一开始没有选择正确的技术堆栈&#xff0c;以后扩展起来就会很困难。因此&#xff0c;在今天的文章中&#xff0c;我将与你分享我用于开发微型 SaaS 的…

vue使用富文本编辑器+自由伸缩图片

首先要下载依赖&#xff0c;下方是本人使用的package.json&#xff0c;下载完依赖如果有启动项目失败的情况&#xff0c;建议将依赖版本降低或使用和下方一样的版本 package.json代码 {"name": "l","version": "0.1.0","privat…

Linux中线程常用接口(创建,等待,退出,取消)

pthread_create #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); Compile and link with -pthread. 编译时应注意。 #include<iostream> #in…

使用Playwright解决reCAPTCHA的分步指南

您是否在您的网络爬虫中遇到过CAPTCHA&#xff1f;许多网站使用CAPTCHA系统&#xff08;最常见的是reCAPTCHA&#xff09;来防止自动化访问。但是&#xff0c;本文将指导您使用Playwright&#xff08;一种强大的浏览器自动化工具&#xff09;和CapSolver&#xff08;一个设计用…

# 利刃出鞘_Tomcat 核心原理解析(二)

利刃出鞘_Tomcat 核心原理解析&#xff08;二&#xff09; 一、 Tomcat专题 - Tomcat架构 - HTTP工作流程 1、Http 工作原理 HTTP 协议&#xff1a;是浏览器与服务器之间的数据传送协议。作为应用层协议&#xff0c;HTTP 是基于 TCP/IP 协议来传递数据的&#xff08;HTML文件…

AI 的偏见来自数据集,而数据集的偏见来自人类 | Open AGI Forum

作者 | Annie Xu 采访、责编 | Eric Wang 出品丨GOSIM 开源创新汇 Richard Vencu&#xff0c;现任 Stability AI 机器学习运维负责人、LAION 工程负责人兼创始人&#xff0c;他的人生可谓十分精彩。 已过知天命之年的他是个中国通&#xff0c;极其热爱中国的武术、茶叶、诱人…

BugKu CTF Misc:被勒索了 disordered_zip simple MQTT 请攻击这个压缩包

前言 BugKu是一个由乌云知识库&#xff08;wooyun.org&#xff09;推出的在线漏洞靶场。乌云知识库是一个致力于收集、整理和分享互联网安全漏洞信息的社区平台。 BugKu旨在提供一个实践和学习网络安全的平台&#xff0c;供安全爱好者和渗透测试人员进行挑战和练习。它包含了…

03. 剑指offer刷题-二叉树篇(第二部分)

class Solution { public:TreeNode* Convert(TreeNode* pRootOfTree) {if(pRootOfTree nullptr) return nullptr;vector<TreeNode*> cur traversal(pRootOfTree);return cur[0];}// 这道题需要用到「分解问题」的思维&#xff0c;想把整棵链表&#xff0c;可以先把左右…