【HarmonyOS NEXT】实战——登录页面
【HarmonyOS NEXT】实战——登录页面
在本文中,我们将深入探讨如何使用 HarmonyOS NEXT 来实现一个功能完备的登录页面。通过这个实战案例,你将结合页面布局、数据本地化存储、网络请求等多方面了解到 HarmonyOS NEXT 在构建现代应用时的强大能力和灵活性。
@TOC
1. 整体结构
定义了一个 LoginPage 组件,该组件使用了 @Entry 和 @Component 装饰器来标记它是一个入口组件和可复用的 UI 组件。LoginPage 组件包含了一些状态变量(@State)和方法(build、handleLogin、handleForgotPassword)。
2. 状态变量
account: 用户名输入框的值,默认为空字符串。password: 密码输入框的值,默认为空字符串。text: 顶部的欢迎文字,默认为空字符串。loading: 是否正在加载,默认为false。rememberPassword: 是否记住密码,默认为false。stopLogin: 是否停止自动登录,默认为false。
3. 方法
aboutToAppear: 组件即将显示时的生命周期方法,用于初始化状态变量。build: 组件的构建方法,定义了页面的布局和组件。handleLogin: 处理登录逻辑的方法。handleForgotPassword: 处理忘记密码逻辑的方法。
4. 代码解析
4.1 aboutToAppear 方法
router.getParams(): 获取路由传递的参数,类型为JumpParams。这里主要是为了通过路由获取参数,来判断是否进行自动登录操作。默认用户正常进入登陆页的时候需要自动登录,但是如果是点击了退出登录来到了登陆页则不进行自动登录。或许还有更多的特殊情况,这一点可以通过路由传参实现。PreferencesUtils.get: 从本地存储中获取数据,这里主要是获取用户是否记住密码的状态,还有记录下的账户与密码。条件判断:
如果用户选择了记住密码,从本地存储中读取用户名和密码。
如果用户名和密码都已存在且 路由参数
stopLogin为false,自动调用handleLogin方法进行登录。
4.2 build 方法
Stack: 容器组件,用于堆叠其他组件。Column: 垂直布局组件。Text: 文本组件,用于显示文本内容。RelativeContainer: 相对布局容器,用于精确控制子组件的位置。TextInput: 输入框组件,用于输入用户名和密码。onChange: 当输入框内容发生变化时的回调函数。type(InputType.Password): 设置输入框为密码输入类型。Divider: 分割线组件,用于在输入框下方添加下划线。Row: 水平布局组件。Image: 图像组件,用于显示记住密码的图标。onClick: 点击图标时切换记住密码的状态,并保存到本地存储。Button: 按钮组件,用于触发登录操作。LoadingProgress: 加载进度组件,当loading为true时显示。
4.2.1 总体结构
这段代码定义了一个 build 方法,用于构建一个登录界面。界面包含以下几个主要部分:
顶部的欢迎文字
用户名和密码输入框
记住密码和忘记密码选项
登录按钮
底部图片
加载进度条(可选)
代码定义了一个登录界面,包含欢迎文字、用户名和密码输入框、记住密码和忘记密码选项、登录按钮和底部图片。通过使用 Stack、Column 和 Row 布局组件,以及 Text、TextInput、Image 和 Button 等 UI 组件,构建了一个功能完整的登录页面。加载进度条部分是可选的,用于在登录过程中显示加载状态。
4.2.2 根部局
Stack是 HarmonyOS 中的一种布局组件,它可以将子组件叠放在一起。Stack作为根布局,包含整个页面的所有内容。
4.2.3 顶部的欢迎文字
Column是一个垂直布局组件,用于将子组件垂直排列。Text(this.text)显示一个变量this.text,可能是动态的欢迎文字。内部的
Column包含一个RelativeContainer,用于更灵活地对齐子组件。RelativeContainer是一个相对布局组件,可以使用alignRules来指定子组件的对齐方式。Text('您好!')设置了字体大小、加粗、字体颜色和对齐方式。Text('欢迎使用xx系统!')设置了字体大小、字体颜色和对齐方式,并且设置了上边距。RelativeContainer设置了高度、宽度、内边距和背景颜色。
4.2.4 用户名和密码输入框
外部的
Column包含用户名和密码输入框。内部的
Column用于单独包装用户名输入框和密码输入框,以便更好地控制样式。TextInput是一个输入框组件,用于用户输入文本。placeholder是输入框的占位符文本。text是输入框当前显示的文本,绑定到this.account和this.password。onChange是输入框的值改变时的回调函数,用于更新this.account和this.password。fontSize、fontColor、width、height和padding设置了输入框的样式。type(InputType.Password)将输入框类型设置为密码输入框。Divider是一个分隔线组件,用于在输入框下方添加一条线,模拟下划线效果。
4.2.5 记住密码与忘记密码行
Row是一个水平布局组件,用于将子组件水平排列。内部的
Row包含记住密码的图标和文本。Image是一个图像组件,根据this.rememberPassword的值显示不同的图标。onClick是点击事件的回调函数,用于切换记住密码的状态并保存到偏好设置中。Text('记住密码')显示记住密码的文本,设置了字体大小、颜色和左边距,并绑定了点击事件。外部的
Row包含忘记密码的文本,设置了字体大小、颜色,并绑定了点击事件。justifyContent(FlexAlign.SpaceBetween)使子组件在水平方向上均匀分布。margin和padding设置了外边距和内边距。width设置了组件的宽度。
4.2.6 登录按钮
Button是一个按钮组件,用于触发登录操作。width和height设置了按钮的宽度和高度。backgroundColor和fontColor设置了按钮的背景颜色和字体颜色。onClick是按钮的点击事件回调函数,用于处理登录逻辑。margin设置了按钮的上边距。
4.2.7 底部图片
Image是一个图像组件,用于显示底部图片。width设置了图片的宽度。$r是资源引用函数,用于引用应用中的资源。
4.2.8 加载进度条(可选)
LoadingProgress是一个加载进度条组件,用于显示加载状态。height和color设置了进度条的高度和颜色。if (this.loading)控制加载进度条的显示,只有当this.loading为true时才会显示加载进度条。
4.3 handleLogin 方法
保存用户名和密码:
如果用户选择了记住密码,使用
PreferencesUtils.put方法将用户名和密码保存到本地存储。执行登录逻辑:
设置
loading为true,显示加载进度。调用
LoginAPI 进行登录,传入用户名、密码、UUID 和验证码。成功回调:
如果
res.code不为0,显示错误提示。如果
res.code为0,保存用户数据和 token 到本地存储。调用
GetPermissionAPI 获取权限,并保存到本地存储。调用
GetMenuAPI 获取菜单权限,并保存到本地存储。使用
router.replaceUrl方法跳转到主页,并处理跳转成功和失败的情况。失败回调:
显示错误提示,并设置
loading为false。
4.4 handleForgotPassword 方法
跳转到忘记密码页面:
使用
router.pushUrl方法跳转到忘记密码页面。
5. 关键函数
PreferencesUtils.get和PreferencesUtils.put: 用于从本地存储中读取和保存数据。router.getParams: 用于获取路由传递的参数。router.replaceUrl和router.pushUrl: 用于在页面之间进行跳转。promptAction.showToast: 用于显示短暂的提示信息。
7. 页面效果
进入页面:
登录接口请求中:
6. 总结
这段代码实现了一个完整的登录页面,包括用户名和密码的输入、记住密码功能、忘记密码功能以及登录逻辑。它使用了 HarmonyOS NEXT 的组件和 API,通过状态变量管理页面的状态,通过异步方法处理登录、权限获取和页面跳转等操作。
版权声明: 本文为 InfoQ 作者【帅比九日】的原创文章。
原文链接:【http://xie.infoq.cn/article/a70344f126d11447852f6a619】。文章转载请联系作者。









评论