【每日学点鸿蒙知识】Provider、Navigation返回参数、隐私声明问题、Text判 ...

打印 上一主题 下一主题

主题 1072|帖子 1072|积分 3216

1、HarmonyOS @Provider与@Consume的数据交互方式?

这个只能单向传递,也就是说只答应一个祖先组件来完成变量的更新,孙子组件只能读取不能更改。假如我的子孙组件想要改变该数据变量,叨教有什么好的办法没?逐层传递回祖先再改变太繁杂了。
@Provide装饰器和@Consume装饰器,可以实现与子女组件双向同步。不需要逐层传递回祖先。参考链接:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-provide-and-consume-V5
@Provide和@Consume,应用于与子女组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过定名参数机制传递,@Provide和@Consume摆脱参数传递机制的束缚,实现跨层级传递。
其中@Provide装饰的变量是在祖先组件中,可以理解为被“提供”给子女的状态变量。@Consume装饰的变量是在子女组件中,去“消费(绑定)”祖先组件提供的变量。
@Provide/@Consume装饰的状态变量有以下特性:


  • @Provide装饰的状态变量自动对其所有子女组件可用,即该变量被“provide”给他的子女组件。由此可见,@Provide的方便之处在于,开发者不需要多次在组件之间传递变量。
  • 子女通过使用@Consume去获取@Provide提供的变量,建立在@Provide和@Consume之间的双向数据同步,与@State/@Link不同的是,前者可以在多层级的父子组件之间传递。
  • @Provide和@Consume可以通过相同的变量名大概相同的变量别名绑定,发起范例相同,否则会发生范例隐式转换,从而导致应用举动异常。
  1. @Component
  2. struct CompD {
  3.   // @Consume装饰的变量通过相同的属性名绑定其祖先组件CompA内的@Provide装饰的变量
  4.   @Consume reviewVotes: number;
  5.   build() {
  6.     Column() {
  7.       Text(`reviewVotes(${this.reviewVotes})`)
  8.       Button(`reviewVotes(${this.reviewVotes}), give +1`)
  9.         .onClick(() => this.reviewVotes += 1)
  10.     }
  11.     .width('50%')
  12.   }
  13. }
  14. @Component
  15. struct CompC {
  16.   build() {
  17.     Row({ space: 5 }) {
  18.       CompD()
  19.       CompD()
  20.     }
  21.   }
  22. }
  23. @Component
  24. struct CompB {
  25.   build() {
  26.     CompC()
  27.   }
  28. }
  29. @Entry
  30. @Component
  31. struct CompA {
  32.   // @Provide装饰的变量reviewVotes由入口组件CompA提供其后代组件
  33.   @Provide reviewVotes: number = 0;
  34.   build() {
  35.     Column() {
  36.       Button(`reviewVotes(${this.reviewVotes}), give +1`)
  37.         .onClick(() => this.reviewVotes += 1)
  38.       CompB()
  39.     }
  40.   }
  41. }
复制代码
2、HarmonyOS 用Navigation打开页面,页面返回的时候,怎么拿到回传参数?

现在有个场景,网络请求的时候,发现session过期,拉起登陆页面,登陆后,怎么把数据通知回之前拉起网络的地方。网络模块没有界面。每次发网络请求的事变,都会判断session是否过期。session过期,就会拉起登录页面。登录成功后,需要重新发起session过期的网络请求。
Navigation的页面间,通过NavPathInfo对象中的params属性,实现从发起页到目标页的数据传递;通过onPop回调参数,实现处置惩罚目标页面的返回。Step1:构建NavPathInfo对象,输入需要传递给目标页面的参数。params参数:将需要传递的数据封装起来进行传递,无法传递对象内里的函数。具体的支持参数可以参考指南onPop参数:目标页面触发pop时的返回,在回调中通过PopInfo.info.param获取到返回的对象。
  1. // 发起页 mainPage
  2. let loginParam : LoginParam = new LoginParam()
  3. // 构建pathInfo对象
  4. let pathInfo : NavPathInfo = new NavPathInfo('loginPage', loginParam
  5.   , (popInfo: PopInfo) => {
  6.     let loginParam : LoginParam = popInfo.info.param as LoginParam;
  7.     ...
  8.   })
  9. // 讲参数传递到目标页
  10. this.pageStack.pushDestination(pathInfo, true);
  11. Step2:目标页通过“NavPathStack.getParamByIndex(0)”获取到发起页传递过来的参数
  12. @Component
  13. export struct loginPageView {
  14.   @Consume('pageInfo') pageStack : NavPathStack;
  15.   aboutToAppear(): void {
  16.     this.loginParam = this.pageStack.getParamByIndex(0) as LoginParam;
  17.   }
  18.   ...
  19. }
  20. Step3:目标页通过NavPathStack.pop方法返回起始页,其result参数用来传递需要返回给起始页的对象
  21. @Component
  22. export struct loginPageView {
  23.   @Consume('pageInfo') pageStack : NavPathStack;
  24.   // 页面构建的对象
  25.   private loginParam! : LoginParam;
  26.   ...
  27.   build() {
  28.     NavDestination(){
  29.       ...
  30.       Button('login').onClick( ent => {
  31.         // 将对象返回给起始页
  32.         this.pageStack.pop(this.loginParam, true)
  33.       })
  34.     }
  35.   }
  36. }
复制代码
3、HarmonyOS 隐私声明咨询?

在发布应用文档(以下链接)中第10点有分析【在“隐私声明”地区提供隐私声明链接。】。叨教不提供链接,直接附上声明内容可以吗?https://developer.huawei.com/consumer/cn/doc/app/agc-help-releaseharmony-0000001933963166
请参考:https://developer.huawei.com/consumer/cn/doc/app/50128#h1-1678351326517-0
文档中提到必须提交APP隐私政策链接且与APP内的隐私政策包管完全同等。
开发者在创建应用或更新版本时,必须提交APP隐私政策链接,该链接的内容必须与APP内的隐私政策包管完全同等,并且当您更新了APP内的隐私政策内容时,请您实时更新隐私政策链接的文本内容。
4、HarmonyOS text 怎样做到,一行表现的时候居中,超过一行的时候靠左表现?

通过判断行数去设置不同的对其方式
获取行数可以通过以下方法 @ohos.measure可以返回多行笔墨的宽高,没有返回行数,但可以根据业务场景来盘算。https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-measure-V5
超过特定行数(下方以3举动例),样式不同,好比加上展开、收缩。盘算文本总高度 let textSize : SizeOptions = measure.measureTextSize({ textContent: this.content, fontSize: 24, constraintWidth: 300 }) 限定宽度和最大行数(3行),盘算高度 let textSize2 : SizeOptions = measure.measureTextSize({ textContent: this.content, fontSize: 24, maxLines: 3, constraintWidth: 300 })若textSize.height > textSize2.height,则表示实际高度超过3行,根据判断效果进行业务处置惩罚。
5、自定义hvigor插件问题?

我发现bate1 版本,nodejs不在对外暴露,hvigor的代码隐藏在了应用包中,且固定了版本。但是我们在制作自定义hvigor插件的时候,是引用公共npm库的hvigor代码,这样极大可能出现我自定义插件的hvigor版本与应用包内的不同等,不会出现问题吗
关于hvigor插件的开发, 可以参考以下文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-hvigor-plugin-V5
可以尝试参照项目中实际使用hvigor版本,大概文档中的版本。
hvigor答应开发者实现自己的插件,开发者可以定义自己的构建逻辑,并与他人共享。
hvigor重要提供了两种方式来实现插件:基于hvigorfile脚本开发插件、基于typescript项目开发。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表