Electron 拖拽 tabs 生成新窗口,再次拖拽到原位置可以吸附到 tabs 中

Electron 拖拽 tabs 生成新窗口,再次拖拽到原位置可以吸附到 tabs 中

嗨,老师
想要实现一个这样的效果,假如下图就是 mainWindow
头部会有一些描述信息、小菜单之类的
中间是一个 tabs
下面是内容区域
图片描述

现在需求是,类似浏览器 标签页 的交互方式:

  • tabs 支持拖拽,左右滑动,是与其他 tab 交换位置
  • 上下拖动,超出当前 tabs 区域后,会有一个缩略图跟随鼠标;鼠标释放,会生成一个新的窗体出来(多进程、从任务栏看变成了两个窗口)
  • 新窗口布局保持与 mainWindow 同样的布局,只不过只有一个 tab
  • 新窗口拖动,如果鼠标位置到了 mainWindow 的 tabs 区域,会再次变为一个普通的 tab,新窗口销毁(任务栏看,只有一个mainWindow)

这种需求需要怎么实现,不知道描述的清不清楚,请问老师有见过类似的需求,或有类似的库嘛

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

描述的很清楚与vscode与浏览器一样的拖拽效果是吗?


现在需求是,类似浏览器 标签页 的交互方式:

  • tabs 支持拖拽,左右滑动,是与其他 tab 交换位置

    ——这个前端就能实现,主要就是drag插件。vue: https://www.npmjs.com/package/vuedraggable , react: https://www.npmjs.com/package/react-draggable  , 通用: https://www.npmjs.com/package/sortablejs 

  • 上下拖动,超出当前 tabs 区域后,会有一个缩略图跟随鼠标;鼠标释放,会生成一个新的窗体出来(多进程、从任务栏看变成了两个窗口)

    ——复杂的事情简单化,分成几步:1.超出当前 tabs 区域后,会有一个缩略图跟随鼠标: mousedown 事件绑定一个小的div区域,2. 鼠标释放,会生成一个新的窗体出来:mouseup 事件创建新的窗口,同时捕获坐标位置把创建窗口移动到对应的位置。

  • 新窗口布局保持与 mainWindow 同样的布局,只不过只有一个 tab ——这个简单,就是初始化一个容口,只是需要注意初始化的坐标,需要从mouseup事件获取。

  • 新窗口拖动,如果鼠标位置到了 mainWindow 的 tabs 区域,会再次变为一个普通的 tab,新窗口销毁(任务栏看,只有一个mainWindow)——同第二点,这个代码部分可以参考https://github.com/atom/atom 与 vscode的代码:https://github.com/microsoft/vscode ,具体位置需要自己来找一下了,我试着找了一下,这两大IDE,全自己实现的:

    https://img1.sycdn.imooc.com//climg/6298d5fb0963c8c629480392.jpg


  • 烟小琦 提问者 #1
    老师,您太溜了😂
    2022-06-02 23:42:31
  • 烟小琦 提问者 #2

    嗨老师,还有一个疑问的地方:

    • 新窗口布局保持与 mainWindow 同样的布局,只不过只有一个 tab ——这个简单,就是初始化一个容口,只是需要注意初始化的坐标,需要从mouseup事件获取。

    这里,理解应该将被拖拽的那个 tab,在新窗体生成后隐藏掉,新窗体再初始化一个一样的页面进去;拖回来的时候,再将新窗体销毁,将原tab进行显示

    但是他们之间的数据,应该怎么保持同步,用通信进行管理吗

    2022-06-06 11:07:07
  • Brian 回复 提问者 烟小琦 #3

    但是他们之间的数据,应该怎么保持同步,用通信进行管理吗

    ——本地数据库,这种,一般三种搞法:

    1. 本地缓存或者内存:如,使用localStorage缓存,因为electron本身就是一个浏览器内核,是可以操作localStorage的。第三方库,有很多优秀的库:store2, localforage;

    2. 使用本地数据库进行缓存,有sqlite这种轻量的数据库;https://fmacedoo.medium.com/standalone-application-with-electron-react-and-sqlite-stack-9536a8b5a7b9

    3. 直接使用文件进行保存,使用一个临时文件的目录,比如.tmp或者.cache,缓存需要拖动的容口文件

    2022-06-07 10:13:44
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师