三、Tauri 使用(各种设置)

1.开启所有API使用
{
  "tauri": {
 ?  "allowlist": {
 ? ?  "all": true,
 ?  }
  }
}
2.关闭鼠标右键
window.addEventListener('contextmenu', (e) => e.preventDefault(), false);
?
// 在生成环境关闭鼠标右键
if (import.meta.env.MODE === "production") {
  window.addEventListener("contextmenu", (e) => e.preventDefault(), false);
}
3.修改图标

①在项目根目录下放入要替换的图标,重命名为 app-icon.png

②运行

pnpm tauri icon
4.多窗口

注意:窗口标签必须是唯一的,并且可以在运行时用于访问窗口实例。此处使用的是在 JavaScript 中创建窗口

免责声明窗口使用创建新窗口的方法创建出来的,使用时直接导入即可

import { WebviewWindow } from "@tauri-apps/api/window";
?
// 创建新窗口
export const createWin = (options: any) => {
  const webview = new WebviewWindow(options.label, {
 ?  url: options.url, // 窗口的URL
 ?  title: options.title, // 窗口的标题
 ?  width: options.width, // 初始宽度 (number)
 ?  height: options.height, // 初始高度 (number)
 ?  minWidth: options.minWidth, // 窗口的最小宽度 (number)
 ?  minHeight: options.minHeight, // 窗口的最小高度 (number)
 ?  maxWidth: options.maxWidth, // 窗口的最大宽度 (number)
 ?  maxHeight: options.maxHeight, // 窗口的最大高度 (number)
 ?  resizable: options.resizable, // 窗口是否可调整大小 (boolean)
 ?  x: options.x, // 窗口左上角的水平位置 (number)
 ?  y: options.y, // 窗口左上角的垂直位置 (number)
 ?  center: options.center, // 是否位于屏幕中央显示窗口 (boolean)
 ?  alwaysOnTop: options.alwaysOnTop, // 窗口是否应始终位于其他窗口之上 (boolean)
 ?  fullscreen: options.fullscreen, // 窗口是否应全屏显示 (boolean)
 ?  decorations: options.decorations, // 窗口是否应具有装饰边框和条 (boolean)
 ?  fileDropEnabled: options.fileDropEnabled, // 窗口是否应接收文件拖放 (boolean)
 ?  skipTaskbar: options.skipTaskbar, // 是否将窗口添加到任务栏 (boolean)
 ?  contentProtected: options.contentProtected, // 防止窗口内容被其他应用程序捕获 (boolean)
 ?  focus: options.focus, // 窗口是否应自动获取焦点 (boolean)
 ?  visible: options.visible, // 窗口是否应可见 (boolean)
  });
?
  // 窗口创建成功触发
  webview.once("tauri://created", function () {
 ?  console.log(options.title + "创建成功!!!");
  });
?
  // 窗口创建失败触发
  webview.once("tauri://error", function (e) {
 ?  console.log(options.title + "创建失败!!!", e);
  });
};
?
// 关闭窗口
export const closeWin = (label: string) => {
  const win = WebviewWindow.getByLabel(label);
  if (win) {
 ?  win.close();
  } else {
 ?  console.error(`无法找到标签为 ${label} 的窗口`);
  }
};
?
// 隐藏窗口
export const hideWin = (label: string) => {
  const win = WebviewWindow.getByLabel(label);
  if (win) {
 ?  win.hide();
  } else {
 ?  console.error(`无法找到标签为 ${label} 的窗口`);
  }
};
?
// 显示窗口
export const showWin = (label: string) => {
  const win = WebviewWindow.getByLabel(label);
  if (win) {
 ?  win.show();
  } else {
 ?  console.error(`无法找到标签为 ${label} 的窗口`);
  }
};
?
// 免责声明窗口
export const disclaimerWin = () => {
  createWin({
 ?  label: "Disclaimer",
 ?  title: "免责声明",
 ?  url: "/disclaimer",
 ?  center: true,
 ?  width: 800,
 ?  height: 740,
 ?  resizable: false,
  });
};
5.初始屏幕

如果网页需要一些时间来加载,或者你需要在显示主窗口之前在 Rust 中运行初始化过程,那么启动画面可以改善用户的加载体验。

第一种方法:

①首先需要隐藏主窗口 tauri.config.json

"windows": [
 ? ?  {
 ? ? ?  "fullscreen": false,
 ? ? ?  "resizable": true,
 ? ? ?  "title": "有米TG营销助理",
 ? ? ?  "center": true,
 ? ? ?  "width": 600,
 ? ? ?  "height": 400,
 ? ? ?  "minWidth": 600,
 ? ? ?  "minHeight": 400,
 ? ? ?  "visible": false
 ? ?  }
 ?  ]

②创建初始屏幕,直接在tauri,config.json中创建,如下

"windows": [
  {
 ?  "title": "Tauri App",
 ?  "width": 800,
 ?  "height": 600,
 ?  "resizable": true,
 ?  "fullscreen": false,
 ?  "visible": false
  },
  // Add the splashscreen window
  {
 ?  "width": 400,
 ?  "height": 200,
 ?  "decorations": false,
 ?  "url": "splashscreen.html",
 ?  "label": "splashscreen"
  }
]

③等待网页

use tauri::Manager;
// 创建命令:
// 该命令必须是异步的,以便它不会在主线程上运行。
#[tauri::command]
async fn close_splashscreen(window: tauri::Window) {
  // 关闭初始屏幕
  if let Some(splashscreen) = window.get_window("splashscreen") {
 ?  splashscreen.close().unwrap();
  }
  // 显示主窗口
  window.get_window("main").unwrap().show().unwrap();
}
?
// 注册命令:
fn main() {
  tauri::Builder::default()
 ?  // Add this line
 ?  .invoke_handler(tauri::generate_handler![close_splashscreen])
 ?  .run(tauri::generate_context!())
 ?  .expect("failed to run app");
}

④使用

import { invoke } from '@tauri-apps/api/tauri'
?
document.addEventListener('DOMContentLoaded', () => {
  // 这将等待窗口加载,但你可以在您想要的任何触发器上运行此函数
  invoke('close_splashscreen')
})

第二种方法:

①首先需要隐藏主窗口 tauri.config.json

"windows": [
 ? ?  {
 ? ? ?  "fullscreen": false,
 ? ? ?  "resizable": true,
 ? ? ?  "title": "有米TG营销助理",
 ? ? ?  "center": true,
 ? ? ?  "width": 600,
 ? ? ?  "height": 400,
 ? ? ?  "minWidth": 600,
 ? ? ?  "minHeight": 400,
 ? ? ?  "visible": false
 ? ?  }
 ?  ]

②使用创建多窗口,在页面调用创建多窗口的方法

disclaimerWin();

③使用定时器或者点击事件关闭初始屏幕,显示主窗口

// 关闭当前窗口
closeWin("Disclaimer");
?
// 显示主窗口
showWin("main");
6.打开文件/目录选择对话框

由于使用的是axios,上传文件无法完成,就是用的该方法,将文件传递给后端

options

类型

描述

defaultPath

string

初始目录或文件路径

directory

boolean

对话框是否为文件选择

filters

DialogFilter[]

对话框的筛选

multiple

boolean

是否允许多个选择

recursive

boolean

如果目录为 true,则指示以后将递归地读取它。定义范围上是否允许子目录。

title

string

对话窗口标题

import { open } from '@tauri-apps/api/dialog';
?
const selected = await open({
  multiple: true, 
  filters: [{
 ?  name: 'Image',
 ?  extensions: ['png', 'jpeg']
  }]
});
?
if (Array.isArray(selected)) {
  // 用户选择多个文件
} else if (selected === null) {
  // 用户取消文件选择
} else {
  // 用户选择一个文件
}
7.修改窗口

登录成功需要修改窗口可以使用下面的方法

import { appWindow, LogicalSize } from '@tauri-apps/api/window';
?
await appWindow.setResizable(true);  // 是否可以更改该大小
await appWindow.setSize(new LogicalSize(1920, 1080));  // 窗口重置宽高
await appWindow.setMinSize(new LogicalSize(1920, 1080));  // 窗口重置最小宽高
await appWindow.center();  // 窗口居中
8.退出窗口操作
import { exit } from '@tauri-apps/api/process';
?
await exit(0);
### 解决 Tauri 应用程序运行时端口占用问题 当开发 Tauri 应用并遇到端口被其他进程占用的情况时,可以通过多种方法来解决问题。 #### 方法一:更改前端服务器启动端口 如果使用的是 Vue 或者类似的框架作为前端部分,通常这些框架允许指定不同的端口号。对于 Vue CLI 来说,可以在 `vue.config.js` 中设置 devServer.port 属性[^1]: ```javascript module.exports = { devServer: { port: 8081 // 更改为你希望使用的可用端口 } }; ``` 这样做的好处是不会影响到 Tauri 后端逻辑,默认情况下两者之间通信不需要特定端口配置。 #### 方法二:查找并终止占用该端口的服务 另一种解决方案是从操作系统层面出发,找到正在监听目标端口的应用程序实例,并将其关闭。这一步骤取决于所处的操作系统环境: - **Windows**: 使用命令提示符中的 netstat 工具查看哪些进程占用了某个端口,之后通过 taskkill 命令结束对应 PID 的进程。 - **macOS/Linux**: 利用 lsof 或 ss 命令配合 grep 查找具体服务名称及其对应的进程 ID (PID),再借助 kill 指令释放资源。 需要注意的是,在生产环境中随意杀死未知来源的网络连接可能会带来风险,建议先确认清楚后再行动。 #### 方法:调整 Tauri 开发模式下的默认行为 Tauri 自身并不强制绑定任何固定的 HTTP(S) 端口用于内部通讯;相反地,它依赖于嵌入式的 webview 组件加载本地 HTML 文件。因此除非特别指定了 API server 地址或者其他需要暴露给外部访问的功能模块,否则一般不会存在因 Tauri 导致的端口冲突现象[^4]。 然而为了保险起见,仍然可以在项目的 Cargo.toml 文件里自定义某些参数以适应不同场景的需求,比如修改 build.rs 脚本里的相关选项等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值