学生就业统计表案例

news2024/12/23 10:52:26

主要分为三块:

  1. 渲染业务
  2. 新增业务
  3. 删除业务

在这里插入图片描述
在这里插入图片描述

一、根据持久化数据渲染页面
核心步骤:

  1. 读取localstorage 本地数据
  • 如果有数据则转换为对象放到变量里面一会使用它渲染页面
  • 如果没有则用默认空数组 []
  • 为了测试效果,咱们可以先把initData 存入本地存储看效果
  1. 根据数据渲染页面。遍历数组,根据数据生成 tr,里面填充数据最后追加给 tbody
  • 渲染业务要封装成一个函数 render
  • 我们使用map方法遍历数组,里面更换数据,然后会返回 有数据的 tr 数组
  • 通过join 方法把map返回的数组转换为字符串
  • 字符串通过 innerHTML 赋值给 tbody

二、点击新增按钮,页面显示新的数据
核心步骤:

  1. 给form注册提交事件,要阻止默认提交事件(阻止默认行为)
事件对象.preventDefault() // 阻止默认行为
  1. 非空判断
    如果年龄、性别、薪资有一个值为空,则 return 返回“输入不能为空” 中断程序

  2. 给 arr 数组追加对象,里面存储表单获取过来的数据

  3. 渲染页面重置表单(reset()方法)

  4. 把数组数据存储到本地存储里面,利用JSON.stringify()存储为JSON字符串

三、点击删除按钮,可以删除对应的数据
核心步骤:

  1. 采用事件委托形式,给tbody注册点击事件
  2. 得到当前点击的索引号。渲染数据的时候,动态给a链接添加自定义属性 data-id=“0"
  3. 根据索引号,利用 splice 删除数组这条数据
  4. 重新渲染页面
  5. 把最新 arr 数组存入本地存储

关于stuld 的处理
核心思路:新增加序号应该是最后一条数据的stuld + 1
数组[数组的长度-1].stuld + 1

但是要判断,如果没有数据则是直接赋值为1,否则就采用上面的做法

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

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>学生就业统计表</title>
  <link rel="stylesheet" href="./iconfont/iconfont.css">
  <link rel="stylesheet" href="css/index.css" />
</head>

<body>
  <h1>学生就业统计表</h1>
  <form class="info" autocomplete="off">
    <input type="text" class="uname" name="uname" placeholder="姓名" />
    <input type="text" class="age" name="age" placeholder="年龄" />
    <input type="text" class="salary" name="salary" placeholder="薪资" />
    <select name="gender" class="gender">
      <option value=""></option>
      <option value=""></option>
    </select>
    <select name="city" class="city">
      <option value="北京">北京</option>
      <option value="上海">上海</option>
      <option value="广州">广州</option>
      <option value="深圳">深圳</option>
      <option value="曹县">曹县</option>
    </select>
    <button class="add">
      <i class="iconfont icon-tianjia"></i>添加
    </button>
  </form>

  <div class="title">共有数据<span>0</span></div>
  <table>
    <thead>
      <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
        <th>薪资</th>
        <th>就业城市</th>
        <th>录入时间</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <!-- <tr>
        <td>1</td>
        <td>迪丽热巴</td>
        <td>23</td>
        <td>女</td>
        <td>12000</td>
        <td>北京</td>
        <td>2099/9/9 08:08:08</td>
        <td>
          <a href="javascript:">
            <i class="iconfont icon-shanchu"></i>
            删除
          </a>
        </td>
      </tr> -->
    </tbody>
  </table>
  <script>
    // 参考数据
    const initData = [
      {
        stuId: 1,
        uname: '迪丽热巴',
        age: 22,
        salary: '12000',
        gender: '女',
        city: '北京',
        time: '2023/9/9 08:08:08'
      }
    ]

    // localStorage.setItem('data',JSON.stringify(initData))
    // 1. 渲染业务
    // 1.1 先读取本地存储的数据
    // (1)本地存储有数据则记得转换为对象然后存储到变量里面,后期用于渲染页面
    // (2)如果没有数据,则用 空数组来代替
    const arr = JSON.parse(localStorage.getItem('data')) || []
    
    // 1.2 利用map和join方法来渲染页面
    const tbody=document.querySelector('tbody')
    function render(){
      // (1)利用map遍历数组,返回对应的 tr的数组
      const trArr= arr.map(function(ele,index){
        return `
        <tr>
          <td>${ele.stuId}</td>
          <td>${ele.uname}</td>
          <td>${ele.age}</td>
          <td>${ele.gender}</td>
          <td>${ele.salary}</td>
          <td>${ele.city}</td>
          <td>${ele.time}</td>
          <td>
            <a href="javascript:" data-id="${index}">
              <i class="iconfont icon-shanchu"></i>
              删除
            </a>
        </td>
      </tr>
        `
      })
      console.log(trArr)

      // (2)把数组转换为字符串join

      // (3)把生成的字符串追加给tbody
      tbody.innerHTML=trArr.join('')
      // 显示共有几条数据
      document.querySelector('.title span').innerHTML=arr.length
    }
    render()


    // 2. 新增业务
    
    const info=document.querySelector('.info')
    const uname=document.querySelector('.uname')
    const age=document.querySelector('.age')
    const salary=document.querySelector('.salary')
    const gender=document.querySelector('.gender')
    const city=document.querySelector('.city')
    // 2.1 form表单注册提交事件,阻止默认行为
    info.addEventListener('submit',function(e){
      e.preventDefault()
      // 2.2 非空判断 
      if(!uname.value || !age.value || !salary.value){
        return alert('输入内容不能为空')
      }
      // 2.3 给arr数组追加对象,里面存储表单获取过来的数据
      arr.push({
        // 处理stuId:数组最后一条数据的stuId + 1
        stuId: arr.length ? arr[arr.length-1].stuId+1 : 1,
        uname: uname.value,
        age: age.value,
        salary: salary.value,
        gender: gender.value,
        city: city.value,
        time: new Date().toLocaleString()
      })
      // 2.4 渲染页面和重置表单(reset()方法)
      render()
      this.reset()  //重置表单

      // 2.5 把数组数据存储到本地存储里面,利用JSON.stringify()存储为JSON字符串
      localStorage.setItem('data',JSON.stringify(arr))
    })
   
    // 3. 删除业务
    // 3.1. 采用事件委托形式,给 tbody 注册点击事件
    tbody.addEventListener('click',function(e){
      // 判断是否点击的是删除按钮 A链接
      if(e.target.tagName==='A'){
        // 3.2. 得到当前点击链接的索引号。渲染数据的时候,动态给a链接添加自定义属性 data-id=“0"
        console.log(e.target.dataset.id)
        // 确认框  确认是否要真的删除
        if(confirm('您确定要删除这条数据吗?')){
          // 3.3. 根据索引号,利用 splice 删除数组这条数据
          arr.splice(e.target.dataset.id,1)
          // 3.4. 重新渲染页面
          render()
          // 3.5. 把最新 arr 数组存入本地存储
          localStorage.setItem('data',JSON.stringify(arr))
        }
      }
    })
    
  </script>
</body>

</html>

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

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

相关文章

android存储1--device解锁前的流程

android版本&#xff1a;android-11.0.0_r21http://aospxref.com/android-11.0.0_r21/ 一、主用户primary user的创建 开机后kernel启动第一个用户态进程init&#xff0c;init进程fork出zygote进程。zygote又fork出system server进程。http://aospxref.com/android-11.0.0_r2…

垃圾收集器面试总结(一)

垃圾收集器 Serial 收集器&#xff08;GC日志标识&#xff1a;DefNew&#xff09; Serial&#xff08;串行&#xff09;收集器是最基本、历史最悠久的垃圾收集器了。大家看名字就知道这个收集器是一个单线程收集器了。 它的 “单线程” 的意义不仅仅意味着它只会使用一条垃圾…

[比赛简介]BirdCLEF-2023

比赛链接&#xff1a;BirdCLEF 2023 | Kaggle 比赛简介 鸟类是生物多样性变化的极好指标&#xff0c;因为它们具有高度流动性并且具有不同的栖息地要求。因此&#xff0c;物种组合和鸟类数量的变化可以表明恢复项目的成败。然而&#xff0c;经常在大面积地区进行传统的基于观…

你的车有通风座椅吗?新款奔驰S400升级原厂主副驾座椅通风

大家好&#xff0c;我是奔之升小志&#xff08;bzs878&#xff09;&#xff0c;专注名车原厂升级&#xff0c;欢迎戳戳右上角“”号关注一下&#xff0c;持续为您带来精彩改装案例。 座椅通风有什么用&#xff1f;能改善身体与座椅接触面空气流通&#xff0c;达到不出汗的效果…

Linux网络服务----SSH

文章目录 一 、SSH服务1.1 什么是SSH服务器&#xff1f;1.2 常用的SSH软件的介绍 二 、ssh的运用2.1 存放ssh服务端的配置文件2.2 ssh在Linux中的密码登录2.3 利用ssh协议传输文件和获取文件2.4 sftp远程访问操作 三 、 ssh密钥登录操作四 、TCP_wapper的原理和运用4.1 TCP_wap…

IP-GUARD能否实现打印指定文件时需经过管理员审批后才能打印?

支持。先设置禁止打印文档的策略,然后设置相关审批流程,再给到客户端相应的申请权限: 1、在控制台-高级-打印控制策略中,给需要进行打印管控的客户端设置以下策略: 动作:禁止 2、在控制台-申请管理-桌面申请管理-审批流程管理中,添加申请类型为打印的审批流程,指定审批人…

通过ADB实现移动端h5项目无线真机调试(超级简单!)

前言 做移动端h5项目的时候&#xff0c;电脑浏览器调试样式和效果&#xff0c;可能和真机展示出来的效果有差距&#xff0c;比如有的手机开启了home键&#xff0c;比如文字大小等样式有偏差。虽然可以通过手机扫描网页二维码在手机上看样式&#xff0c;但是和真机还是有区别。…

每天一道大厂SQL题【Day23】华泰证券真题实战(五)

每天一道大厂SQL题【Day23】华泰证券真题实战(五) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

Veritas 与星辰天合的官方一体化方案来了

11&#xff1e;2&#xff0c;XSKY星辰天合联手 Veritas 贡献企业数据管理最佳实践。 近日&#xff0c;XSKY星辰天合以“科技联盟伙伴”身份亮相 2023 Veritas Solution Day&#xff0c;并宣布与 Veritas 推出联合解决方案。双方将携手为大型企业客户带来业界领先的数据存储与保…

CDH中的MySQL升级(RPM包方式)

CDH中的MySQL升级&#xff08;RPM包方式&#xff09; 1.下载官网的5.7中最新的版本&#xff0c;地址&#xff1a;MySQL 5.7.41 rpm下载地址 2.解压下载的tar包&#xff1a;tar -xvf mysql-5.7.41-1.el7.x86_64.rpm-bundle.tar 3.备份数据库 3.1 先停止MySQL服务&#xff1a;sy…

【测试开发】第一节.测开入门(附常考面试题)

文章目录 前言 一、什么是测试开发 1.1 常考面试题 二、软件测试的基础概念 2.1 需求 2.2 测试用例 3、BUG 三、生命周期 3.1 软件的生命周期 3.2 软件测试的生命周期 四、软件工程中的几种常见的开发模型 4.1 瀑布模型 4.2 螺旋模型 4.3 增量模型和迭代模型 4.4 敏捷…

【Windows10】〖问题〗Win10默认应用Web浏览器设置里出现两个Microsoft Edge图标,如何删掉空白图标?

〖问题〗Win10默认应用Web浏览器设置里出现两个Microsoft Edge图标&#xff0c;如何删掉空白图标&#xff1f; 问题 出现原因&#xff1a; 空白那个应该是旧版edge&#xff0c;可能是因为你曾经升级最新版Chromium的edge时&#xff0c;旧版本的edge并没有被系统清除干净所…

spring security (史上最全)

认证与授权&#xff08;Authentication and Authorization&#xff09; 一般意义来说的应用访问安全性&#xff0c;都是围绕认证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#xff09;这两个核心概念来展开的。 即&#xff1a; 首先需要确定用…

计算机组成原理——第七章输入输出系统(下)

还君明珠双泪目&#xff0c;恨不相逢未嫁时 文章目录 前言7.3.2 中断的作用和原理7.3.3 多重中断7.3.4 程序中断方式7.3.5 DMA 方式 前言 本节除了对时间的计算考察比较多之外&#xff0c;其他的方面也有考察&#xff0c;同时中断的考点在操作系统中也有考察&#xff0c;机组里…

〖Python网络爬虫实战⑯〗- 网页解析利器parsel

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

【hello Linux】进程控制

目录 1. 进程创建 2. 进程终止 3. 进程常见的退出方法 4. 进程等待 5. 进程等待的方法 6. 获取子进程status Linux&#x1f337; 1. 进程创建 fork 函数初识 在 linux 中 fork 函数是非常重要的函数&#xff0c;它可以从已存在进程中创建一个新进程。 新进程便是我们所说的子进…

从0到1搭建react 工程化前端项目

一、npm init 初始化包管理 1.在使用该命令之前&#xff0c;创建一个文件夹&#xff0c;例如&#xff1a;reactDemo2.使用在电脑终端命令行工具中&#xff0c;找到1创建的文件夹&#xff0c;并转到改文件夹指定目录&#xff1b;3.执行 npm init4.如图所示&#xff1a; 5.执行命…

云看消博会:政策、技术、玩家造就的数字化革命

配图来自Canva可画 会展作为展示地域经济、文化、技术等软硬实力的最佳舞台&#xff0c;在塑造城市品牌形象、加速地域经济发展中发挥着重要的促进作用。近几年&#xff0c;在数字经济浪潮的推动下&#xff0c;会展产业走上了网联化、数字化、智能化的道路&#xff0c;催生了不…

上货避坑指南 私域上货选品工具 无货源选品上货 采集商品详情数据API分享 详情图 sku信息

电商开店之后&#xff0c;第一件事就是上货了&#xff0c;上货其实也是有技巧的。 上传商品时我们一定要注意细节&#xff0c;不可忽略一些重要细节&#xff0c;所以商家们在上传商品前&#xff0c;不可忽略是否预售、标题、主图、详情页、保证金、上架时间这几个细节。 详情…

PHP实现输入数值计算幂次,输入工资,判断个人所得税的金额这两个程序的代码

目录 前言 一、输入数值计算幂次 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 二、输入工资&#xff0c;判断个人所得税的金额 2.1运行流程&#xff08;思想&#xff09; 2.2代码段 2.3运行截图 前言 1.因多重原因&#xff0c;本博文有两个代码程…