LocalStorage页面监听变化

页面A设置LocalStorage的name键值为当前时间戳。页面B中,使用React的useEffectHook添加了一个存储事件监听器,定义了回调函数fn来处理事件,当组件卸载时移除监听器。

页面A

import React, { useEffect, useState } from 'react'

export default function Detail(props) {

    const [price, setPrice] = useState(0)//设置初始变量

    useEffect(() => {
           //页面初次加载时候进行ser更改
        localStorage.setItem('ser', new Date().getTime());

    }, [])

    const onclick = () => {
            //点击对name进行更改
        localStorage.setItem('name', new Date().getTime());
        //更改价格
        setPrice(1000)

    }
        
    return <button onClick={onclick}>价格{price}</button>

}

页面B

import React, { useEffect, useState } from 'react'

export default function Detail(props) {
        //初始化值
    const [price, setPrice] = useState(0)

    useEffect(() => {
            //定义监听函数
        const fn = (a, b) => {
                //打印触发的更改是什么
            console.log(a.key);
                   //如果是name更改,则进行赋值
            if (a.key === 'name') {

                setPrice(1000)

            }
        }
                //注册事件监听
        window.addEventListener('storage', fn)

        return () => {
                //销毁事件监听
            window.removeEventListener('storage', fn)

        }

    }, [])
    return (
        <div>
            价格:{price}
        </div>
    )
}

### 实现跨多页面监听 `localStorage` 变化 为了实现在多个页面监听 `localStorage` 的变化,可以利用浏览器提供的 `storage` 事件。当 `localStorage` 发生更改时,所有其他同源的浏览上下文(即不同标签页或窗口中的文档)都会收到此事件通知。 #### 使用内置 `storage` 事件监听器 对于大多数情况而言,在不同的浏览器标签页之间共享数据并响应其变更的最佳实践就是依靠原生支持的 `storage` 事件: ```javascript window.addEventListener('storage', function(event) { if (event.key === 'sharedData') { console.log(`'${event.key}' has been updated to '${event.newValue}'.`); } }); ``` 这段代码会在任何地方修改名为 `sharedData` 的键值对时触发回调函数,并打印新的存储值到控制台[^1]。 需要注意的是,在同一页面内调用 `setItem()` 不会触发自身的 `storage` 事件;只有来自其它同源环境下的更新才会引起该事件的发生。 #### 处理单个页面内的本地操作 如果应用程序逻辑要求在同一页面内部也能检测到 `localStorage` 更改,则可采用自定义事件机制作为补充方案: ```javascript function updateLocalStorage(key, value){ localStorage.setItem(key,value); // 创建并分发一个新事件给当前文档对象 const customEvt = new Event('localStoreChanged'); document.dispatchEvent(customEvt); } // 添加针对自定义事件的侦听器 document.addEventListener('localStoreChanged',(e)=>{ let currentValue = localStorage.getItem('someKey'); console.log(`Local Storage item someKey is now ${currentValue}`); }) ``` 通过这种方式,即使是在同一个页面里执行了 `localStorage` 更新动作,也能够及时接收到相应的通知[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值