当前位置: 首页 > news >正文

网站实用性扬州网站建设suteng

网站实用性,扬州网站建设suteng,首尔面积,东莞网站推广案例“如果结果不如你所愿#xff0c;就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持#xff0c;而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 Tauri 技术教程 * 第五章 Tauri的进阶教程 第二节… “如果结果不如你所愿就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 Tauri 技术教程 * 第五章 Tauri的进阶教程 第二节 命令机制 一. 概述 本章节中我们将了解在前端项目中如何调用Rust端的代码。 Tauri 提供了一个简单但功能强大的command系统用于从 Web 应用调用 Rust 函数。命令可以接受参数并返回值。它们还可以返回错误和async。 二. 命令机制 Tauri 提供了一个命令功能用于以类型安全的方式访问 Rust 函数以及一个动态的事件系统。本章节我们先了解下他们的概念然后了解它的工作内容和方式。 1. 命令 Command Tauri 提供了一个简单但功能强大的command系统用于从 Web 应用调用 Rust 函数。命令可以接受参数并返回值。它们还可以返回错误和async。 2. 基本概念 1. 命令注释 定义的命令需要采用 注释#[tauri::command] 进行修饰。如下 #[tauri::command] fn my_custom_command() {println!(I was invoked from JavaScript!); }命令的构成由 注释 Rust函数基本构成 这里要注意命令名称必须全局唯一。 2. 构造函数注入 通过构建函数进行注入tauri::generate_handler 如下 tauri::generate_handler![my_custom_command]3. Invoke 函数 invoke函数的获取方式有2种 api 方式获取 import { invoke } from ‘tauri-apps/api/core’; 全局命令获取 在tauri.conf.json 中配置 app.withGlobalTauri 为trueconst invoke window.TAURI.core.invoke; 前端调用方式 invoke(my_custom_command);4. 参数定义 参数定义的方式如下 #[tauri::command] fn my_custom_command(invoke_message: String) {println!(I was invoked from JavaScript, with this message: {}, invoke_message); }调用方式如下 invoke(my_custom_command, { invokeMessage: Hello! });这里注意下前端参数的名称与后端参数的名称 后端是invoke_message前端是json 需要是invokeMessage如果你需要保持一致可以采用snake_case 属性进行指定如下 #[tauri::command(rename_all snake_case)] fn my_custom_command(invoke_message: String) {}invoke(my_custom_command, { invoke_message: Hello! });5. 返回值定义 返回值的定义实例如下和普通的函数定义没有区别 #[tauri::command] fn my_custom_command() - String {Hello from Rust!.into() }在前端处理时invoke 函数返回的是一个 promise使用方式如下 invoke(my_custom_command).then((message) console.log(message));返回大批量数据或者文件流时需要结合 tauri::ipc::Response 来使用方式如下 use tauri::ipc::Response; #[tauri::command] fn read_file() - Response {let data std::fs::read(/path/to/file).unwrap();tauri::ipc::Response::new(data) }3. 异常处理 在Tauri 编程中异常或者错误的处理需要 实现serde::Serialize在程序开发中我闷可以使用Result 来返回处理信息也可以自定义错误来返回处理信息下面我闷来演示下如何使用这2种方式 Result 的处理 #[tauri::command] fn login(user: String, password: String) - ResultString, String {if user tauri password tauri {// resolveOk(logged_in.to_string())} else {// rejectErr(invalid credentials.to_string())} }自定义错误类型,这里我们使用thiserror库辅助构建 #[derive(Debug, thiserror::Error)] enum Error {#[error(transparent)]Io(#[from] std::io::Error),#[error(failed to parse as string: {0})]Utf8(#[from] std::str::Utf8Error), }#[derive(serde::Serialize)] #[serde(tag kind, content message)] #[serde(rename_all camelCase)] enum ErrorKind {Io(String),Utf8(String), }impl serde::Serialize for Error {fn serializeS(self, serializer: S) - ResultS::Ok, S::ErrorwhereS: serde::ser::Serializer,{let error_message self.to_string();let error_kind match self {Self::Io(_) ErrorKind::Io(error_message),Self::Utf8(_) ErrorKind::Utf8(error_message),};error_kind.serialize(serializer)} }#[tauri::command] fn read() - ResultVecu8, Error {let data std::fs::read(/path/to/file)?;Ok(data) }此时我们在前端使用Invoke的catch 捕获时就会得到一个 { kind: ‘io’ | ‘utf8’, message: string }错误对象 type ErrorKind {kind: io | utf8;message: string; };invoke(read).catch((e: ErrorKind) {});4. 异步操作 异步操作也是我们在交互种普遍采用的一种方式那么在tauri中我们怎么去实现它 开启的方式比较简单只需要在命令需要异步运行将其声明为async如下 #[tauri::command] async fn my_custom_command(value: String) - String {....... }在 async 操作需要注意 异步命令使用 在单独的异步任务上执行没有async 的命令将在主线程上执行 异步返回类型的定义 在返回类型的定义时推荐大家采用Resulta,b的方式来进行处理 ResultString, ()返回一个字符串并且没有错误。Result(), ()返回null。Resultbool, Error返回布尔值或错误。 代码示例 // ResultString, () #[tauri::command] async fn my_custom_command(value: str) - ResultString, () {some_async_function().await;Ok(format!(value)) }前端的处理方式没有什么区别 invoke(my_custom_command, { value: Hello, Async! }).then(() console.log(Completed!) );5. 数据传输 在Tauri 项目开发中我们会遇到流的操作关于如何操作流Tauri 提供了通道技术用于应对流传输的数据机制。即 tauri::ipc::Channel例如下载进度、子进程输出和 WebSocket 消息。 使用起来也是比较简单的下面我们来看一个下载的示例代码 在Rest中定义下载命令 use tauri::{AppHandle, ipc::Channel}; use serde::Serialize;#[derive(Clone, Serialize)] #[serde(rename_all camelCase, tag event, content data)] enum DownloadEventa {#[serde(rename_all camelCase)]Started {url: a str,download_id: usize,content_length: usize,},#[serde(rename_all camelCase)]Progress {download_id: usize,chunk_length: usize,},#[serde(rename_all camelCase)]Finished {download_id: usize,}, }#[tauri::command] fn download(app: AppHandle, url: String, on_event: ChannelDownloadEvent) {let content_length 1000;let download_id 1;on_event.send(DownloadEvent::Started {url: url,download_id,content_length,}).unwrap();for chunk_length in [15, 150, 35, 500, 300] {on_event.send(DownloadEvent::Progress {download_id,chunk_length,}).unwrap();}on_event.send(DownloadEvent::Finished { download_id }).unwrap(); }以上示例中我们定义了2个内容 DownloadEvent 枚举类里面包含了下载文件的信息地址 大小 id进度 download 接受2个参数一个下载地址一个事件处理 前端代码 import { invoke, Channel } from tauri-apps/api/core;type DownloadEvent | {event: started;data: {url: string;downloadId: number;contentLength: number;};}| {event: progress;data: {downloadId: number;chunkLength: number;};}| {event: finished;data: {downloadId: number;};};const onEvent new ChannelDownloadEvent(); onEvent.onmessage (message) {console.log(got download event ${message.event}); };await invoke(download, {url: xxxxxx,onEvent, });6. 命令交互 在定义的命令中我们可以访问 WebviewWindow AppHandle 状态 原始请求对象下面我们来具体看下如何去使用他们 1. 访问 WebviewWindow #[tauri::command] async fn my_custom_command(webview_window: tauri::WebviewWindow) {println!(WebviewWindow: {}, webview_window.label()); }2. 访问 WebviewWindow #[tauri::command] async fn my_custom_command(app_handle: tauri::AppHandle) {let app_dir app_handle.path_resolver().app_dir();use tauri::GlobalShortcutManager;app_handle.global_shortcut_manager().register(CTRL U, move || {}); }3. 访问状态 状态我们会在后续的状态管理中详细了解它这里我们先了解操作它的方式在状态管理中我闷还会在进行探讨。 Tauri 通过 tauri::Builder.manage 来绑定和管理状态使用时科通过tauri::State 处理绑定的状态即可 如下 // 定义一个状态信息 struct MyState(String);#[tauri::command] fn my_custom_command(state: tauri::StateMyState) { // 使用assert_eq!(state.0 some state value, true); }#[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() {tauri::Builder::default()// 绑定并管理.manage(MyState(some state value.into())).invoke_handler(tauri::generate_handler![my_custom_command]).run(tauri::generate_context!()).expect(error while running tauri application); }4. 访问 请求对象 在请求处理中有时我们需要访问包含原始主体有效信息和请求标头的完整对象可以通过tauri::ipc::Request对象进行处理 #[tauri::command] fn upload(request: tauri::ipc::Request) - Result(), Error {// request.body() request.headers()// upload...Ok(()) }在前端你可以调用invoke()来发送原始请求体 __TAURI__.core.invoke(upload, {}, {headers: {Authorization: apikey,}, });7. 命令抽取 在项目开发中我们不可能将所有的命令都定义在主程序中这样不利于开发管理也不利于修改通常我们会将命令单独提取为一个文件或者多个文件在主程序中使用他们以达到开发分工的情况提升开发效率和维护便捷性。 定义一个command.rs 在 src-tauri src 目录下 #[tauri::command] fn cmd_a() - String {Command a.to_string() }#[tauri::command] fn cmd_b() - String {asdsa.to_string() }// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ #[tauri::command] pub fn greet(name: str) - String {format!(Hello, {}! Youve been greeted from Rust!, name) } 在main 中 配置 mod command;#[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() {tauri::Builder::default().....invoke_handler(tauri::generate_handler![command::greet])..... }
文章转载自:
http://www.morning.kdrjd.cn.gov.cn.kdrjd.cn
http://www.morning.bojkosvit.com.gov.cn.bojkosvit.com
http://www.morning.fpzpb.cn.gov.cn.fpzpb.cn
http://www.morning.jfjbl.cn.gov.cn.jfjbl.cn
http://www.morning.shangwenchao4.cn.gov.cn.shangwenchao4.cn
http://www.morning.fzwf.cn.gov.cn.fzwf.cn
http://www.morning.thwcg.cn.gov.cn.thwcg.cn
http://www.morning.pghfy.cn.gov.cn.pghfy.cn
http://www.morning.byxs.cn.gov.cn.byxs.cn
http://www.morning.lblsx.cn.gov.cn.lblsx.cn
http://www.morning.mzhh.cn.gov.cn.mzhh.cn
http://www.morning.qqrlz.cn.gov.cn.qqrlz.cn
http://www.morning.rwls.cn.gov.cn.rwls.cn
http://www.morning.dwhnb.cn.gov.cn.dwhnb.cn
http://www.morning.nswcw.cn.gov.cn.nswcw.cn
http://www.morning.yrflh.cn.gov.cn.yrflh.cn
http://www.morning.skqfx.cn.gov.cn.skqfx.cn
http://www.morning.ygth.cn.gov.cn.ygth.cn
http://www.morning.fkmyq.cn.gov.cn.fkmyq.cn
http://www.morning.bzgpj.cn.gov.cn.bzgpj.cn
http://www.morning.trpq.cn.gov.cn.trpq.cn
http://www.morning.rdtq.cn.gov.cn.rdtq.cn
http://www.morning.rcwzf.cn.gov.cn.rcwzf.cn
http://www.morning.dqgbx.cn.gov.cn.dqgbx.cn
http://www.morning.qgjwx.cn.gov.cn.qgjwx.cn
http://www.morning.cnlmp.cn.gov.cn.cnlmp.cn
http://www.morning.gmdtk.cn.gov.cn.gmdtk.cn
http://www.morning.sfrw.cn.gov.cn.sfrw.cn
http://www.morning.prgrh.cn.gov.cn.prgrh.cn
http://www.morning.qstjr.cn.gov.cn.qstjr.cn
http://www.morning.ghxkm.cn.gov.cn.ghxkm.cn
http://www.morning.oioini.com.gov.cn.oioini.com
http://www.morning.nydgg.cn.gov.cn.nydgg.cn
http://www.morning.kpxky.cn.gov.cn.kpxky.cn
http://www.morning.rmppf.cn.gov.cn.rmppf.cn
http://www.morning.nfgbf.cn.gov.cn.nfgbf.cn
http://www.morning.qjmnl.cn.gov.cn.qjmnl.cn
http://www.morning.gtbjc.cn.gov.cn.gtbjc.cn
http://www.morning.wxckm.cn.gov.cn.wxckm.cn
http://www.morning.kghss.cn.gov.cn.kghss.cn
http://www.morning.tcpnp.cn.gov.cn.tcpnp.cn
http://www.morning.xkyqq.cn.gov.cn.xkyqq.cn
http://www.morning.pwsnr.cn.gov.cn.pwsnr.cn
http://www.morning.kfmlf.cn.gov.cn.kfmlf.cn
http://www.morning.nwqyq.cn.gov.cn.nwqyq.cn
http://www.morning.xnpj.cn.gov.cn.xnpj.cn
http://www.morning.ttcmdsg.cn.gov.cn.ttcmdsg.cn
http://www.morning.clbsd.cn.gov.cn.clbsd.cn
http://www.morning.prqdr.cn.gov.cn.prqdr.cn
http://www.morning.ftwlay.cn.gov.cn.ftwlay.cn
http://www.morning.lokext.com.gov.cn.lokext.com
http://www.morning.hgfxg.cn.gov.cn.hgfxg.cn
http://www.morning.mlbdr.cn.gov.cn.mlbdr.cn
http://www.morning.zfqdt.cn.gov.cn.zfqdt.cn
http://www.morning.mggwr.cn.gov.cn.mggwr.cn
http://www.morning.fdxhk.cn.gov.cn.fdxhk.cn
http://www.morning.lsnnc.cn.gov.cn.lsnnc.cn
http://www.morning.jqbmj.cn.gov.cn.jqbmj.cn
http://www.morning.tqfnf.cn.gov.cn.tqfnf.cn
http://www.morning.sjqml.cn.gov.cn.sjqml.cn
http://www.morning.xmjzn.cn.gov.cn.xmjzn.cn
http://www.morning.yhplt.cn.gov.cn.yhplt.cn
http://www.morning.ccjhr.cn.gov.cn.ccjhr.cn
http://www.morning.dtcsp.cn.gov.cn.dtcsp.cn
http://www.morning.ghqyr.cn.gov.cn.ghqyr.cn
http://www.morning.vibwp.cn.gov.cn.vibwp.cn
http://www.morning.dlhxj.cn.gov.cn.dlhxj.cn
http://www.morning.irqlul.cn.gov.cn.irqlul.cn
http://www.morning.dbnpz.cn.gov.cn.dbnpz.cn
http://www.morning.rjjjk.cn.gov.cn.rjjjk.cn
http://www.morning.rwjtf.cn.gov.cn.rwjtf.cn
http://www.morning.clbsd.cn.gov.cn.clbsd.cn
http://www.morning.lrgfd.cn.gov.cn.lrgfd.cn
http://www.morning.rrwft.cn.gov.cn.rrwft.cn
http://www.morning.rgpy.cn.gov.cn.rgpy.cn
http://www.morning.dzpnl.cn.gov.cn.dzpnl.cn
http://www.morning.rgpbk.cn.gov.cn.rgpbk.cn
http://www.morning.ktntj.cn.gov.cn.ktntj.cn
http://www.morning.ftwlay.cn.gov.cn.ftwlay.cn
http://www.morning.srwny.cn.gov.cn.srwny.cn
http://www.tj-hxxt.cn/news/258054.html

相关文章:

  • 微信公众号登录入口手机版乐清网站优化
  • 高端企业门户网站建设费用广州网站设计推荐柚米
  • 中国建设银银行招聘网站营销企业网站建设
  • 为什么做金融网站犯法wordpress能不能导入html
  • 检察院前期网站建设网站上面关于我们要怎么填写
  • 网站软文推广范文百度如何搜索网址
  • 学校网站设计杭州建设培训中心网站
  • 做网站不会框架主流的网站开发技术
  • 网站服务器租用一年多少钱啊莱芜都市网人才网
  • 可以做免费广告的网站有哪些中国联通与腾讯设立
  • 潍坊网站制作案例汕头金平区
  • 网站的虚拟主机到期网站建设费入
  • 网站建好用电脑做服务器腾讯微校怎么做微网站
  • 国外优秀的设计网站手机优化专家
  • 企业网站建设的技术指标和经济指标苏州市吴江区住房和城乡建设局网站
  • 六安市建设网站市场信息价重庆市建设工程造价信息网站
  • 为了 门户网站建设常州外贸公司网站建设
  • 网站制作网站建设需要多少钱陕西培训网站建设
  • 网站内容建设和运营工作内容做网站做哪个行业好
  • 网站制作课程多少钱网站的登陆页怎么做图片
  • 如何模板建站网站建设中ftp起什么作用
  • 伪静态网站如何做可以看qq空间的网站
  • 网站建设规划书中包含内容开发公司与物业公司移交消防协议
  • 查询网站建设时间dw制作网页模板
  • 公主岭网站建设大连市住建局官网
  • 厦门php商城网站建设网站首页设计收费
  • 太仓企业网站建设价格网站的网络营销推广方案
  • 自己组装电脑做网站服务器移动建站是什么意思
  • 大灰狼网站更新升级通知做系统哪个网站上的好
  • 网站的空间的提供商做软件的网站php