electron中打開新窗口一般就是新開一個html頁面,vue是單頁面,只有一個入口文件,它的路由跳轉是H5的location;javascript
新增入口文件,就是新加html,但這樣失去了單頁面的做用,vue也沒法在兩個不一樣html中運行html
我我的的方法是子窗口打開同一個html文件,但路由地址不一樣
爲何要這樣,直接拖曳縮小不行嗎?vue
不行爲了佈局這些,設置了窗口最小大小,設置了之後,窗口的setSize方法中寬高小於最小寬高是無效的,mini化也就只能新建窗口了java
// main/index.js function createWindow () { // 初始化窗口就是mainWindow,省略 BrowserWindow.mainWindow = mainW; // 必定要加,用於判斷是否新建子窗口,不然會不斷新建 BrowserWindow.miniWindow = null; } // 監聽窗口狀態 ipc.on('winreduction', (event, state) => { // 監遵從mini窗口變回原來大小 if(state == 'mini') { // 主要是這裏,發送一個窗口要從mini模式還原到原來大小,事件從mini.vue發出 event.sender.send('full', 'reduction') } else { mainWindow.unmaximize(); } event.sender.send('statechange', 'reduction'); })
// app.vue // 在appvue裏新建子窗口 const electron = require("electron"); const ipc = electron.ipcRenderer; const currWin = electron.remote.getCurrentWindow(); import { setTimeout, clearTimeout, setImmediate } from "timers"; let miniWindow = null; function createMiniWin() { let miniWindow = new electron.remote.BrowserWindow({ width: 280, height: 48, frame: false, titleBarStyle: "hidden", // macOs useContentSize: true, show: false, center: true, resizable: false, webPreferences: { webSecurity: false // 禁用同源策略 } }); let winURL = window.location.href; let uri = winURL + winURL.substring(0, winURL.indexOf("#") + 1); if (/#/.test(uri)) { uri += "mini"; } else { uri += "#/mini"; } miniWindow.loadURL(uri); miniWindow.once("ready-to-show", () => { miniWindow.hide(); // mainWindow.setAlwaysOnTop(true, 'status'); // 老是最頂層 if (miniWindow.moveTop) { miniWindow.moveTop(); } }); miniWindow.on("closed", () => { miniWindow = null; }); return miniWindow; } // 這就是在index裏設置BrowserWindow.miniWindow的緣由,這樣就會只建立一次 if (electron.remote.BrowserWindow.miniWindow === null) { miniWindow = electron.remote.BrowserWindow.miniWindow = createMiniWin(); ipc.send("miniCreate", miniWindow); } export default { name: 'app', data() { return { state: "reduction", } }, mounted() { ipc.on("statechange", (event, data) => { this.state = data; mainWindow: electron.remote.BrowserWindow.mainWindow, miniWindow: electron.remote.BrowserWindow.miniWindow, }); ipc.on("full", (event, state) => { this.state = state; /* 這個是一個坑,原本我設想是路由跳轉回來,可是會致使窗口出現延遲,就像是打開網頁同樣的感受 由於是邊學邊用,沒有看過所有API,我找了半天,終於找到一個goBack方法,用於回退,沒有延遲 感受和原生同樣 */ this.mainWindow.webContents.goBack(); // mini隱藏,main顯示 this.miniWindow.hide(); this.mainWindow.show(); }); }, // 省略 watch: { state(old, news) { if (old == "mini") { // 點擊縮小按鈕,路由跳轉到mini,而且將主窗口隱藏,mini窗口顯示 this.$router.push({ name: "mini" }); this.miniShow(); } } } }
// mini.vue const electron = require("electron"); const remote = electron.remote; const ipc = electron.ipcRenderer; export default { name: "mini", data() { return { mainWindow: remote.BrowserWindow.mainWindow, }; }, created() {}, methods: { close() { ipc.send("winclose"); }, full() { ipc.send("winreduction", "mini"); // 發出要從mini窗口變回原來大小 } } };
mini還沒畫
接下來是另外一個問題,讀取本地的文件夾,就是上圖打開本地文件那個c++