HarmonyOS鸿蒙Next中Bindsheet每次显示,内容都会重新创建,怎么可以保留bindsheet原来的数据和状态呢

HarmonyOS鸿蒙Next中Bindsheet每次显示,内容都会重新创建,怎么可以保留bindsheet原来的数据和状态呢 我的bindsheet里面有一个自定义组件,包含Tab和TabContent,TabConent中是list显示。每次Bindsheet重新显示,自定义组件都会重新创建。不能保留之前选择的tab和list滑动的位置

5 回复

您好,为了更快速解决您的问题,并且吸引更多用户一同参与您问题的解答与讨论,建议您补全如下信息:

补全复现代码和问题现象,让参与用户更快速复现您的问题;

更多提问技巧,请参考:【Tips】如何提个好问题

更多关于HarmonyOS鸿蒙Next中Bindsheet每次显示,内容都会重新创建,怎么可以保留bindsheet原来的数据和状态呢的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你好。

你需要将tab的页签index 和 list滑动位置的index做缓存记录。每次打开时设置即可。

参考以下代码,高度的设定。

// xxx.ets
@Entry
@Component
struct Index {
  @State isShow: boolean = false
  @State sheetHeight: number = 300;

  @Builder
  myBuilder() {
    Column() {
      Button("change height")
        .margin(10)
        .fontSize(20)
        .onClick(() => {
          this.sheetHeight = 500;
        })

      Button("Set Illegal height")
        .margin(10)
        .fontSize(20)
        .onClick(() => {
          this.sheetHeight = -1;
        })

      Button("close modal 1")
        .margin(10)
        .fontSize(20)
        .onClick(() => {
          this.isShow = false;
        })
    }
    .width('100%')
    .height('100%')
  }

  build() {
    Column() {
      Button("transition modal 1")
        .onClick(() => {
          this.isShow = true
        })
        .fontSize(20)
        .margin(10)
        .bindSheet($$this.isShow, this.myBuilder(), {
          height: this.sheetHeight,
          backgroundColor: Color.Green,
          onWillAppear: () => {
            console.log("BindSheet onWillAppear.");
          },
          onAppear: () => {
            console.log("BindSheet onAppear.");
          },
          onWillDisappear: () => {
            console.log("BindSheet onWillDisappear.");
          },
          onDisappear: () => {
            console.log("BindSheet onDisappear.");
          }
        })
    }
    .justifyContent(FlexAlign.Center)
    .width('100%')
    .height('100%')
  }
}

能否采用组件复用的方案呢,这种简单的还能通过保存两个状态变量实现,如果很复杂的布局里有多种状态那该怎么处理呢

目前bindsheet的原理是每次都重新创建。因为考虑到性能损耗的问题,所以长时间不销毁,建议不用bindsheet实现了。使用自定义组件自己写一个。

在HarmonyOS鸿蒙Next中,如果希望Bindsheet在每次显示时保留原来的数据和状态,可以通过以下方式实现:

  1. 数据持久化:将Bindsheet的数据存储在ViewModel或全局状态管理中,确保数据在组件重建时不会丢失。

  2. 状态管理:使用@State@Link等装饰器来管理Bindsheet的状态,确保状态在组件重建时能够恢复。

  3. 生命周期管理:在onPageShowonPageHide生命周期回调中处理数据的保存和恢复,确保Bindsheet在重新显示时能够加载之前的状态。

通过这些方法,可以有效保留Bindsheet的数据和状态,避免每次显示时重新创建。

回到顶部