Minimal Example: Opening a window in electron from react application?

后端 未结 3 1481
花落未央
花落未央 2021-01-05 14:48

Say I am building a desktop application with react/redux & electron. So my index.html file in electron looks like this:




        
3条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-01-05 15:12

    To open a react component in a new window on button click and detect when the window is closed because the component will not simply call componentWillUnmount when you close the window Your app should look like this

    App.js

    export default class App extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          // To keep track of the new window if opened or closed
          isNewWindow: false,
        };
      }
    
      render() {
        return(
        // onClose will be fired when the new window is closed
        // everything inside NewWindowComponent is considered props.children and will be
        // displayed in a new window
        {(this.state.isNewWindow) &&
         this.setState({ isNewWindow: false })>
          

    This will display in a new window

    } ) } }

    NewWindowComponent.js

    export default class NewWindowComponent extends Component {
      // Create a container 
    for the window private containerEl = document.createElement('div'); // This will keep a reference of the window private externalWindow = null; // When the component mounts, Open a new window componentDidMount() { // The second argument in window.open is optional and can be set to whichever // value you want. You will notice the use of this value when we modify the main // electron.js file this.externalWindow = window.open('', 'NewWindowComponent '); // Append the container div and register the event that will get fired when the // window is closed if (this.externalWindow) { this.externalWindow.document.body.appendChild(this.containerEl); this.externalWindow.onunload = () => this.props.onClose(); } } render() { return ReactDOM.createPortal(this.props.children, this.containerEl); } }

    electron-main.js or however your main electron file is named

    ...
    function createWindow() {
      mainWindow = new BrowserWindow({
        ...
        // You need to activate `nativeWindowOpen`
        webPreferences: { nativeWindowOpen: true },
      });
      ...
      mainWindow.webContents.on('new-window',
        (event, url, frameName, disposition, options, additionalFeatures) =>
        {
          // This is the name we chose for our window. You can have multiple names for
          // multiple windows and each have their options
          if (frameName === 'NewWindowComponent ') {
            event.preventDefault();
            Object.assign(options, {
              // This will prevent interactions with the mainWindow
              parent: mainWindow,
              width: 300,
              height: 300,
              // You can also set `left` and `top` positions
            });
            event.newGuest = new BrowserWindow(options);
        }
      });
      ...
    }
    ...
    

提交回复
热议问题