electron27-react-mateos:基于electron+react18仿matePad桌面系統

基于Electron27+React18+ArcoDesign搭建桌面版OS管理系統。

electron-react-mateos 基于最新前端跨端技術棧electron27.x+react18+arco-design+zustand4+sortablejs構建的一款仿制matePad界面多層級路由管理OS系統。

在這里插入圖片描述
在這里插入圖片描述
ElectronReactOS支持桌面多路由配置,新開窗口+彈窗開啟路由頁面。

在這里插入圖片描述

在這里插入圖片描述

使用技術

  • 編碼開發:vscode
  • 框架技術:electron27+vite4+react18+zustand+react-router
  • 打包工具:electron-builder^24.6.4
  • 組件庫:arco-design (字節react輕量級UI組件庫)
  • 拖拽組件:sortablejs
  • 模擬請求:axios
  • 彈窗組件:rdialog (基于react多功能layer彈窗)
  • 美化滾動條:rscroll (基于react虛擬滾動條組件)

在這里插入圖片描述
如何使用electron27創建多窗口,可以去看看這篇分享文章。

https://blog.csdn.net/yanxinyun1990/article/details/134047329

在這里插入圖片描述

項目結構目錄

使用vite4構建工具創建react18項目,遵循react hooks語法編碼開發。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

electron+react桌面布局

在這里插入圖片描述
桌面分為頂部欄+桌面端路由菜單+底部Dock菜單三大模塊。

<div className="radmin__layout flexbox flex-col">{/* 導航欄 */}<Header />{/* 桌面區域 */}<div className="ra__layout-desktop flex1 flexbox" onContextMenu={handleDeskCtxMenu} style={{marginBottom: 70}}><DeskMenu /></div>{/* Dock菜單 */}<Dock />
</div>

electron實現dock菜單

在這里插入圖片描述
在這里插入圖片描述
dock菜單采用背景濾鏡模糊效果、支持自適應伸縮、拖拽排序等功能。

<div className="ra__docktool"><div className={clsx('ra__dock-wrap', !dock ? 'compact' : 'split')}>{dockMenu.map((res, key) => {return (<div key={key} className="ra__dock-group">{ res?.children?.map((item, index) => {return (<a key={index} className={clsx('ra__dock-item', {'active': item.active, 'filter': item.filter})} onClick={() => handleDockClick(item)}><span className="tooltips">{item.label}</span><div className="img">{ item.type != 'icon' ? <img src={item.image} /> : <Icon name={item.image} size={32} style={{color: 'inherit'}} /> }</div></a>)})}</div>)})}</div>
</div>
const dockMenu = [{// 圖片圖標children: [{label: 'Safari', image: '/static/mac/safari.png', active: true},{label: 'Launchpad', image: '/static/mac/launchpad.png'},{label: 'Contacts', image: '/static/mac/contacts.png'},{label: 'Messages', image: '/static/mac/messages.png', active: true}]},{// 自定義iconfont圖標children: [{label: 'Home', image: <IconDesktop />, type: 'icon'},{label: 'About', image: 've-icon-about', type: 'icon'}]},{children: [{label: 'Appstore', image: '/static/mac/appstore.png'},{label: 'Mail', image: '/static/mac/mail.png'},{label: 'Maps', image: '/static/mac/maps.png', active: true},{label: 'Photos', image: '/static/mac/photos.png'},{label: 'Facetime', image: '/static/mac/facetime.png'},{label: 'Calendar', image: '/static/mac/calendar.png'},{label: 'Notes', image: '/static/mac/notes.png'},{label: 'Calculator', image: '/static/mac/calculator.png'},{label: 'Music', image: '/static/mac/music.png'}]},{children: [{label: 'System', image: '/static/mac/system.png', active: true, filter: true},{label: 'Empty', image: '/static/mac/bin.png', filter: true}]}
]// 點擊dock菜單
const handleDockClick = (item) => {const { label } = itemif(label == 'Home') {createWin({title: '首頁',route: '/home',width: 900,height: 600})}else if(label == 'About') {setWinData({ type: 'CREATE_WIN_ABOUT' })}else if(label == 'System') {createWin({title: '網站設置',route: '/setting/system/website',isNewWin: true,width: 900,height: 600})}
}useEffect(() => {const dockGroup = document.getElementsByClassName('ra__dock-group')// 組拖拽for(let i = 0, len = dockGroup.length; i < len; i++) {Sortable.create(dockGroup[i], {group: 'share',handle: '.ra__dock-item',filter: '.filter',animation: 200,delay: 0,onEnd({ newIndex, oldIndex }) {console.log('新索引:', newIndex)console.log('舊索引:', oldIndex)}})}
}, [])

electron+react18實現桌面級路由

在這里插入圖片描述

/*** Desk桌面多層級路由菜單* Create by andy  Q:282310962
*/export default function DeskMenu() {const t = Locales()const filterRoutes = routes.filter(item => !item?.meta?.isWhite)// 桌面二級菜單彈框const DeskPopup = (item) => {const { key, meta, children } = itemreturn (!meta?.isHidden &&<RScroll maxHeight={220}><div className="ra__deskmenu-popup__body">{ children.map(item => {if(item?.children) {return DeskSubMenu(item)}return DeskMenu(item)})}</div></RScroll>)}// 桌面菜單項const DeskMenu = (item) => {const { key, meta, children } = itemreturn (!meta?.isHidden &&<div key={key} className="ra__deskmenu-block"><a className="ra__deskmenu-item" onClick={()=>handleDeskClick(item)} onContextMenu={handleDeskCtxMenu}><div className="img">{meta?.icon ?isImg(meta?.icon) ? <img src={meta.icon} /> : <Icon name={meta.icon} size={40} />:<Icon name="ve-icon-file" size={40} />}</div>{ meta?.name && <span className="title clamp2">{t[meta.name]}</span> }</a></div>)}// 桌面二級菜單項const DeskSubMenu = (item) => {const { key, meta, children } = itemreturn (!meta?.isHidden &&<div key={key} className="ra__deskmenu-block"><a className="ra__deskmenu-item group" onContextMenu={e=>e.stopPropagation()}><Popovertitle={<div className="ra__deskmenu-popup__title">{meta?.name && t[meta.name]}</div>}content={() => DeskPopup(item)}trigger="hover"position="right"triggerProps={{popupStyle: {padding: 5},popupAlign: {right: [10, 45]},mouseEnterDelay: 300,// showArrow: false}}style={{zIndex: 100}}><div className="img">{children.map((child, index) => {if(child?.meta?.isHidden) returnreturn child?.meta?.icon ?isImg(child?.meta?.icon) ? <img key={index} src={child.meta.icon} /> : <Icon key={index} name={child.meta.icon} size={10} />:<Icon key={index} name="ve-icon-file" size={10} />})}</div></Popover>{ meta?.name && <span className="title clamp2">{t[meta.name]}</span> }</a></div>)}// 點擊dock菜單const handleDeskClick = (item) => {const { key, meta, element } = itemconst reg = /[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/if(reg.test(key)) {window.open(key)}else {if(meta?.isNewWin) {// 新窗口打開createWin({title: t[meta?.name] || meta?.title,route: key,width: 900,height: 600})}else {// 彈窗打開rdialog({title: t[meta?.name] || meta?.title,content: <BrowserRouter>{element}</BrowserRouter>,maxmin: true,showConfirm: false,area: ['900px', '550px'],className: 'rc__dialogOS',customStyle: {padding: 0},zIndex: 100})}}}// 右鍵菜單const handleDeskCtxMenu = (e) => {e.stopPropagation()let pos = [e.clientX, e.clientY]rdialog({type: 'contextmenu',follow: pos,opacity: .1,dialogStyle: {borderRadius: 3, overflow: 'hidden'},btns: [{text: '打開'},{text: '重命名/配置'},{text: '刪除',click: () => {rdialog.close()}}]})}useEffect(() => {const deskEl = document.getElementById('deskSortable')Sortable.create(deskEl, {handle: '.ra__deskmenu-block',animation: 200,delay: 0,onEnd({ newIndex, oldIndex }) {console.log('新索引:', newIndex)console.log('舊索引:', oldIndex)}})}, [])return (<div className="ra__deskmenu" id="deskSortable">{ filterRoutes.map(item => {if(item?.children) {return DeskSubMenu(item)}return DeskMenu(item)})}</div>)
}

好了,以上就是electron+react18開發桌面os的一些知識分享。

https://blog.csdn.net/yanxinyun1990/article/details/132825719

https://blog.csdn.net/yanxinyun1990/article/details/131408928

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165793.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165793.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165793.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YB4051系列設備是高度集成的 Li-lon 和 Li-Pol 線性充電器,針對便攜式應用的小容量電池。

YB4051H 300mA 單電池鋰離子電池充電器0.1 mA 終端&#xff0c;45nA 電池漏電流 概述&#xff1a; YB4051系列設備是高度集成的 Li-lon 和 Li-Pol 線性充電器&#xff0c;針對便攜式應用的小容量電池。它是一個完整的恒流/恒壓線性充電器。不需要外部感應電阻&#xff0c;由于…

51單片機利用I/O口高阻狀態實現觸摸控制LED燈

51單片機利用I/O口高阻狀態實現觸摸控制LED燈 1.概述 這篇文章介紹使用I/O口的高阻狀態實現一個觸摸控制LED燈亮滅的實驗。該實驗通過手觸摸P3.7引腳&#xff0c;改變電平信號控制燈的亮滅。 2.實驗過程 2.1.實驗材料 名稱型號數量單片機STC12C20521LED彩燈無1晶振12MHZ1電…

Elasticsearch:ES|QL 函數及操作符

如果你對 ES|QL 還不是很熟悉的話&#xff0c;請閱讀之前的文章 “Elasticsearch&#xff1a;ES|QL 查詢語言簡介???????”。ES|QL 提供了一整套用于處理數據的函數和運算符。 功能分為以下幾類&#xff1a; 目錄 ES|QL 聚合函數 AVG COUNT COUNT_DISTINCT 計數為近…

geemap學習筆記013:為遙感動態GIF圖添加圖名

前言 遙感動態GIF圖可以展示地理區域隨時間的變化&#xff0c;這對于監測自然災害、濕地變化、城市擴展、農田變化等方面非常有用&#xff0c;并且可以反復觀察圖像&#xff0c;以更深入地了解地表的動態變化。本節主要是對遙感動態GIF圖添加圖名&#xff0c;以便于更好地理解…

聚觀早報 |一加12正式開啟預訂;OPPO Reno11系列賣點

【聚觀365】11月24日消息 一加12正式開啟預訂 OPPO Reno11系列賣點 小鵬第三季度營收財報 Claude 2.1 聊天機器人公布 現代汽車將與倫敦大學學院合作 一加12正式開啟預訂 全新的一加12系列公開亮相已有一段時間&#xff0c;不久前一加官方宣布&#xff0c;該機將于12月4日…

android:The application could not be installed: INSTALL_FAILED_TEST_ONLY

1、問題描述 在android12 &#xff08;OPPO PEEM00&#xff09;上安裝APP時&#xff0c;提示上述異常 原因分析&#xff1a; android:testOnly&#xff1a;應用是否是為了測試&#xff0c;它可能向外暴露數據&#xff0c;引發安全漏洞。因此國內廠商的手機檢測到這個屬性為t…

ebpf實戰(一)-------監控udp延遲

問題背景: 為了分析udp數據通信中端到端的延遲,我們需要對整個通信鏈路的每個階段進行監控,找出延遲最長的階段. udp接收端有2個主要路徑 1.數據包到達本機后&#xff0c;由軟中斷處理程序將數據包接收并放入udp socket的接收緩沖區 數據接收流程 2. 應用程序調用recvmsg等a…

<JavaEE> 什么是進程控制塊(PCB Process Control Block)?

目錄 一、進程控制塊的概念 二、進程控制塊的重要屬性 2.1 唯一身份標識&#xff08;PID&#xff09; 2.2 內存指針 2.3 文件描述符表 2.4 狀態 2.5 優先級 2.6 記賬信息 2.7 上下文 一、進程控制塊的概念 進程控制塊&#xff08;Process Control Block, PCB&#xff…

Springboot引入分布式搜索引擎Es RestAPI

文章目錄 RestAPI初始化RestClient創建索引庫刪除索引庫判斷索引庫是否存在總結 RestClient操作文檔增加文檔數據查詢文檔刪除文檔修改文檔批量導入文檔小結 RestAPI ES官方提供了各種不同語言的客戶端&#xff0c;用來操作ES。這些客戶端的本質就是組裝DSL語句&#xff0c;通…

IOS Frida 常用腳本

調用堆棧 console.log("bt:" + Thread.backtrace(this.context,Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join(\n\t)); Hook 調用,修改返回值 // Get a reference to the openURL selectorvar openURL = ObjC.classes.UIApplication["- openURL:&qu…

uni-app 跨端開發注意事項

文章目錄 前言H5正常但App異常的可能性標題二H5正常但小程序異常的可能性小程序正常但App異常的可能性小程序或App正常&#xff0c;但H5異常的可能性App正常&#xff0c;小程序、H5異常的可能性使用 Vue.js 的注意區別于傳統 web 開發的注意H5 開發注意微信小程序開發注意支付寶…

Docker實用篇

Docker實用篇 0.學習目標 1.初識Docker 1.1.什么是Docker 微服務雖然具備各種各樣的優勢&#xff0c;但服務的拆分通用給部署帶來了很大的麻煩。 分布式系統中&#xff0c;依賴的組件非常多&#xff0c;不同組件之間部署時往往會產生一些沖突。在數百上千臺服務中重復部署…

STM32入門筆記15_PWR電源管理模塊

PWR和低功耗模式 PWR簡介 PWR(Power Control) 電源控制PWR負責管理STM32內部的電源供電部分&#xff0c;可以實現可編程電壓檢測器和低功耗模式的功能可編程電壓檢測器(PVD) 可以監控VDD電源電壓&#xff0c;當VDD下降到PVD閾值以下或上升到PVD閾值之上時&#xff0c;PVD會觸…

C++學習之路(一)什么是C++?如何循序漸進的學習C++?【純干貨】

C是一種高級編程語言&#xff0c;是對C語言的擴展和增強。它在C語言的基礎上添加了面向對象編程&#xff08;OOP&#xff09;的特性&#xff0c;使得開發者能夠更加靈活和高效地編寫代碼。 C的名字中的“”符號表示在C語言的基礎上向前發展一步&#xff0c;即“加加”&#x…

iOS APP包分析工具 | 京東云技術團隊

介紹 分享一款用于分析iOSipa包的腳本工具&#xff0c;使用此工具可以自動掃描發現可修復的包體積問題&#xff0c;同時可以生成包體積數據用于查看。這塊工具我們團隊內部已經使用很長一段時間&#xff0c;希望可以幫助到更多的開發同學更加效率的優化包體積問題。 工具下載…

LeeCode前端算法基礎100題(4)- 無重復字符的最長子串

一、問題詳情&#xff1a; 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長子串 的長度。 示例 1: 輸入: s "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc"&#xff0c;所以其長度為 3。示例 2: 輸入: s "bbbbb…

在VMware Workstation的Centos上實現KVM虛擬機的安裝部署:詳細安裝部署過程(保姆級)

KVM概述 ? 以色列qumranet公司研發&#xff0c;后被RedHad公司收購 &#xff08;1&#xff09;kvm只支持x86平臺 &#xff08;2&#xff09;依賴于 HVM,inter VT AMD-v ? KVM是&#xff08;Kernel-based Virtual Machine&#xff09;的簡稱&#xff0c;是一個開源的系統虛擬…

Spark---補充算子

一、Spark補充Transformation算子 1、join,leftOuterJoin,rightOuterJoin,fullOuterJoin 作用在K&#xff0c;V格式的RDD上。根據K進行連接&#xff0c;對&#xff08;K&#xff0c;V&#xff09;join&#xff08;K&#xff0c;W&#xff09;返回&#xff08;K&#xff0c;&a…

世界復合醫學雜志世界復合醫學雜志社世界復合醫學編輯部2023年第8期目錄

論著 能譜&#xff08;Revolution&#xff09;CT胸腹聯合胸痛三聯CTA掃描對急性胸痛患者疾病的差異分析 左明飛;溫麗娟;焦宇; 1-38 超聲引導下肩袖間隙注射及肩胛上神經阻滯聯合觸發點針刺治療粘連性肩關節囊炎的療效分析 余菲;王嫻;戴甫成;張維;劉武;孫勇; 4-8 神…

python tkinter 使用(六)

python tkinter 使用&#xff08;六&#xff09; 本文主要講述tkinter中進度條的使用。 1:確定的進度條 progressbar tkinter.ttk.Progressbar(root, mode"determinate", maximum100, value0) progressbar.pack()def updateProgressBar():for i in range(100):pr…