web本地存储(localStorage、sessionStorage)

news/2024/5/18 14:12:19 标签: storage, local, session, 本地存储, cookie

本地存储-localstoragesessionstorage">web 本地存储localStorage、sessionStorage)

说明

对浏览器来说,使用 Web Storage 存储键值对比存储 Cookie 方式更直观,而且容量更大,它包含两种:localStorage 和 sessionStorage

  1. sessionStorage(临时存储) :为每一个数据源维持一个存储区域,在浏览器打开期间存在,包括页面重新加载

  2. localStorage(长期存储) :与 sessionStorage 一样,但是浏览器关闭后,数据依然会一直存在

API

sessionStorage 和 localStorage 的用法基本一致,引用类型的值要转换成JSON

1. 保存数据到本地

    const info = {
        name: 'Lee',
        age: 20,
        id: '001'
    };
    sessionStorage.setItem('key', JSON.stringify(info));
    localStorage.setItem('key', JSON.stringify(info));

本地存储获取数据">2. 从本地存储获取数据

    var data1 = JSON.parse(sessionStorage.getItem('key'));
    var data2 = JSON.parse(localStorage.getItem('key'));

本地存储中删除某个保存的数据">3. 本地存储中删除某个保存的数据

    sessionStorage.removeItem('key');
    localStorage.removeItem('key');

4. 删除所有保存的数据

    sessionStorage.clear();
    localStorage.clear();

本地存储的变化">5. 监听本地存储的变化

Storage 发生变化(增加、更新、删除)时的 触发,同一个页面发生的改变不会触发,只会监听同一域名下其他页面改变 Storage

    window.addEventListener('storage', function (e) {
        console.log('key', e.key);
        console.log('oldValue', e.oldValue);
        console.log('newValue', e.newValue);
        console.log('url', e.url);
    })

浏览器查看方法

    1. 进入开发者工具
    1. 选择 Application
    1. 在左侧 Storage 下 查看 Local Storage 和 Session Storage

Application

本地存储">结合 React 实现用户基本数据的本地存储

界面UI方面的就不展示了,编写两个组件:<Login/>负责登录输入验证; <Home/> 项目主页,展示用户信息

1. 需求

  • <Login/> 组件可以得到用户输入的账号、密码,向服务器发送请求后获得 {id:'',name:'',tel:''}
  • 这些数据是 <Home/>组件正确展示所必须的,否则就会跳转到登录页
  • 我们需要让用户 直接打开主页就可以展示用户信息,不要再跳转到登录页

2. 实现

  • 用户在登录页填写登录信息后,将登录数据存储到 localStorage
  • 进入主页,首先获取 localStorage 中的数据,存在数据在直接展示,否则进入登录页
localstorage-中">1. 登录数据存储到 localStorage

在登录页路由中配置离开页面时处理函数,存储的数据一小时内有效

    <Route path="login" component={Login} onLeave={leaveLoginPage}/>
    import store from '../store/index';

    // login 页面 离开时逻辑
    export const leaveLoginPage = () => {
       // 离开 login 页面 更新 localStorage 中的数据
       const {id, name, tel} = store.getState().rootReducer;
       const userInfo = {id, name, tel};
       const userInfoState = localStorage.getItem('userInfoState');

       if (userInfoState) {
          // 如果本地存在 userInfoState 将其移除
          localStorage.removeItem('userInfoState');
       }
       localStorage.setItem('userInfoState', JSON.stringify({
          userInfo,
          timestamp: new Date().getTime()
       }));
    }
localstorage-中数据">2. 进入主页获取 localStorage 中数据

在主页路由中配置进入页面时处理函数

    <Route path="home" component={Home} onEnter={enterHomePage}>
    import store from '../store/index';

    // show 页面进入 逻辑
    export const enterHomePage = (nextState, replace, next) => {
       const rootState = store.getState().rootReducer;
       const userInfoState = JSON.parse(localStorage.getItem('userInfoState'));

       // 判断store 中是否有用户登录数据
       if (!rootState.isLogin) {
          // 不含有用户登录数据,判断 localStorage 中的数据是否可以使用
          const pass = userInfoState && userInfoState.timestamp && new Date().getTime() - userInfoState.timestamp <= 60 * 60 * 1000;

          if (pass) {
             // userInfoState 存在,并且上一次离开在一小时以内,可以读取 localStorage 数据
             const storedUserInfo = userInfoState.userInfo;

             // 'LOGIN' 将获取的数据更新到 store 中
             store.dispatch({type: 'LOGIN', msg: storedUserInfo});
             next();
          } else {
             // userInfoState 不存在 或者 已过期,则跳转到登录页
             replace('/login');
             next();
          }
       } else {
          // store 中 含有 用户登录数据,直接进入相应页面
          next();
       }
    }

http://www.niftyadmin.cn/n/661304.html

相关文章

js parseFloat

<title>范例4-5</title> <script language"javascript"> <!--var totalGas "20升"; // 汽油总量var used "7.5升"; // 开出100公里后消耗var overplus parseFlo…

Linux中write()函数的行为

应用缓冲技术能很明显的提高系统效率。内核与外围设备的数据交换&#xff0c;内核与用户空间的数据交换都是比较费时的&#xff0c;使用缓冲区就是为了优化这些费时的操作。其实核心到用户空间的操作本身是不buffer的&#xff0c;是由I/O库用buffer来优化了这个操作。比如read本…

JS效果

多标签页效果 tab切换 <!DOCTYPE HTML> <html lang"en-US"> <head><meta charset"UTF-8"><title></title><style type"text/css"> .tab{float:left;width:150px;height:60px;border:1px solid #ddd;b…

深入了解构造函数

struct Sales_data {friend Sales_data add(const Sales_data&, const Sales_data&);friend std::istream &read(std::istream&, Sales_data&);friend std::ostream &print(std::ostream&, const Sales_data&);public://定义构造函数&#xff…

WebSocket 以及 socket.io 使用

WebSocket 以及 socket.io 使用 说明 WebSocket 是一个持久化的协议, 是基于HTTP协议的, 它支持长连接&#xff0c;而不是像 ajax 一样通过轮询&#xff0c;每隔一段时间&#xff0c;向服务器发送请求&#xff0c;询问是否有新的信息&#xff0c;服务器端不能主动联系客户端&a…

NOIP模拟水题集锦

大蒟蒻又来水题啦 NOIP2016玩具谜题 1 #include<stdio.h>2 #include<string>3 #include<iostream>4 using namespace std;5 int n,m;6 struct toy7 {8 int dir;9 string name; 10 }; 11 struct order 12 { 13 int dir; 14 int num; 15 }; 16…

sublime插件-markdowntodoList

sublime 插件 - 文本编辑 markdown 以及待办事项插件 PlainTasks 下载 sublime 官方网站下载 安装 Package Control 官方安装方法 具体方法就是 打开 sublime 通过快捷方式 ctrl 打开一个控制台&#xff0c;然后将观望中的代码粘贴过去&#xff0c;运行等待就行 注&#xff…

【HEOI 2018】林克卡特树

转载请注明出处:http://www.cnblogs.com/TSHugh/p/8776179.html 先说60分的.思路题解上很清晰: 问题似乎等价于选K1条点不相交的链哎!F(x,k,0/1/2)表示考虑以x为根的子树,选了k条链,点x的度数为0/1/2的最优解. 我说一下比较坑的地方吧:1.初始化要-Inf(反正我不加这个会wa)2.注意…