当前位置: 首页 > 知识库问答 >
问题:

如何将react setState与chrome API一起使用

池砚文
2023-03-14

我想使用的setState与chrome API,但我遇到了一个问题...

componentDidMount() {

    chrome.runtime.onMessage.addListener(function(request, sender) {
        if (request.action == "getSource") {
            this.setState({sourceCode: request.source});
        }
    }); 
}

我尝试了以下操作,但chrome API无法将setState识别为函数,因此我尝试先将request.source保存为变量。。。

componentDidMount() {
    var source = "";
    chrome.runtime.onMessage.addListener(function(request, sender) {
        if (request.action == "getSource") {
            source = request.source;
        }
    });
    this.setState({sourceCode: source});
}

但是当我尝试以下操作时,source仍然是一个空字符串。我不明白为什么,因为source被设置为request.source。我怎样才能解决这个问题?

编辑

我把剧本叫做...

chrome.tabs.executeScript(null, {
        file: 'src/js/scripts/getPageSource.js'
     }, function() {
     ...

在剧本里我有以下内容...

chrome.runtime.sendMessage({
    action: "getSource",
    source: DOMtoString(document)
});

其中DOMtoString函数只返回一个字符串。它是由我的组件didmount捕获的,我通过打印到if语句内的控制台来验证它。

我注意到addListener是异步的。有什么方法可以将结果保存在状态中吗?

共有1个答案

容宏逸
2023-03-14

您需要绑定this,使其在事件监听器中保持不变

chrome.runtime.onMessage.addListener(function(request, sender) {
    if (request.action == "getSource") {
        this.setState({sourceCode: request.source});
    }
}.bind(this));

第二次尝试不起作用,因为回调是异步的。当回调返回时,您需要调用setState。在第二次尝试中,您注册了侦听器,但随后立即调用setState。

编辑:或者,您可以切换到使用箭头函数。这将在词汇上绑定This,因此它将保持不变。

chrome.runtime.onMessage.addListener((request, sender) => {
    if (request.action == "getSource") {
        this.setState({sourceCode: request.source});
    }
});
 类似资料:
  • 我在Ubuntu 14.04中安装了phpbrew以使用PHP5.4。它工作得很好,但当我尝试使用composer时除外,composer会忽略phpbrew并安装与PHP5.5相关的依赖项。 有没有办法强制composer与phpbrew config兼容?我试图在我的作曲家中添加:php:“5.4”。json,但是它说这个要求在我的php版本中是不可能的。

  • 我是Micronaut框架的新手,我正在尝试使用entitymanager创建我的存储库。我这样创建了我的存储库 我使用这个类实现接口并注入entitymanager 问题是我一直有这个错误: PS:我已经启用了注释处理

  • 我正在尝试将composer与我的WampServer一起使用。 我所有文件的路径都是,但当我运行composer时,它会将供应商文件和其他东西安装到其他地方。 我甚至不知道我的项目在哪里,我也不能改变我的项目在哪里的路径。我已经尝试了所有的方法,但它似乎仍然没有在我的项目文件夹中安装供应商文件。

  • API level 28和Google建议使用registerNetworkCallback(NetworkRequest,PendingIntent)不推荐CONNECTIVITY\u操作。 我尝试使用ConnectionManager注册了registerNetworkCallback。NetworkCallback和它的工作,但我想使用PendingContent。 让我困惑的是公共空寄存器

  • 问题内容: 当我尝试将Webpack与简单的Express服务器一起使用时,总是会收到大量错误消息: express.js 我得到所有这些错误: 这是我的配置文件: 我该怎么办,我还需要在服务器端使用webpack。 我像这样运行express.js文件: 问题答案: 我最终要做的是,我使用了两种不同的配置,一种用于使用webpack将服务器内容打包在一起,另一种用于将所有浏览器内容打包在一起,并

  • 我有两个多对多关系的实体。 在类角色中: java.lang.StackOverflowError:空 我该如何解决这个问题?我在Stackoverflow上看到了类似的问题,但我没有找到真正有效的解决方案。 Upd:抛出异常的位置:

  • 我真的不明白我应该从< code>trackBy返回什么。根据我在网上看到的一些例子,我应该返回对象的一些属性值。对不对?为什么我应该获取< code>index作为参数? 例如在以下情况下: 组件.组件. ts 组件.模板.html 尽管名称未更改,此模板中显示的对象仍会更新。为什么?

  • 我看到了很多关于Kryo是否可以用来替换RMI所使用的默认JVM序列化的问题,但没有关于如何实际设置它的问题。我听说Kryo是JVM序列化的“插入式”替换,不确定这是否意味着您可以从运行时类路径中交换一些JAR(就像SLF4J绑定等的情况一样),或者其他东西。 所以我要问:如何使用Kryo而不是Java附带的默认JVM序列化来获得RMI?提前道谢!