《OpenHarmony开源鸿蒙学习入门》-- 状态管理
最新单位开始断网办公,难受至极。很久没有更新博客了。平常碰到问题,总结梳理个文档,就可以顺手发个博客。现在要回家重写才行。
OpenHarmony最新发展势头很猛,得益于声明式UI编程的便利,看到最新的商业鸿蒙HarmonyOS3.0也开始上eTS开发了,对于开发应用来说,真的十分便利。
不同于命令式编程,拿到UI对象,再去更改UI的数据,让UI去刷新。声明式UI编程,让程序开发解放了手动控制UI刷新的过程。
基本概念很简单,我们只需要更改UI绑定的数值变量,当程序监听发现数值变化了,UI就会自动刷新。当然不可能任何一个数值变化都会刷新,这里有两个注意点,首先是要UI组件绑定使用的数值变量,并且要有@State修饰的变量。
@State怎么用?如何刷新UI?
变量定义的写法为:
@State count: number = 0
变量在UI布局中绑定的写法为:
// xxx.ets
@Entry
@Component
struct MyComponent {
@State count: number = 0
private toggleClick() {
this.count += 1
}
build() {
Column() {
Button() {
Text(`click times: ${this.count}`)
.fontSize(10)
}
.onClick(this.toggleClick.bind(this))
}
}
}
build() 函数是UI布局的核心,组件全都码在这里。
上面的demo例子可以看出,我新建了一个MyComponent 类。
@Entry 代表是一个界面
@Component 代表是一个组件
同时有两个注解修饰,代表是界面也可以是组件。通过调用方法不同,可以成为对应的形态。
任何组件都可以调用onlick触发点击回调。
当text文本组件的父组件,button按钮被点击时,count会+1.
上面我们说过了,使用@State修饰,那这个变量的数值状态发生变化,就会重写刷新UI。
所以我们看到的效果,就是点击button按钮,按钮的文本会从0变成1.
有几个注意点:
1.必须为所有@State变量分配初始值,要不然UI状态就错乱了。
2.@State修饰的组件,多个组件时,内部状态和数据是相互独立。
3. 调用自定义的组件,内部变量通过@State可以在调用初始化的时候,修改初始值。例如:
MyComponent({count: 99})
@Prop @Link 这对注解修饰的作用很简单
当我们使用嵌套View的时候,例如:
// MyComponent.ets
import targetComponent from './targetComponent.ets'
@Entry
@Component
class MyComponent {
@State mFatherCount: number = 0
private toggleClick() {
this.mFatherCount+= 1
}
build() {
Column() {
Button() {
Text(`click times: ${this.mFatherCount}`)
.fontSize(10)
}
.onClick(this.toggleClick.bind(this))
targetComponent({ mPropCount: this.mFatherCount})
// targetComponent({mLinkCount: $mFatherCount})
}
}
}
// targetComponent .ets
@Component
export default class targetComponent {
@Prop mPropCount: number;
// @Link mLinkCount: number;
private toggleClick() {
this.mPropCount+= 1
// this.mLinkCount+= 1
}
build() {
Column() {
Button() {
Text(`click times: ${this.mPropCount}`)
// Text(`click times: ${this.mLinkCount}`)
.fontSize(10)
}
.onClick(this.toggleClick.bind(this))
}
}
}
我们创建一个targetComponent 子View组件,在父View组件用调用。
这时候将父View的mFatherCount传递给子View,就用两种方式,单行绑定 @Prop,双向绑定@Link。
当父View的mFatherCount数值发生变化,@Prop修饰的变量,只能被动接收变化。而@Link修饰的变量,在子View内发生变化可以将变化传递给父View。
用UI呈现的效果来说,前者界面刷新是通过mFatherCount变化触发,让mPropCount也变化。后者界面刷新是通过mLinkCount触发。
有几个注意点:
1.使用@Link时,赋值是通过$修饰传递数值的。
2.使用@Link,@Prop修饰的变量,从外面赋值的时候,必须是@State修饰。@LInk从外面赋值也是可以同类型的@Link。
3.使用@Prop仅支持number、string、boolean简单类型。
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总