HarmonyOS开发日记

本文介绍了如何在学习鸿蒙开发过程中,通过CSS/HTML实现自适应布局,包括List中的滚动条处理、Scroll组件的应用以及justify-content属性的灵活运用。同时提到了`ForEach`遍历数组的问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直苦于csshtml的基础完善,最后发现在学鸿蒙过程中很多细节可以反应到基础三件套上,不多说了,看细节

自适应延伸

自适应延伸是指在不同尺寸设备下,当页面的内容超出屏幕大小而无法完全显示时,可以通过滚动条进行拖动展示。这种方法适用于线性布局中内容无法一屏展示的场景。通常有以下两种实现方式。

  • 在List中添加滚动条:当List子项过多一屏放不下时,可以将每一项子元素放置在不同的组件中,通过滚动条进行拖动展示。可以通过scrollBar属性设置滚动条的常驻状态,edgeEffect属性设置拖动到内容最末端的回弹效果。
  • 使用Scroll组件:在线性布局中,开发者可以进行垂直方向或者水平方向的布局。当一屏无法完全显示时,可以在Column或Row组件的外层包裹一个可滚动的容器组件Scroll来实现可滑动的线性布局。

    @Entry
    @Component
    struct ScrollExample {
      scroller: Scroller = new Scroller();
      private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    
      build() {
        Scroll(this.scroller) {
          Column() {
            ForEach(this.arr, (item) => {
              Text(item.toString())
                .width('90%')
                .height(150)
                .backgroundColor(0xFFFFFF)
                .borderRadius(15)
                .fontSize(16)
                .textAlign(TextAlign.Center)
                .margin({ top: 10 })
            }, item => item)
          }.width('100%')
        }
        .backgroundColor(0xDCDCDC)
        .scrollable(ScrollDirection.Vertical) // 滚动方向为垂直方向
        .scrollBar(BarState.On) // 滚动条常驻显示
        .scrollBarColor(Color.Gray) // 滚动条颜色
        .scrollBarWidth(10) // 滚动条宽度
        .edgeEffect(EdgeEffect.Spring) // 滚动到边沿后回弹 这个回弹效果有意思
      }
    }

 

页面布局

       

句法:

justify-content: flex-start|flex-end|center|space-between|
space-around|space-evenly|initial|inherit;

space-around和space-evenly区别

justifyContent(FlexAlign.SpaceAround):水平方向方向均匀分配元素,相邻元素之间距离相同。第一个元素到行首的距离和最后一个元素到行尾的距离是相邻元素之间距离的一半。

justifyContent(FlexAlign.SpaceEvenly):水平方向方向均匀分配元素,相邻元素之间的距离、第一个元素与行首的间距、最后一个元素到行尾的间距都完全一样。

ForEach只遍历一次的问题

这里定义一个todo数组

这里是我的foreach语句

新增数据

无论新增几个数据 都只能显示一个数据,state明明可以检测到数组push更新

但是加了index后,就可以添加数据了

随手记录下 这个坑~

(各位一定要记住ForEach)和其他语言foreach区别 这里的foreach第三个参数是一个keyGenerator,而JS中是内置的改变this值的参数

状态管理

对于@Prop      

1.@Prop支持本地初始化,这样可以让@Prop是否与父组件建立同步关系变得可选。当且仅当@Prop有本地初始化时,从父组件向子组件传递@Prop的数据源才是可选的。(必须保证有值)

2.@Prop会在本地创建一个变量,保证你修改不会影响到父组件

对于@Link

1.父组件传入的状态变量必须有$

GreenButton({ greenButtonState: $greenButtonState }).margin(12)

2.@Link装饰的变量和其所属的自定义组件共享生命周期。

3.为了了解@Link变量初始化和更新机制,有必要先了解父组件和拥有@Link变量的子组件的关系,初始渲染和双向更新的流程(以父组件为@State为例)。

  1. 初始渲染:执行父组件的build()函数后将创建子组件的新实例。初始化过程如下:
    1. 必须指定父组件中的@State变量,用于初始化子组件的@Link变量。子组件的@Link变量值与其父组件的数据源变量保持同步(双向数据同步)。
    2. 父组件的@State状态变量包装类通过构造函数传给子组件,子组件的@Link包装类拿到父组件的@State的状态变量后,将当前@Link包装类this指针注册给父组件的@State变量。
  2. @Link的数据源的更新:即父组件中状态变量更新,引起相关子组件的@Link的更新。处理步骤:
    1. 通过初始渲染的步骤可知,子组件@Link包装类把当前this指针注册给父组件。父组件@State变量变更后,会遍历更新所有依赖它的系统组件(elementid)和状态变量(比如@Link包装类)。
    2. 通知@Link包装类更新后,子组件中所有依赖@Link状态变量的系统组件(elementId)都会被通知更新。以此实现父组件对子组件的状态数据同步。
  3. @Link的更新:当子组件中@Link更新后,处理步骤如下(以父组件为@State为例):
    1. @Link更新后,调用父组件的@State包装类的set方法,将更新后的数值同步回父组件。
    2. 子组件@Link和父组件@State分别遍历依赖的系统组件,进行对应的UI的更新。以此实现子组件@Link同步回父组件@State。
### 关于鸿蒙开发中使用ArkTS进行日记本应用开发鸿蒙操作系统(HarmonyOS)下利用ArkTS(Ark TypeScript)构建日记本应用程序能够有效融合多种现代前端技术和框架特性,提供流畅且高效的用户体验。下面给出一段基于ArkTS实现简单日记条目显示功能的代码片段: ```typescript // 定义单个日志项的数据结构 interface LogItem { id: number; content: string; date: Date; } // 创建视图模型类来管理数据逻辑 class DiaryViewModel extends ViewModel { private logs: Ref<LogItem[]> = ref([]); constructor() { super(); this.loadLogs(); // 初始化加载本地存储的日志列表 } get Logs(): LogItem[] { return this.logs.value; } addLog(content: string): void { const newLog: LogItem = {id: Math.random(), content, date: new Date()}; this.logs.value.push(newLog); // 将新日志保存到分布式键值数据库或其他持久化机制中... } loadLogs(){ // 从分布式键值数据库读取已有日志并更新logs属性... } } ``` 为了使上述`DiaryViewModel`中的方法可以被页面调用,在对应的`.ets`文件里声明该实例,并通过绑定的方式让其与界面元素关联起来。 ```xml <!-- diary_page.ets --> <?page> <template> <!-- 使用for循环渲染多个日志项 --> <list items="{{viewModel.Logs}}" itemRenderer="renderLog"/> </template> <script src="./diary_view_model.ts"></script> <!-- 引入上面定义好的view model --> <style scoped></style> </page> ``` 这里展示了如何创建一个简单的MVVM架构下的日记本应用雏形[^1]。对于更复杂的功能需求如编辑删除特定日期的日志、按时间顺序排列等,则需进一步扩展此基础版本。 #### 实现流式输入体验 针对提到的流式传输问题,即希望文字能逐字显现而非一次性全部呈现的情况,可以通过设置定时器配合字符串切片操作达成模拟打字的效果。不过需要注意的是这种做法可能会增加一定的性能开销,在实际项目中应权衡利弊后再决定是否采用。 ```typescript function typeWriterEffect(text:string,callback:(chunk:string)=>void,interval:number=100){ let index = 0; function tick(){ if(index<=text.length){ callback(text.slice(0,index++)); setTimeout(tick,interval); } } tick(); } ``` 以上函数接受待处理文本以及每次输出部分字符后的回调作为参数,还可以指定相邻两次打印之间的间隔时长,默认为100毫秒。将其应用于具体场景时只需调整好相应的接口即可[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值