繁体   English   中英

保持反应铬扩展状态

[英]Retain state in react chrome extension

在Chrome中运行react-app不会保持状态。 例如,我有一个计时器应用程序。 计时器运行,但是关闭弹出窗口后,它不会保留状态。

使用react-app运行后台脚本的正确操作是什么? 如何实现呢?

示例代码:

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

const Timer = () => {
    const [seconds, setSeconds] = useState(0);
    const [isActive, setIsActive] = useState(false);

    useEffect(() => {
        let interval;
        if (isActive) {
             interval = setInterval(() => setSeconds(seconds + 1), 1000)
        } else {
            clearInterval(interval)
        }
        //stops the interval from running
        return () => clearInterval(interval)
    }, [seconds, isActive]);

    const toggleActive = () => {
         setIsActive(!isActive)
    };

    return (
        <div>
            <button onClick={toggleActive}>{seconds}</button>
        </div>
    )
};

export default Timer

如果您将redux与redux-persist一起使用,则将计时器存储在Redux中。 无需保存到localStorage。

如果我理解正确,即使弹出窗口不再打开,您也要保持计时器运行。 当前,您在弹出页面中启动计时器(关闭该窗口后将停止运行)。

您可以直接在后台脚本中运行计时器。 即使您没有打开弹出窗口,它也将继续运行。 您需要像这样在扩展程序清单中注册它: https : //developer.chrome.com/extensions/background_pages#manifest

要与弹出窗口进行通信,以便可以显示计时器的进度,可以使用扩展的消息传递选项之一: https : //developer.chrome.com/extensions/messaging

另一种方法也可以是存储计时器的开始时间,以便在重新打开弹出窗口时可以再次启动计时器。 可能看起来像这样:

在弹出窗口启动时,检查启动时间是否已设置,以及可能启动计时器:

chrome.storage.local.get(['start'], function(result) {
  if(result.start) {
    // restart the timer
  }
});

单击开始时,存储开始时间和开始计时器:

const now = Date.now();
chrome.storage.local.set({start: now}, function() {
  // start timer
});

当您单击停止时,从存储中删除开始时间:

chrome.storage.local.remove('start', function() {
  // also stop the active timer
});

您可以在此处找到扩展存储的更多文档: https : //developer.chrome.com/extensions/storage

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM