微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在多次触发的 chrome 扩展中更新反应钩子?

如何解决在多次触发的 chrome 扩展中更新反应钩子?

我在 chrome 扩展中使用 react 钩子,但是当我更新状态时,它被多次触发,当我只是控制台日志时它不会发生......

// browser.js
chrome.browserAction.onClicked.addListener(tab => {
    chrome.tabs.sendMessage(tab.id,{
        type: "toggle-popup"
    },null);
});


// content.js
const [popup,setPopup] = useState(false);
    let number = 1
    const togglePopup = () => setPopup(!popup);
    chrome.runtime.onMessage.addListener((request,sender,sendResponse) => {
        if (request.type == "toggle-popup") {
            number++
            togglePopup()
            console.log(number)
            console.log(popup)
        }
})

它给了我这些结果...

//1st click on tab icon
2
false

//2nd click on tab icon
3
false
2
true

//3rd click
4
false
3
true
2
true
2
false

我只希望它在单击时切换真/假以显示/隐藏页面上的 div(我不想使用 popup.js)。知道我做错了什么吗?

解决方法

函数组件的主体是 render 函数,您的代码在每次渲染时添加一个侦听器

// Runs on every render
chrome.runtime.onMessage.addListener((request,sender,sendResponse) => { setState(...) });

因此,您需要使用 React API 来处理这些情况并消除您也遇到的关闭问题。

为此使用 useEffectuseRef 而不是局部变量。

const Content = () => {
  const [popup,setPopup] = useState(false);
  const numberRef = useRef(0);

  useEffect(() => {
    chrome.runtime.onMessage.addListener((request,sendResponse) => {
      const togglePopup = () => setPopup((prev) => !prev);
      if (request.type == "toggle-popup") {
        numberRef.current++;
        togglePopup();
      }
    });
  },[]);
};

...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。