новое окно в приложении Electron vuejs с хэшем режима маршрутизатора

#vue.js #electron #vue-router

Вопрос:

В контексте приложения Electron vuejs мне нужно использовать много окон в моем приложении, например, модалы на веб-сайте.

Для этого я создал сервис для управления окном/модалом в своем приложении.

В начале создания моего электронного приложения я использую vue-маршрутизатор с режимом истории.

В этом режиме маршрутизатора все мои окна работают как по волшебству

НО моя электронная производственная среда не работает, потому что я использую режим маршрутизатора истории.

Теперь я использую маршрутизатор в режиме хэширования (подробнее объясню здесь)

и моя производственная среда работает как волшебство

НО сейчас (и это главное в этом посте!) Все новые созданные окна содержимого одинаковы.

Это первый URL-адрес компонента, смонтированный, потому что связанный URL-адрес «/». Маршрутизатору наплевать на весь URL-путь, как это : http://localhost:8080/employee/edit/20 Исключительно то, что : http://localhost:8080/

это мой код, который запускает окно(модальное) :

 createModal(type, params = null, event)
{
    this.browserWindow = this.createBrowserWindow()
    this.setURL(type, params)
    this.browserWindow.show()
    
    event.sender.send("modal-end", "yes")
}

createBrowserWindow()
{
    return new BrowserWindow({width: 650, height: 800, show: false, frame: true,
        webPreferences: {
            webSecurity: false,
            plugins: true,
            nodeIntegration: (process.env.ELECTRON_NODE_INTEGRATION)},
            enableRemoteModule: true,
            // contextIsolation: false
    });
}

    if (process.env.WEBPACK_DEV_SERVER_URL)
    {
        console.log('here modal url')
        console.log(process.env.WEBPACK_DEV_SERVER_URL   url)
        
        this.browserWindow.loadURL(process.env.WEBPACK_DEV_SERVER_URL   url)
        // this.browserWindow.loadURL("https://www.google.com");
        if (!process.env.IS_TEST) this.browserWindow.webContents.openDevTools()
    }
    else
    {
        createProtocol('app')
        this.browserWindow.loadURL('app://./index.html')
        // this.browserWindow.webContents.openDevTools()
        
    }
 

У вас есть идея, как создать новое окно electron в vue framework и режиме хэширования vue-маршрутизатора
, в котором отображается содержимое другого компонента vue, кроме первого смонтированного приложения компонента ?

Техническая информация :

  • Электрон : 11.2.0
  • Vuejs : 2.6.12
  • dev env : Сервер разработки Webpack (webpack : 4.45.0)

Комментарии:

1. Вы когда-нибудь находили решение этой проблемы? У меня та же проблема, и после нескольких часов поисков я полностью застрял.

Ответ №1:

У меня была та же проблема с новым электронным окном, содержащим все приложение, а не новую страницу, которую я указал в маршруте. Я не знаю, как у вас настроено приложение.vue, но в моем случае проблема заключалась в том, что страницу приложения нужно было изменить на просто содержащую <router-view></router-view> , а затем вам нужно переместить все остальное на другую страницу и направить маршрутизатор на эту страницу. Подобный этому:

Приложение.vue

 <template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

<script>
  export default {
    name: 'my-app'
  }
</script>
 

Main.js

 <template>
  <div id="main">
    <Header />  
    <ComponentOne />
    <ComponentTwo />   
  </div>
</template>

<script>
import Header from './Header.vue'
import ComponentOne from "./ComponentOne.vue"
import ComponentTwo from './ComponentTwo.vue'

export default {
  name: 'main',
  components: {
    Header, 
    ComponentOne,
    ComponentTwo
  }
}
</script>
 

Router.js

 import { createWebHashHistory, createRouter } from 'vue-router'

const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    {
      path: '/',
      name: 'main',
      component: require('@/components/Main.vue').default
    },
    {
      path: '/set',
      name: 'Settings',
      component: require('@/components/Settings.vue').default
    }  
  ]
})
export default router
 

В index.js, где бы вы ни настроили свои меню:

 {
  label: 'Settings',
  click() {         
    let win = new BrowserWindow({ 
      width: 800, 
      height: 600, 
      webPreferences: { 
          nodeIntegration: true,  
          contextIsolation: false
      }
    })
    win.on('close', function () { win = null })
    const setURL = process.env.NODE_ENV === 'development'
    ? 'http://localhost:9080/#/set'
    : `file://${__dirname}/index.html#/set`     
    win.loadURL(setURL)
    win.show()
  }
}
 

Примечание. Эти параметры веб-настроек являются проблемой безопасности для некоторых проектов, пожалуйста, проверьте: https://www.electronjs.org/docs/latest/tutorial/security