从微信小程序到鸿蒙JS开发-menu&toast&dialog

人工智能2025-11-05 16:03:539

 

想了解更多内容,从微程序请访问:

和华为官方合作共建的到鸿鸿蒙技术社区

https://harmonyos.51cto.com/#zz

1、menu弹出菜单

这是从微程序微信小程序没有的一个组件,提供了一个可唤起的到鸿轻量级弹出菜单。menu的从微程序子组件为option。

<menu id="userMenu" onselected="menuSelect">     <option value="login">登录</option>     <option value="register">注册</option> </menu> 

在hml中写好菜单,到鸿但这时启动app是从微程序不会显示出来的,且不会占用任何页面空间。到鸿

menu需要在方法中被唤起,从微程序因此需要设置id属性。到鸿这里通过点击“点击登录/注册“文本框唤起菜单:

     点击登录/注册  

showUserMenu() {     this.$element("userMenu").show(); } 

使用无参的从微程序show()方法,菜单在页面的到鸿左上角被唤起弹出。

show方法还有一个重载方法,从微程序可以设置菜单弹出的到鸿x轴和y轴偏移量。x和y需要给数值类型,从微程序单位为px。

showUserMenu() {     this.$element("userMenu").show({         x: 100,         y: 100     }); } 

菜单项的选中事件通过onselect属性绑定,event.value即为选中的option的value属性。

menuSelect(event) {     let value = event.value;     prompt.showToast({         message: "点击菜单项的值为" + value,         duration: 3000     }) } 

option一定要设置value属性,否则编译不通过。b2b信息网value重复倒是不会报错,但这样无法判断选中了哪一个菜单项,不建议。

2、Toast提示框

鸿蒙js开发模式至今无法通过console.log()等方法打印日志(mac系统如此),但在写程序时不免要进行调试,提示框就是一种很好的方法。

在js文件中引入prompt模块:

import prompt from @system.prompt; 

调用prompt.showToast()弹出提示框:

prompt.showToast({     message: "提示信息",     duration: 3000 }); 

 这个方法只能传递message和duration两个参数,弹出位置是在页面接近最下方中间位置,而且字有点小。

源码注释中说明,duration取值是1500到10000,如果不在范围中会自动更改为边界值。

再看看微信小程序的Toast,使用wx.showToast弹出。

wx.showToast({     title: 提示信息,     duration: 3000 }) 

弹出位置在页面正中,且可以切换预置,或自定义图标。

wx.showToast({     title: 常回家看看,     duration: 3000,     icon: none,     image: "/icon/index1.png" }) 

就是这个图标位置怪怪的,但个人感觉这种提示弹窗更加明显,可扩展性也更强。

3、prompt模块的对话框dialog

需要用户确认操作的功能十分常用,网站模板比如是否删除,是否下单等。在微信小程序中采用的是wx.showModal(),弹窗内容、按钮内容和颜色都可以自定义,事件在success函数中进行捕获:

wx.showModal({   title: "提示",   content: "确认删除吗?",   confirmColor: "#e20a0b",   confirmText: "对,删了它",   cancelColor: "#777777",   cancelText: "再考虑一下",   success: res => {     if(res.confirm) {       console.log("删除成功!");     } else if(res.cancel) {       console.log("取消删除操作。")     }   } }) 

在鸿蒙中,prompt模块的showDialog()方法提供了弹出对话框:

prompt.showDialog({      title: "操作提示",      message: "确认删除吗?",      buttons: [          {              text: "我要删除",              color: "#e20a0b"          },          {              text: "取消操作",              color: "#777777"          }      ],      success: res => {          prompt.showToast({              message: "点击了第" + res.index + "个按钮"          })      }  }) 

对话框也是在底部弹出的,且按钮可以自行定义。点击按钮后,success方法会获取按钮的索引值,根据索引进行业务逻辑的编写。

想要设置三个按钮也是可以的,这个功能微信小程序的showModal()是没有的。

prompt.showDialog({         title: "操作提示",         message: "确认删除吗?",         buttons: [             {                 text: "我要删除",                 color: "#e20a0b"             },             {                 text: "取消操作",                 color: "#777777"             },             {                 text: "附加按钮",                 color: "#333333"             }         ],         success: res => {             prompt.showToast({                 message: "点击了第" + res.index + "个按钮"             })         }     }) 

4、dialog对话框组件

prompt.showDialog()只能弹出具有提示文字和按钮的对话框,亿华云如果需要更丰富的模态对话框功能,鸿蒙还提供了dialog组件,这个组件在微信小程序中也是没有的。和menu一样,写在hml中的dialog并不会显示,也不会占用页面空间,需要通过id在方法中被唤起。

<dialog id="loginDialog">     <div class="loginDialog">         <div class="formItem">             <image src="{{ phone ? (imgUrl + phone.png) : (imgUrl + phone1.png) }}"></image>             <input id="phoneInput" type="number" placeholder="请输入手机号" onchange="inputPhone"></input>         </div>         <div class="formItem">             <image src="{{ pwd ? (imgUrl + password.png) : (imgUrl + password1.png) }}"></image>             <input id="pwdInput" type="password" placeholder="请输入密码" onchange="inputPwd"></input>         </div>         <button class="inputBtn" onclick="login">登录</button>     </div> </dialog> 

这里需注意,官方文档中说的“支持单个子组件”的意思是,dialog中只能有一个直接子组件,即需要用一个div将内容套起来。

 

同样地,根据id找到元素,使用show()方法唤起对话框。对话框的show()方法无重载,会在页面底部弹出。dialog的大小取决于子组件div的大小,div给样式即可。

menuSelect(event) {      let value = event.value;      if ("login" == value) {          this.phone = "";          this.pwd = "";          this.$element("loginDialog").show();      } else if ("register" == value) {          this.phone = "";          this.pwd = "";          this.$element("registerDialog").show();      }  }, 

可用close()方法关闭它。

this.$element("registerDialog").close(); 

附上本页面的代码,后台功能自己搭建了Spring Boot服务器进行交互。下篇将讲解表单组件:

<!-- 我的 -->   <div class="myPage">       <div class="userInfo">           <image src="{{ userInfo && userInfo.avatar != 0 ? userInfo.avatar : (imgUrl + user.png)}}"></image>           <div class="info_desc">               <text if="{{ !userInfo }}" onclick="showUserMenu" class="info_hint">                   点击登录/注册               </text>               <text if="{{ userInfo }}" class="info_name">                   {{ userInfo.nickname ? userInfo.nickname : userInfo.username }}               </text>               <text if="{{ userInfo }}" class="info_detail">                   {{ userInfo.age }}  {{ userInfo.gender == 1 ? 男 : (userInfo.gender == 2 ? 女 : 性别保密) }}               </text>           </div>       </div>       <menu id="userMenu" onselected="menuSelect">           <option value="login">登录</option>           <option value="register">注册</option>       </menu>       <dialog id="loginDialog">           <div class="loginDialog">               <div class="formItem">                   <image src="{{ phone ? (imgUrl + phone.png) : (imgUrl + phone1.png) }}"></image>                   <input id="phoneInput" type="number" placeholder="请输入手机号" onchange="inputPhone"></input>               </div>               <div class="formItem">                   <image src="{{ pwd ? (imgUrl + password.png) : (imgUrl + password1.png) }}"></image>                   <input id="pwdInput" type="password" placeholder="请输入密码" onchange="inputPwd"></input>               </div>               <button class="inputBtn" onclick="login">登录</button>           </div>       </dialog>   </div>   <!-- 我的end --> 

css:

/*我的*/ .userInfo {     width: 92%;     height: 240px;     margin: 20px 0 20px 0;     border-radius: 30px;     box-shadow: 5px 5px 15px #bbbbbb;     background-color: #eeeeee;     display: flex;     align-items: center; } .userInfo>image {     margin: 0 40px 0 40px;     width: 160px;     height: 160px;     border-radius: 90px;     object-fit: contain; } .info_desc {     height: 200px;     margin-right: 20px;     flex: 1;     display: flex;     flex-direction: column;     justify-content: center; } .info_hint {     font-size: 48px;     font-weight: bold;     color: #333333; } .info_name {     font-size: 40px;     font-weight: 600;     height: 100px;     color: #333333; } .info_detail {     font-size: 34px;     color: #666666; } .loginDialog {     width: 80%;     height: 400px;     display: flex;     flex-direction: column;     align-items: center;     justify-content: center; } .formItem {     width: 100%;     height: 100px;     display: flex;     align-items: center;     justify-content: space-between;     margin-bottom: 20px; } .formItem>image {     width: 70px;     height: 70px;     margin: 0 10px 0 10px; } input {     flex: 1; } .inputBtn {     width: 200px;     height: 70px; } 

js:(省略data部分)

// 弹出菜单  showUserMenu() {      this.$element("userMenu").show();  },  // 菜单选中  menuSelect(event) {      let value = event.value;      if ("login" == value) {          this.phone = "";          this.pwd = "";          this.$element("loginDialog").show();      } else if ("register" == value) {          this.phone = "";          this.pwd = "";          // this.$element("registerDialog").show();      }  },  // 手机号输入框  inputPhone(e) {      this.phone = e.value;  },  // 密码输入框  inputPwd(e) {      this.pwd = e.value;  },  // 登录  login() {      fetch.fetch({          url: this.url + "/litemall/user/login?phone=" + this.phone + "&pwd=" + this.pwd,          responseType: "json",          success: res => {              let data = JSON.parse(res.data);              if (0 != data.code) {                  prompt.showToast({                      message: data.msg,                      duration: 3000                  })              } else {                  this.userInfo = data.data;                  this.$element("loginDialog").close();              }          }      })  } 

登录成功效果:

想了解更多内容,请访问:

和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/#zz

本文地址:http://www.bzve.cn/news/638a64698715.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

热门文章

全站热门

二手苹果5s的优劣势分析(购买二手苹果5s前你需要知道的关键信息)

掌握如何通过键盘开机设置BIOS教程(详解键盘开机设置BIOS的步骤及技巧)

七彩虹装系统教程完整版(让你的电脑焕发七彩光芒,尽享个性化操作!)

详解如何重新安装Windows7系统(快速而安全地恢复您的计算机)

当你想重装Ubuntu或者仅仅是想安装它的一个新版本的时候,假如有个便捷的方法来重新安装之前的应用并且重置其设置会很方便的。此时 Aptik 粉墨登场,它可以帮助你轻松实现。Aptik(自动包备份和恢复)是一个可以用在Ubuntu,Linux Mint 和其他基于Debian以及Ubuntu的Linux发行版上的应用,它允许你将已经安装过的包括软件库、下载包、安装的应用和主题、用户设置在内的PPAs(个人软件包存档)备份到外部的U盘、网络存储或者类似于Dropbox的云服务上。注意:当我们在此文章中说到输入某些东西的时候,假如被输入的内容被引号包裹,请不要将引号一起输入进去,除非我们有特殊说明。想要安装Aptik,需要先添加其PPA。使用Ctrl + Alt + T快捷键打开一个新的终端窗口。输入以下文字,并按回车执行。复制代码代码如下:sudo apt-get update更新完毕后,你就完成了安装Aptik的准备工作。接下来输入以下命令并按回车:复制代码代码如下:sudo apt-get install aptik注意:你可能会看到一些有关于获取不到包更新的错误提示。不过别担心,假如这些提示看起来跟下边图片中类似的话,你的Aptik的安装就没有任何问题。安装过程会被显示出来。其中一个被显示出来的消息会提到此次安装会使用掉多少磁盘空间,然后提示你是否要继续,按下“y”再按回车,继续安装。当安装完成后,输入“Exit”并按回车或者按下左上角的“X”按钮,关闭终端窗口。在正式运行Aptik前,你需要设置好备份目录到一个U盘、网络驱动器或者类似于Dropbox和Google Drive的云帐号上。这儿的例子中,我们使用的是Dropbox。一旦设置好备份目录,点击启动栏上方的“Search”按钮。在搜索框中键入 “aptik”。结果会随着你的输入显示出来。当Aptik图标显示出来的时候,点击它打开应用。此时一个对话框会显示出来要求你输入密码。输入你的密码并按“OK”按钮。Aptik的主窗口显示出来了。从“Backup Directory”下拉列表中选择“Other…”。这个操作允许你选择你已经建立好的备份目录。注意:在下拉列表的右侧的 “Open” 按钮会在一个文件管理窗口中打开选择目录功能。在 “Backup Directory” 对话窗口中,定位到你的备份目录,然后按“Open”。注意:假如此时你尚未建立备份目录或者想在备份目录中新建个子目录,你可以点“Create Folder”来新建目录。点击“Software Sources (PPAs).”右侧的 “Backup”来备份已安装的PPAs。然后“Backup Software Sources”对话窗口显示出来。已安装的包和对应的源(PPA)同时也显示出来了。选择你需要备份的源(PPAs),或者点“Select All”按钮选择所有源。点击 “Backup” 开始备份。备份完成后,一个提示你备份完成的对话窗口会蹦出来。点击 “OK” 关掉。一个名为“ppa.list”的文件出现在了备份目录中。

以苹果重做Win7系统教程(将你的旧Win7系统变得如苹果般流畅)

《轻松学会使用PE装机助理》(让你的电脑装机变得简单快捷)

雷神电脑U盘系统安装教程(轻松学会使用雷神电脑U盘系统安装,助力高效操作!)

友情链接

滇ICP备2023006006号-39