【发布时间】:2017-03-23 14:36:04
【问题描述】:
我想将 react 的 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 函数只返回一个字符串。这是我的componentDidMount 捕获的,我已通过在 if 语句中打印到控制台进行了验证。
我注意到addListener 是异步的。有什么办法可以将结果保存在状态中?
【问题讨论】:
-
请edit 成为主题的问题:包括一个完整 minimal reproducible example 重复该问题。包括一个manifest.json,一些后台和内容脚本。寻求调试帮助的问题(“为什么这段代码不工作?”)必须包括:►期望的行为,►特定问题或错误和►必要的最短代码重现它在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:“如何创建 minimal reproducible example”、What topics can I ask about here? 和 How to Ask。
-
你知道 setState 是异步的吗?如果你想看到结果,你必须在 setState() 的回调函数中询问它们。即:this.setState({sourceCode: source}, function(){ console.log(this.state.sourceCode) })
-
我们需要看看你是如何发送
source的以及其中的内容很明显:-) 另外,是的,正如 Falk 所说,你错误地使用了异步 js。 -
我认为这完全是主题,不知道为什么会被标记。无论如何,您都会遇到两个经典的 javascript 问题。 1) setState 不是一个函数,因为
this正在被您的回调函数 stackoverflow.com/questions/31045716/… 反弹,并且 2)source是一个空字符串,因为您的 setstate 调用将在您上面的回调函数之前触发
标签: javascript reactjs google-chrome-extension