上一篇有给大家分享Tauri创立多窗口利用实际。明天分享最新开发的Tauri+Vite3客户端聊天实例我的项目。
tauri-vue3-chat 基于 tauri+vue3+vite3+element-plus+v3layer
等技术开发仿微信客户端利用。
实现了发送图文音讯、图片+视频+网址预览、拖拽发送图片、朋友圈等性能。反对tauri关上多个窗体、主题换肤等性能。
技术框架
- 编辑器:VScode
- 应用技术:tauri+vue^3.2.37+vite^[email protected]
- UI组件库:element-plus^2.2.17 (饿了么vue3组件库)
- 弹窗组件:v3layer(基于vue3自定义pc端弹窗组件)
- 滚动条组件:v3scroll(基于vue3模仿滚动条组件)
- 矢量图标:阿里iconfont字体图标库
tauri多开窗体
tauri提供了多种创立新窗口的办法,依据我的项目需要,本人封装了一个前端多窗口生成器。
// 对于const openAboutWin = () => { createWin({ label: 'about', title: '对于', url: '/about', width: 430, height: 330, resizable: false, alwaysOnTop: true, })}// 主题换肤const openThemeSkinWin = () => { createWin({ label: 'skin', title: '换肤', url: '/skin', width: 630, height: 400, resizable: false, })}// 朋友圈const openQzoneWin = () => { createWin({ label: 'fzone', title: '朋友圈', url: '/fzone', width: 550, height: 700, resizable: false, })}
反对如下参数配置
// 窗口配置export const windowConfig = { label: null, // 窗口惟一label title: '', // 窗口题目 url: '', // 路由地址url width: 900, // 窗口宽度 height: 640, // 窗口高度 minWidth: null, // 窗口最小宽度 minHeight: null, // 窗口最小高度 x: null, // 窗口绝对于屏幕左侧坐标 y: null, // 窗口绝对于屏幕顶端坐标 center: true, // 窗口居中显示 resizable: true, // 是否反对缩放 maximized: false, // 最大化窗口 decorations: false, // 窗口是否无边框及导航条 alwaysOnTop: false, // 置顶窗口 fileDropEnabled: false, // 禁止零碎拖放 visible: false, // 暗藏窗口}
tauri自定义拖拽块
配置 decorations: false
参数,则创立的窗口没有顶部导航栏及边框。须要自定义拖拽性能。
设置 data-tauri-drag-region
属性,就能够自在拖拽窗体。
<template> <div class="nt__navbar"> <div data-tauri-drag-region class="nt__navbar-wrap"> <div class="nt__navbar-title"> <template v-if="$slots.title"><slot name="title" /></template> <template v-else>{{title}}</template> </div> </div> <WinTool :minimizable="minimizable" :maximizable="maximizable" :closable="closable"> <slot name="wbtn" /> </WinTool> </div></template>
tauri创立零碎拖拽
/** * 创立系统托盘图标Tray */use tauri::{ AppHandle, Manager, CustomMenuItem, SystemTray, SystemTrayEvent, SystemTrayMenu, SystemTrayMenuItem, SystemTraySubmenu};// 托盘菜单pub fn menu() -> SystemTray { let exit = CustomMenuItem::new("exit".to_string(), "退出"); let relaunch = CustomMenuItem::new("relaunch".to_string(), "重启利用"); let show = CustomMenuItem::new("show".to_string(), "显示窗口"); let hide = CustomMenuItem::new("hide".to_string(), "暗藏窗口"); let change_ico = CustomMenuItem::new("change_ico".to_string(), "更换托盘图标"); let tray_menu = SystemTrayMenu::new() .add_submenu(SystemTraySubmenu::new( "国际化", // 语言菜单 SystemTrayMenu::new() .add_item(CustomMenuItem::new("lang_english".to_string(), "English")) .add_item(CustomMenuItem::new("lang_zh_CN".to_string(), "简体中文")) .add_item(CustomMenuItem::new("lang_zh_HK".to_string(), "繁体中文")), )) .add_native_item(SystemTrayMenuItem::Separator) // 分割线 .add_item(change_ico) .add_native_item(SystemTrayMenuItem::Separator) .add_item(hide) .add_item(show) .add_native_item(SystemTrayMenuItem::Separator) .add_item(relaunch) .add_item(exit); SystemTray::new().with_menu(tray_menu)}// 托盘事件pub fn handler(app: &AppHandle, event: SystemTrayEvent) { match event { SystemTrayEvent::LeftClick { position: _, size: _, .. } => { println!("点击左键"); } SystemTrayEvent::RightClick { position: _, size: _, .. } => { println!("点击右键"); } SystemTrayEvent::DoubleClick { position: _, size: _, .. } => { println!("双击"); app.emit_all("win-show", {}).unwrap(); } SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() { // 更新托盘图标 "change_ico" => { app.tray_handle() .set_icon(tauri::Icon::Raw( include_bytes!("../icons/tray-empty.ico").to_vec() )) .unwrap(); } // 抉择语言,匹配 id 前缀蕴含 `lang_` 的事件 lang if lang.contains("lang_") => { Lang::new( app, id, vec![ Lang { name: "English", id: "lang_english", }, Lang { name: "繁体中文", id: "lang_zh_HK", }, Lang { name: "简体中文", id: "lang_zh_CN", }, ], ); } "hide" => { // println!("点击暗藏"); app.emit_all("win-hide", {}).unwrap(); } "show" => { // println!("点击显示"); app.emit_all("win-show", {}).unwrap(); } "relaunch" => { // println!("点击重启"); app.emit_all("win-relaunch", {}).unwrap(); } "exit" => { // println!("点击退出"); app.emit_all("win-exit", {}).unwrap(); } _ => {} }, _ => {} }}struct Lang<'a> { name: &'a str, id: &'a str,}impl Lang<'static> { fn new(app: &AppHandle, id: String, langs: Vec<Lang>) { // 获取点击的菜单项的句柄 langs.iter().for_each(|lang| { let handle = app.tray_handle().get_item(lang.id); if lang.id.to_string() == id.as_str() { // 设置菜单名称 handle.set_title(format!(" {}", lang.name)).unwrap(); handle.set_selected(true).unwrap(); } else { handle.set_title(lang.name).unwrap(); handle.set_selected(false).unwrap(); } }); }}
基于tauri+vue3创立聊天实例就先分享这么多吧。
https://segmentfault.com/a/11...
https://segmentfault.com/a/11...