gpt4 book ai didi

javascript - Electron:从 main.js 更改 React 组件状态

转载 作者:行者123 更新时间:2023-11-29 20:59:17 25 4
gpt4 key购买 nike

我有一个 Electron 应用程序,其中包含(除其他外)以下文件:

  • index.js
  • browserwindow.html
  • browserwindow.js(从 browserwindow.jsx 编译而来)

index.js 是 Electron 应用程序启动时运行的主要 Electron/Node 进程。 browserwindow.htmlguiWindow 中呈现,browserwindow.js 管理这个窗口。 (请参阅下面的文件。)

我想要的是从主 Electron 进程向 browserwindow.js 发送一条 ipc 消息,然后更新 React 组件状态。但是当我使用下面文件中的代码并运行 Electron 应用程序时,状态不会改变。

index.js

const electron = require('electron');
const BrowserWindow = electron.BrowserWindow;
const app = electron.app;
const url = require('url');
const ipc = electron.ipcMain;


app.on('ready', function(){

// Make window
var guiWindow;

// Set size and do not immediately show
guiWindow = new BrowserWindow({
width: 800,
height: 780,
show: false
});

// Load browserwindow.html in the guiWindow
guiWindow.loadURL('file://' + __dirname + '/browserwindow.html');

// Show the window when the .html file is loaded
guiWindow.once('ready-to-show', function(){
guiWindow.show();
});

// Send an ipc after 3 seconds
setInterval(function(){
guiWindow.webContents.send('message', {msg: 'Hello World!'});
}, 3000);

});

浏览器窗口.html

<!DOCTYPE html>
<html>
<head>
<title>Page</title>
</head>
<body>
<!-- The div that React uses: -->
<div id="mainInterface"></div>
<script src="react-0.14.3.js"></script>
<script src="react-dom-0.14.3.js"></script>
<script src="browserwindow.js"></script>
</body>
</html>

被编译为 browserwindow.js

的 jsx
var electron = require('electron');
var shell = electron.shell;
var ipc = electron.ipcRenderer;

class MainInterface extends React.Component {

constructor(props, contect){
super(props);
this.state = {
testValue: 'Initial state'
};
};

componentDidMount(){ // When the document is rendered

ipc.on('message', function(event, data){ // When the message is received...
console.log('Message received');
this.setState({testValue: 'It worked!'}); // ... change the state of this React component
});

}

render(){
return (
<h1>{ this.state.testValue }</h1>
);
}

}

ReactDOM.render(
<MainInterface />,
document.getElementById('mainInterface')
);

在 Javascript 控制台中,我收到以下错误:

Uncaught TypeError: this.setState is not a function
at EventEmitter.<anonymous> (file:///C:/Users/<file path to the project on my computer>/testproject/browserwindow.js:20:12)
at emitTwo (events.js:106:13)
at EventEmitter.emit (events.js:194:7)

我该怎么做才能解决这个问题?

(对于某些背景,我正在制作一个 Electron 应用程序,它应该通过 MQTT 接收消息并根据接收到的消息更新屏幕上的元素。)

最佳答案

您的 this 指向与组件实际不同的上下文。您需要将代码更改为

componentDidMount() {
// When the document is rendered.
const self = this;
ipc.on('message', function (event, data) {
// When the message is received...
console.log('Message received');
// ... change the state of this React component.
self.setState({testValue: 'It worked!'});
});
}

或者您可以将 function() 回调替换为 () => {},因为第一个选项会更改执行的上下文。

关于javascript - Electron:从 main.js 更改 React 组件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47440798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com