【博学谷学习记录】超强总结,用心分享丨前端开发:本地存储实现页面刷新不丢失信息

一.本地存储介绍

随着互联网的快速发展,基于网页的应用越来越普遍,同时也变的越来越复杂,为了满足各种各样的需求,会经常性在本地存储大量的数据,HTML5规范提出了相关解决方案。
1、数据存储在用户浏览器中
2、设置、读取方便、甚至页面刷新不丢失数据
3、容量较大

二.本地存储分类- localStorage

作用

可以将数据永久存储在本地(用户的电脑), 除非手动删除,否则关闭页面也会存在

特性

可以多窗口(页面)共享(同一浏览器可以共享)
以键值对的形式存储使用

语法

存储数据

localStorage.setItem(key,value)

获取数据

localStorage.getItem(key)

删除数据

localStorage.removeItem(key)

浏览器查看本地数据:

在这里插入图片描述

三.本地存储分类- sessionStorage

特性

生命周期为关闭浏览器窗口
在同一个窗口(页面)下数据可以共享
以键值对的形式存储使用
用法跟localStorage 基本相同

四.存储复杂数据类型

本地只能存储字符串,无法存储复杂数据类型
在这里插入图片描述
在这里插入图片描述

需要将复杂数据类型转换成JSON字符串,在存储到本地

语法

JSON.stringify(复杂数据类型)

在这里插入图片描述
将复杂数据转换成JSON字符串 存储 本地存储中
在这里插入图片描述
因为本地存储里面取出来的是字符串,不是对象,无法直接使用
在这里插入图片描述
在这里插入图片描述
需要把取出来的字符串转换为对象

语法

JSON.parse(JSON字符串)

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

学生信息表案例

CSS部分

* {
  margin: 0;
  padding: 0;
}

a {
  text-decoration: none;
  color:#721c24;
}
h1 {
  text-align: center;
  color:#333;
  margin: 20px 0;
 
}
table {
  margin:0 auto;
  width: 800px;
  border-collapse: collapse;
  color:#004085;
}
th {
  padding: 10px;
  background: #cfe5ff;
  
  font-size: 20px;
  font-weight: 400;
}
td,th {
  border:1px solid #b8daff;
}
td {
  padding:10px;
  color:#666;
  text-align: center;
  font-size: 16px;
}
tbody tr {
  background: #fff;
}
tbody tr:hover {
  background: #e1ecf8;
}
.info {
  width: 900px;
  margin: 50px auto;
  text-align: center;
}
.info  input, .info select {
  width: 80px;
  height: 27px;
  outline: none;
  border-radius: 5px;
  border:1px solid #b8daff;
  padding-left: 5px;
  box-sizing: border-box;
  margin-right: 15px;
}
.info button {
  width: 60px;
  height: 27px;
  background-color: #004085;
  outline: none;
  border: 0;
  color: #fff;
  cursor: pointer;
  border-radius: 5px;
}
.info .age {
  width: 50px;
}

网页结构部分

记得引入CSS

<h1>新增学员</h1>
  <form class="info" autocomplete="off">
    姓名:<input type="text" class="uname" name="uname" />
    年龄:<input type="text" class="age" name="age" />
    性别:
    <select name="gender" class="gender">
      <option value=""></option>
      <option value=""></option>
    </select>
    薪资:<input type="text" class="salary" name="salary" />
    就业城市:<select name="city" class="city">
      <option value="北京">北京</option>
      <option value="上海">上海</option>
      <option value="广州">广州</option>
      <option value="深圳">深圳</option>
      <option value="曹县">曹县</option>
    </select>
    <button class="add">录入</button>
  </form>

  <h1>就业榜</h1>
  <table>
    <thead>
      <tr>
        <th>学号</th>
        <th>姓名</th>
        <th>年龄</th>
        <th>性别</th>
        <th>薪资</th>
        <th>就业城市</th>
        <th>操作</th>
      </tr>
    </thead>
    <tbody>
      <!-- 
        <tr>
          <td>1001</td>
          <td>欧阳霸天</td>
          <td>19</td>
          <td>男</td>
          <td>15000</td>
          <td>上海</td>
          <td>
            <a href="javascript:">删除</a>
          </td>
        </tr> 
        -->
    </tbody>
  </table>

JS部分

<script>
  // 参考数据
      // const initData = [
      //   {
      //     stuId: 1001,
      //     uname: '欧阳霸天',
      //     age: 19,
      //     gender: '男',
      //     salary: '20000',
      //     city: '上海',
      //   }
      // ]

      //1:读取本地存储数据
      //2.如果本地存储有数据,则返回 JSON.parse() 之后的对象,如果本地存储没有数据,则声明一个空的数组 
      const arr = localStorage.getItem('student-data') ? JSON.parse(localStorage.getItem('student-data')) : []
      // console.log(arr)
      // 获取 tbody 之后用来添加子类标签
      const tbody = document.querySelector('tbody')
      // 3. 渲染模块函数
      function render(){
        //遍历数组arr,将数组里每一个对象都生成对应的tr标签添加给tbody
        //map方法 返回的是个经过处理的数组
        const trArr = arr.map(function(item,i){
          //item是具体的值(这里是每一个对象) i是数组下标
          return `
          <tr>
          <td>${item.stuId}</td>
          <td>${item.uname}</td>
          <td>${item.age}</td>
          <td>${item.gender}</td>
          <td>${item.salary}</td>
          <td>${item.city}</td>
          <td>
            <a href="javascript:" data-id = ${i}>删除</a>
          </td>
        </tr> 
          `
        })
        //trArr是个数组,默认元素之间以逗号分隔,如果直接给tbody添加,行与行之间会出现逗号,所以要使用join方法将数组转换为字符串
        tbody.innerHTML = trArr.join('')
      }
      //先渲染一次,显示网页的默认数据
      render()
      // 4. 录入模块
      const info = document.querySelector('.info')
      //获取form表单里所有带name属性的元素
      const items = info.querySelectorAll('[name]')
      info.addEventListener('submit',function(e){
        //阻止表单的默认提交功能,要用事件
        e.preventDefault()
        //创建一个对象,用来装输入的参数
        const obj = {}
        //假如有两条数据 2
        obj.stuId = arr.length ? arr[arr.length - 1].stuId + 1 : 1
        //非空判断
        for(let i = 0; i < items.length; i++){
          //items : 数组里面五个要输入内容的表单 共同属性:name
          //item[i] : 每一个表单, 例如:item[i] : 姓名:<input type="text" class="uname" name="uname" />
          //item[i].name : 每一个表单name属性里的值, 例如item[i].name = uname
          const item = items[i]
          if(items[i].value === ''){
            return alert('输入内容不能为空')
          }
          //通过非空判断就需要将输入的内容与对象的值一一对应赋给对象
          //[]里面带引号是值,不带引号是变量 obj[对象名] = 对象值 相当于obj['uname'] = name.value  obj['uname'] = '欧阳霸天' 以此类推
          obj[item.name] = item.value
        }
        //将遍历好的对象追加给数组
        arr.push(obj)
        //把数组arr存储到本地存储里面,arr是个数组对象
        localStorage.setItem('student-data',JSON.stringify(arr))
        //渲染页面
        render()
        // 重置表单
        this.reset()
      })
      //5.删除模块
      tbody.addEventListener('click',function(e){
        if(e.target.tagName === 'A'){
          arr.splice(e.target.dataset.id, 1)
          //写入本地存储(相当于又创建了一个student-data把原来的覆盖了)
          localStorage.setItem('student-data',JSON.stringify(arr))
          //重新渲染
          render()
        }
      })
  </script>
</body>

运行效果

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值