Web 存储(localStorage, sessionStorage)

概述

在现代 Web 开发中,Web 存储是一种非常重要的技术,它允许我们在用户的浏览器中存储数据。这种存储方式比传统的 Cookies 更加灵活和强大。Web 存储主要分为两种类型:localStorage 和 sessionStorage。

  • localStorage: 数据存储在用户的浏览器中,除非用户手动清除,否则数据会一直存在。
  • sessionStorage: 数据存储在用户的浏览器中,但仅在当前会话期间有效。一旦用户关闭浏览器窗口或标签页,数据就会被清除。

localStorage 和 sessionStorage 的基本用法

设置数据

你可以使用 setItem 方法来存储数据。setItem 接受两个参数:键(key)和值(value)。

// 使用 localStorage 存储数据
localStorage.setItem('username', 'JohnDoe');

// 使用 sessionStorage 存储数据
sessionStorage.setItem('token', 'abc123');

获取数据

你可以使用 getItem 方法来获取存储的数据。getItem 接受一个参数:键(key)。

// 使用 localStorage 获取数据
let username = localStorage.getItem('username');
console.log(username); // 输出: JohnDoe

// 使用 sessionStorage 获取数据
let token = sessionStorage.getItem('token');
console.log(token); // 输出: abc123

删除数据

你可以使用 removeItem 方法来删除存储的数据。removeItem 接受一个参数:键(key)。

// 使用 localStorage 删除数据
localStorage.removeItem('username');

// 使用 sessionStorage 删除数据
sessionStorage.removeItem('token');

清除所有数据

你可以使用 clear 方法来清除所有存储的数据。

// 使用 localStorage 清除所有数据
localStorage.clear();

// 使用 sessionStorage 清除所有数据
sessionStorage.clear();

实践练习

练习 1: 存储用户偏好

创建一个简单的 HTML 页面,允许用户选择主题颜色(如“浅色”或“深色”),并将选择存储在 localStorage 中。页面加载时,根据存储的偏好自动应用相应的主题颜色。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>主题选择</title>
    <style>
        body {
            font-family: Arial, sans-serif;
        }
        .light-theme {
            background-color: #f0f0f0;
            color: #000;
        }
        .dark-theme {
            background-color: #333;
            color: #fff;
        }
    </style>
</head>
<body>
    <h1>选择主题颜色</h1>
    <select id="theme-select">
        <option value="light">浅色</option>
        <option value="dark">深色</option>
    </select>
    <button id="save-button">保存</button>

    <script>
        // 加载时应用存储的主题
        document.addEventListener('DOMContentLoaded', () => {
            let theme = localStorage.getItem('theme');
            if (theme) {
                document.body.className = theme + '-theme';
            }
        });

        // 保存按钮点击事件
        document.getElementById('save-button').addEventListener('click', () => {
            let theme = document.getElementById('theme-select').value;
            localStorage.setItem('theme', theme);
            document.body.className = theme + '-theme';
        });
    </script>
</body>
</html>

练习 2: 会话存储购物车

创建一个简单的购物车页面,允许用户添加商品到购物车。使用 sessionStorage 存储购物车内容。页面刷新后,购物车内容应保持不变。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>购物车</title>
</head>
<body>
    <h1>购物车</h1>
    <ul id="cart-items"></ul>
    <button id="add-item">添加商品</button>

    <script>
        // 加载时显示购物车内容
        document.addEventListener('DOMContentLoaded', () => {
            let cart = sessionStorage.getItem('cart');
            if (cart) {
                cart = JSON.parse(cart);
                cart.forEach(item => {
                    addItemToCart(item);
                });
            }
        });

        // 添加商品到购物车
        document.getElementById('add-item').addEventListener('click', () => {
            let item = '商品' + (Math.random() * 100).toFixed(0);
            addItemToCart(item);
            saveCart();
        });

        // 添加商品到页面
        function addItemToCart(item) {
            let li = document.createElement('li');
            li.textContent = item;
            document.getElementById('cart-items').appendChild(li);
        }

        // 保存购物车内容
        function saveCart() {
            let cartItems = Array.from(document.querySelectorAll('#cart-items li')).map(li => li.textContent);
            sessionStorage.setItem('cart', JSON.stringify(cartItems));
        }
    </script>
</body>
</html>

总结

Web 存储(localStorage 和 sessionStorage)是现代 Web 开发中非常有用的工具,它们允许我们在用户的浏览器中存储数据。localStorage 适合存储长期数据,而 sessionStorage 适合存储临时数据。通过合理使用这两种存储方式,我们可以提升用户体验,并简化数据管理。

希望这篇教程能帮助你更好地理解和使用 Web 存储技术。继续探索和实践,你会发现它们在实际项目中的巨大潜力!