Vue2中渲染功能,添加功能,删除功能,统计功能

news2025/1/11 21:00:35

上述是代码运行结果,完整代码如下

<!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>Document</title>
    <style>
        .red{
            color: red;
        }
        .score-case{
            width: 500px;
            height: auto;
            border: 1px solid #000;
        }
        .table{
            width: 100%;
        }
        .table td, .table th{
            border: 1px solid #000;
            width: 100px;
            padding: 10px;
        }
        .tfoot{
            text-align: center;
        }
    </style>
</head>
<body>
    <div id="app" class="score-case">
        <div class="table">
            <table>
                <!-- 表头 -->
                <thead>
                    <tr>
                        <th>编号</th>
                        <th>科目</th>
                        <th>成绩</th>
                        <th>操作</th>
                    </tr>
                </thead>
                <!-- 渲染操作 -->
                <tbody  v-if="list.length > 0">
                    <tr v-for="(item,index) in list" :key="item.id">
                        <td>{{index+1}}</td>   <!-- 保证连续性,不用item.id-->
                        <td>{{item.subject}}</td>
                        <!-- 不及格的要标红 -->
                        <!-- 动态控制类 -->
                        <!-- :class="{属性:条件}"-->

                        <td :class="{red: item.score < 60}">{{item.score}}</td>
                        <td><a @click.prevent="del(item.id)" href="">删除</a></td>
                    </tr>
                </tbody>
                <tbody v-else>
                    <tr>
                        <td colspan="5">
                            <span>暂无数据</span>
                        </td>
                    </tr>
                </tbody>
                <!-- 表尾 -->
                <tfoot>
                    <tr>
                        <td colspan="5">
                            <span>总分:{{totalScore}}</span>
                            <span style="margin-left: 50px;">平均分:{{averageScore}}</span>
                        </td>
                    </tr>
                </tfoot>
            </table>
        </div>
        <!-- 添加功能模块 -->
        <div class="form">
            <div class="form-item">
                <div class="label">科目:</div>
                <div class="input">
                    <input type="text" placeholder="请输入科目" v-model.trim="subject">
                </div>
            </div>
            <div class="form-item">
                <div class="label">成绩:</div>
                <div class="input">
                    <input type="text" placeholder="请输入成绩" v-model.number="score">
                </div>
            </div>
            <div class="form-item">
                <div class="label"></div>
                <div class="input">
                    <button class="submit" @click="add">添加</button>
                </div>
            </div>
        </div>
    </div>

<script src="https://cdn.staticfile.net/vue/2.7.0/vue.min.js"></script>
<script>
    const app = new Vue({
        el: '#app',
        // 数据
        data: {
            list: [
                { id: 1, subject: '语文', score: 100 },
                { id: 2, subject: '数学', score: 100 },
                { id: 3, subject: '英语', score: 56 },
                { id: 7, subject: '政治', score: 85 }
            ],
            subject: '',
            score: ''
        },
        methods: {
            del(id){
                // 删除
                this.list = this.list.filter(item => item.id !== id)
            },
            add(){
                // 添加
                //条件判断
                // trim() 去除字符串前后的空格
                if(this.subject.trim() === '' || this.score === '' || typeof this.score !== 'number'){
                    alert('请输入科目和成绩')
                    return
                }
                // push往后面加,unshift往前面加
                this.list.push({
                    id: this.list.length + 1,
                    subject: this.subject,
                    score: this.score
                })
                // 清空输入框
                this.subject = ''
                this.score = ''
            }

        },
        // 计算属性
        computed: {
            totalScore(){
                // 求和
                // reduce() 方法对数组中的每个元素执行一个由您提供的函数,将其结果汇总为单个返回值。
                return this.list.reduce((sum,item) => sum + item.score,0)
            },
            averageScore(){
                if(this.list.length === 0){
                    return 0
                }
                // toFixed(2) 保留小数点后两位
                // 并且toFixed() 是以字符串的形式保留,所以要将它转换为数字
                let floatString = this.totalScore / this.list.length.toFixed(2);
                let floatNumber = parseFloat(floatString);
                return floatNumber;

            }
        },

    })
</script>
</body>
</html>
<!-- 渲染,添加,删除,统计总分 -->

渲染功能(v-for="(item,index) in list" :key="item.id"
  • 如果数组长度大于0,则渲染第一个tbody,否则渲染第二个tbody
  • 分数不及格的要,把分数渲染成红色。所以要动态控制类 :class="{属性:条件}"

               
                <!-- 渲染操作 -->
                <tbody  v-if="list.length > 0">
                    <tr v-for="(item,index) in list" :key="item.id">
                        <td>{{index+1}}</td>   <!-- 保证连续性,不用item.id-->
                        <td>{{item.subject}}</td>
                        <!-- 不及格的要标红 -->
                        <!-- 动态控制类 -->
                        <!-- :class="{属性:条件}"-->

                        <td :class="{red: item.score < 60}">{{item.score}}</td>
                        <td><a @click.prevent="del(item.id)" href="">删除</a></td>
                    </tr>
                </tbody>
                <tbody v-else>
                    <tr>
                        <td colspan="5">
                            <span>暂无数据</span>
                        </td>
                    </tr>
                </tbody>
<script src="https://cdn.staticfile.net/vue/2.7.0/vue.min.js"></script>
<script>
    const app = new Vue({
        el: '#app',
        // 数据
        data: {
             list: [
                { id: 1, subject: '语文', score: 100 },
                { id: 2, subject: '数学', score: 100 },
                { id: 3, subject: '英语', score: 56 },
                { id: 7, subject: '政治', score: 85 }
            ],
            subject: '',
            score: ''
        },
</script>

添加功能(v-model 和 @click="add")

  •  trim() 去除字符串前后的空格
  •  number 转换成数字类型

  • 条件判断

  • push() 往数组最后一条后面添加 。 unshift() 往数组第一条数据前面添加

   <!-- 添加功能模块 -->
        <div class="form">
            <div class="form-item">
                <div class="label">科目:</div>
                <div class="input">
                    <input type="text" placeholder="请输入科目" v-model.trim="subject">
                </div>
            </div>
            <div class="form-item">
                <div class="label">成绩:</div>
                <div class="input">
                    <input type="text" placeholder="请输入成绩" v-model.number="score">
                </div>
            </div>
            <div class="form-item">
                <div class="label"></div>
                <div class="input">
                    <button class="submit" @click="add">添加</button>
                </div>
            </div>
        </div>
    methods: {
            add(){
                // 添加
                //条件判断
                // trim() 去除字符串前后的空格
                if(this.subject.trim() === '' || this.score === '' || typeof this.score !== 'number'){
                    alert('请输入科目和成绩')
                    return
                }
                // push往后面加,unshift往前面加
                this.list.push({
                    id: this.list.length + 1,
                    subject: this.subject,
                    score: this.score
                })
                // 清空输入框
                this.subject = ''
                this.score = ''
            }

        },

删除功能(@click.prevent="del(item.id)" methods:{ del(id) { } }

  •  this.list = this.list.filter(item => item.id !== id)

                 <tbody  v-if="list.length > 0">
                    <tr v-for="(item,index) in list" :key="item.id">
                        <td>{{index+1}}</td>   <!-- 保证连续性,不用item.id-->
                        <td>{{item.subject}}</td>
                        <!-- 不及格的要标红 -->
                        <!-- 动态控制类 -->
                        <!-- :class="{属性:条件}"-->

                        <td :class="{red: item.score < 60}">{{item.score}}</td>
                        <td><a @click.prevent="del(item.id)" href="">删除</a></td>
                    </tr>
                 </tbody>
 methods: {
            del(id){
                // 删除
                this.list = this.list.filter(item => item.id !== id)
            },
}

统计求和,求平均分功能 ( 计算属性{{totalScore}}{{averageScore}})

  • 求和的固定代码   this.list.reduce((sum,item) => sum + item.score,0)
                <!-- 表尾 -->
                <tfoot>
                    <tr>
                        <td colspan="5">
                            <span>总分:{{totalScore}}</span>
                            <span style="margin-left: 50px;">平均分:{{averageScore}}</span>
                        </td>
                    </tr>
                </tfoot>
// 计算属性
        computed: {
            totalScore(){
                // 求和
                // reduce() 方法对数组中的每个元素执行一个由您提供的函数,将其结果汇总为单个返回值。
                return this.list.reduce((sum,item) => sum + item.score,0)
            },
            averageScore(){
                if(this.list.length === 0){
                    return 0
                }
                // toFixed(2) 保留小数点后两位
                // 并且toFixed() 是以字符串的形式保留,所以要将它转换为数字
                let floatString = this.totalScore / this.list.length.toFixed(2);
                let floatNumber = parseFloat(floatString);
                return floatNumber;

            }
        },

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

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

相关文章

防近视台灯有效果吗?家长们要注意台灯怎么选才靠谱

近年来&#xff0c;电子产品的广泛应用进一步加重了学生的用眼负担。平板电脑、智能手机和笔记本电脑成为日常学习不可或缺的一部分&#xff0c;而长时间使用这些设备无疑加剧了视力疲劳。根据权威机构的预测&#xff0c;到2050年&#xff0c;全球近视人数将达到约49.49亿人&am…

Spring Boot 动态数据源

目录 前言 前置环境 pom yml Entity Dao 枚举类 数据源 AOP Controller 启动类 演示 前言 大多数系统中&#xff0c;都需要数据库来持久化数据&#xff0c;在大多数情况下&#xff0c;一个系统只需要配置一个数据源便能够完成所有业务的查询&#xff0c;保存操作。…

Interceptor拦截器开发

因为1登录后的接口都需要token验证代码,会出现重复代码;2当前的接口不防刷,会被恶意攻击 所以在controller层增加请求拦截,如果你的token不合法,就不让你做后续的处理了 拦截器的作用是什么 作用: 1、对controller层代码的访问进行拦截,合法的请求,那此层代码就处理,反…

三好夫人是正规牌子吗?99%不知道的秘密:三好夫人竟成宠夫神器

三好夫人是正规品牌&#xff0c;是2023年在中国国家商标局注册的第30类商标。所属公司为苏州好夫人健康科技有限公司。 当下的社会&#xff0c;健康与爱情成为了现代人追求的两大宝藏。在众多养生品牌中&#xff0c;“三好夫人”如同一股清流&#xff0c;悄然间成为了许多家庭中…

【华为战报】2024年7月 HCIA-HCIP-HCIE考试,通过率100%

了解更多往期考试→点击 【考试战报】 HCIA 华为认证工程师 7月 微思 | HCIA 考试战报 HCIP 华为认证高级工程师 7月 微思 | HCIP 考试战报 HCIE 华为认证专家 7月 微思 | HCIE 考试战报 END 微思网络&#xff0c;始于2002年 专业IT认证培训22年&#xff0c;面向全国招生&a…

智能体互联网IoA架构核心思想解读

零、常用概念 智能体&#xff1a;融合了大模型能力&#xff0c;具有感知记忆、自主规划、调用工具、执行任务能力的AgentInternet of Agents &#xff08;IoA&#xff09;—— “智能体互联网”&#xff1a;Agent 之间互相发现&#xff0c;大规模连接、协作。 一、现状问题 生…

hadoop学习笔记4-mapreduce

5.MapReduce 5.1Linux中安装IDEA IDEA官网&#xff1a;https://www.jetbrains.com.cn/idea/ 点击右上角的下载 选择Linux进行下载压缩包 下载完成后找到压缩包并解压压缩包到当前目录下 tar -zxvf ideaIC-2024.1.4.tar.gz 运行idea ./idea.sh 5.2配置开发环境 1.mapreduce简…

公司运营数据分析大屏,非专业者也能轻松上手

在这个数据洪流的时代&#xff0c;企业的每一步发展都深深刻画在数字的轨迹之中。如何精准捕捉这些瞬息万变的信息&#xff0c;将其转化为推动企业前行的智慧力量&#xff1f;答案&#xff0c;或许就藏在一面高效、直观的公司运营数据分析大屏之中。 想象一下&#xff0c;当晨光…

软件工程-期末考试

目录 1.数据流图例题 2.工程网络 3.详细设计阶段图形工具 程序流程图&#xff0c;盒图 PAD图&#xff08;冒泡排序&#xff09; 判定树、判定表 4.合理地设计测试方案 5.能用jackson图表达问题的数据结构 6.能建立问题的对象模型--->&#xff08;类图&#xff09; …

shell脚本自动化部署

1、自动化部署DNS [rootweb ~]# vim dns.sh [roottomcat ~]# yum -y install bind-utils [roottomcat ~]# echo "nameserver 192.168.8.132" > /etc/resolv.conf [roottomcat ~]# nslookup www.a.com 2、自动化部署rsync [rootweb ~]# vim rsync.sh [rootweb ~]# …

Git安装流程以及如何将本地代码推送到新建的git仓库(IDEA操作简单易学)

Windows版本下载地址 Git - Downloading Package (git-scm.com) 根据自己电脑系统选择响应的版本 安装流程 1. 我安装的是 2.46.0 的版本&#xff0c; 点击next 2. 选择安装的文件夹&#xff0c;点击browse..进行选择&#xff0c;选择完点击next 3. 自定义组件&#xff0c;一…

系统架构师考点--软件架构的演化和维护

大家好。今天来总结一下软件架构的 演化和维护。这部分内容属于新增内容&#xff0c;之前未曾考过&#xff0c;可能会在论文中出现&#xff0c;在上午场客观题出现几率不大&#xff0c;可能会占分。 一、软件架构演化和定义 软件架构的演化和维护就是对架构进行修改和完善的过…

jmeter-beanshell学习15-输入日期,计算前后几天的日期

又遇到新问题了&#xff0c;想要根据获取的日期&#xff0c;计算出前面两天的日期。网上找了半天&#xff0c;全都是写获取当天日期&#xff0c;然后计算昨天的日期&#xff0c;照葫芦画瓢也没改出来想要的&#xff0c;最后求助了开发同学。 先放上网上获取当天&#xff0c;计…

使用Canal监听Binlog将数据发送到RocketMQ

文章目录 一、部署RocketMQ二、部署MySQL1、开启mysql的binlog写入功能2、创建一个有相关权限的mysql slave账号 三、部署 Canal1、修改conf/canal.properties配置文件2、修改conf/example/instance.properties配置文件 四、实际操作 一、部署RocketMQ win11 部署RocketMQ 和可…

u盘sd卡格式化怎么恢复数据:从绝望到希望的全面指南

在数字时代&#xff0c;U盘和SD卡已成为我们日常生活中不可或缺的数据存储设备。然而&#xff0c;一不留神的格式化操作&#xff0c;往往会导致重要数据的瞬间消失&#xff0c;让人倍感焦虑与无助。那么&#xff0c;面对这一突如其来的数据灾难&#xff0c;我们是否只能束手就擒…

大模型套壳祛魅:质疑套壳,理解套壳

过去的 2023 年是大模型元年&#xff0c;在国产大模型数量狂飙突进的同时——已经超过 200 个&#xff0c;「套壳」一直是萦绕在大模型头上的舆论阴云。 从年初到年末&#xff0c;从百度文心一言到零一万物&#xff0c;从字节跳动到谷歌 Gemini&#xff0c;各种「涉嫌套壳」的…

案例精选 | 南大港产业园区卫生计生管理服务中心日志系统建设方案

南大港产业园区&#xff0c;坐落于中国河北省沧州市东南部&#xff0c;是一个集工业生产、科技研发、商贸物流、生态居住等多功能于一体的国内知名综合性产业园区。作为区域经济发展的重要引擎&#xff0c;不仅承载着产业升级的重任&#xff0c;还肩负着提升公共服务水平、保障…

刷题了:513.找树左下角的值|112. 路径总和| 113. 路径总和ii|106.从中序与后序遍历序列构造二叉树|105.从前序与中序遍历序列构造二叉树

513.找树左下角的值 文章讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 视频讲解:https://www.bilibili.com/video/BV1424y1Z7pn/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_s…

install第三方jar中包含私服依赖,导致项目无法构建

起因&#xff1a;新公司项目引入了一个发短信的jar包&#xff0c;我使用下列命令安装到本地库。 mvn install:install-file -DfileD:\workspace\\resources\WEB-INF\lib\xxxx.sdk.sms-0.0.1-SNAPSHOT.jar -DgroupIdxxxx.sdk.sms -DartifactIdxxxx.sdk.sms-0.0.1-SNAPSHOT -Dv…

Netty 必知必会(三)—— ByteBuf

Netty ByteBuf工作原理&#xff0c;和NIO里ByteBuffer区别&#xff1f; Java NIO 提供了ByteBuffer 作为它 的字节容器&#xff0c;但是这个类使⽤起来过于复杂&#xff0c;⽽且也有些繁琐。 ByteBuf是Netty框架中的一个关键类&#xff0c;专门设计来处理字节数据&#xff0c;…