Как создать приложение Electron с несколькими разделами - PullRequest
1 голос
/ 27 апреля 2019

Я пытаюсь создать приложение Electron, которое имеет несколько «страниц».

В моем случае я пытаюсь создать приложение с боковой панелью, имеющей разные разделы. При щелчке по разделу содержимое главного окна изменяется для отображения соответствующего содержимого для раздела.

Я новичок в JS, так что извините, если это глупый вопрос, но на данный момент, когда я пытаюсь перейти в раздел приложения, я получаю экран с белой вспышкой на секунду, прежде чем все снова загрузится.

Пример: https://i.imgur.com/qOyuYsz.gif

Я знаю, что это связано с перезагрузкой Electron движка Chrome, но как я могу сделать так, чтобы при щелчке раздела содержимое отображалось автоматически без каких-либо "вспышек" или странных вещей?

В основном: как создать графический интерфейс с большим количеством компонентов, используя Electron?

Мой код для index.html:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Rupture Tools</title>
        <link rel="stylesheet" href="./photon/css/photon.min.css">
    </head>
    <body>
        <div class="window">
            <div class="window-content">
              <div class="pane-group">
                <div class="pane-sm sidebar">
                    <nav class="nav-group">
                        <h5 class="nav-group-title">1 Click Generator</h5>
                        <a class="nav-group-item active">
                          <span class="icon icon-home"></span>
                          Dashboard
                        </a>
                        <a href="accounts.html">
                            <span class="nav-group-item">
                                <span class="icon icon-user-add"></span>
                            Accounts
                            </span>
                        </a>
                        <span class="nav-group-item">
                          <span class="icon icon-cloud-thunder"></span>
                          Activity
                        </span>
                        <span class="nav-group-item">
                          <span class="icon icon-check"></span>
                          Check Scores
                        </span>
                        <span class="nav-group-item">
                          <span class="icon icon-cog"></span>
                          Settings
                        </span>
                        <span class="nav-group-item">
                          <span class="icon icon-help-circled"></span>
                          Help/FAQ
                        </span>
                      </nav>
                </div>
                <div class="pane">Home</div>
              </div>
            </div>
          </div>
    </body>
</html>

Пожалуйста, помогите! Я ничего не понимаю в этом, искал везде. Я пришел из Python, где не так много фронт-энда или графического дизайна. Спасибо!

Здесь есть «своего рода» решение, но оно использует что-то под названием Sass, и, насколько я знаю, лучше использовать что-то вроде React или Angular. Я никогда не использовал ни одного из них.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Электронные приложения очень похожи на веб-приложения.Как вы заметили, традиционный способ навигации между документами HTML не работает хорошо для приложений.Вот почему в настоящее время веб-приложения разрабатываются как одностраничные приложения (SPA).Это просто означает загрузку и замену частей страницы вручную с использованием JavaScript, когда пользователь перемещается.Есть несколько способов реализовать это, но вот пример того, как это можно сделать для вашего кода:

// Get all the navigation links to an array
const naviLinks = Array.from(document.getElementsByClassName("nav-group-item"));
const contentEl = document.getElementsByClassName("pane")[0];

naviLinks.forEach((linkEl) => {
    // Listen click event for the navigation link
    linkEl.addEventListener("click", e => {
        // Prevent default behavior for the click-event
        e.preventDefault();
        // Get the path to page content file
        const href = linkEl.getAttribute("href");
        if (href) {
            // Use node.js fs-module to read the file
            const fs = require("fs");
            fs.readFile(href, (err, data) => {
                if (err) {
                    throw err;
                }
                // show the selected page
                contentEl.innerHTML = "";
                contentEl.insertAdjacentHTML("beforeend", data);
            })
        }
    })
})

Обратите внимание, что HTML-файлы содержимого страницы (accounts.html и т. Д.) Должны иметь только содержимое для«Панель» div.Вам также нужно передать nodeIntegration:true при создании BrowserWindow -объекта в главном процессе, чтобы вы могли использовать require для загрузки fs -модуля:

new BrowserWindow({
    webPreferences: {
        nodeIntegration: true
    }
}

Если страницафайлы содержимого большие, навигация может показаться медленной, поскольку файлы читаются, а страницы отображаются при каждом нажатии.Одна из оптимизаций, которая поможет с этим, - это читать файлы и создавать элементы страницы вне экрана уже при загрузке страницы, а затем просто поменять их местами на click-событиях.В качестве альтернативы вы можете поместить содержимое страницы в <template> -элементы и поменять их местами.Я оставлю это для вас, чтобы попробовать сами, если вам интересно.

Существует множество платформ JavaScript, которые могут помочь вам в создании SPA.На данный момент популярными являются React, Angular и Vue. «Как я могу создать графический интерфейс с большим количеством компонентов?» - это один из вопросов, на который могут ответить интерфейсные JavaScript-фреймворки, но, конечно, есть кривая обучения.Когда вы почувствуете необходимость начать разбивать свой графический интерфейс на многократно используемые или иерархические компоненты, возможно, стоит подумать об этих средах JavaScript.

0 голосов
/ 27 апреля 2019

Некоторое время назад я сделал некоторый код, чтобы сделать это (к сожалению, это довольно сложно, но реализовать его не должно быть так сложно).

Вы помещаете эту функцию на каждую страницу:

function loadPageWithIframe (url) {
    var hiddenPage = document.createElement("iframe");
    hiddenPage.setAttribute("src", url);
    hiddenPage.style.display = 'none';
    document.body.appendChild(hiddenPage);
    hiddenPage.onload = function () {
        var frameDocument = hiddenPage.document;
        if (hiddenPage.contentDocument) {
            frameDocument = hiddenPage.contentDocument;
        } else if (hiddenPage.contentWindow) {
            frameDocument = hiddenPage.contentWindow.document;
        }
        document.open();
        document.write(frameDocument.documentElement.innerHTML);
        document.close();
        window.history.pushState("", document.title, url.replace('https://' + window.location.hostname, ''));
    }
}

И этот код в вашем файле Electron:

mainWindow.webContents.on('will-navigate', function (evt, url) {
    evt.preventDefault();
    mainWindow.webContents.executeJavaScript('loadPageWithIframe("' + url + '");');
});

И если вы введете код правильно, он должен работать автоматически, без какого-либо дополнительного кода.

Способ работает так:Вы вызываете функцию loadPageWithIframe, когда хотите перейти на URL, затем он создает iframe и загружает страницу, копирует весь html из iframe и переписывает HTML-код текущей страницы с помощью HTML-кода iframes.

Но вместо того, чтобы вызывать функцию loadPageWithIframe вручную при каждом щелчке, вы можете использовать событие Electron will-navigate, чтобы сообщить нам, что оно переходит на другую страницу, а затем вызвать loadPageWithIframe (это цель электронного кода, которыйЯ отправил).

Я надеюсь, что Помогает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...