electron实现类似浏览器与vscode的多标签窗体开发笔记

vscode就是基于electron开发,他的每一个编辑器就是一个broswerview,独立进程管理,今天我也来用electron实现一个类似vscode或浏览器的多tab标签独立船体新增删除切换效果。
看看效果

1、安装
mkdir my-electron-app cd my-electron-app npm init -y npm install electron --save-dev
2、main.js
const { app, BrowserWindow, BrowserView, ipcMain, Menu } = require('electron');
const path = require('path');
let mainWindow;
let views = [];
let tabCount = 0;
function createWindow() {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
contextIsolation: false
}
});
mainWindow.loadFile('index.html');
// 打开开发者工具
// mainWindow.webContents.openDevTools();
mainWindow.on('closed', () => {
mainWindow = null;
});
ipcMain.on('create-tab', (event, args) => {
createTab(args.url);
});
ipcMain.on('switch-tab', (event, args) => {
switchTab(args.index);
});
ipcMain.on('close-tab', (event, args) => {
closeTab(args.index);
});
ipcMain.on('close-other-tabs', (event, args) => {
closeOtherTabs(args.index);
});
ipcMain.on('file-dropped', (event, args) => {
createTab(`file://${args.filePath}`);
});
}
function createTab(url) {
const view = new BrowserView({
webPreferences: {
nodeIntegration: true,
contextIsolation: false
}
});
mainWindow.addBrowserView(view);
view.setBounds({ x: 0, y: 50, width: 800, height: 550 });
view.webContents.loadURL(url);
views.push(view);
mainWindow.webContents.send('tab-created', { index: views.length - 1, url });
}
function switchTab(index) {
const view = views[index];
mainWindow.setBrowserView(view);
view.setBounds({ x: 0, y: 50, width: 800, height: 550 });
}
function closeTab(index) {
const view = views[index];
mainWindow.removeBrowserView(view);
view.webContents.destroy();
views.splice(index, 1);
// 更新索引并通知渲染进程更新
mainWindow.webContents.send('tabs-updated', { views: views.map((_, idx) => idx) }...点击查看剩余70%
网友评论