首屏骨架效果HarmonyOS NEXT(适用API12以上版本)

HarmonyOS NEXT

首屏骨架效果

第一步:小组件样式(默认宽100%)

@Component
export struct HcSkeletonItem {
  @Prop
  widthValue: Length = '100%'

  build() {
    Text()
      .height(16)
      .width(this.widthValue)
      .borderRadius(2)
      .backgroundColor($r('app.color.common_gray_bg'))
  }
}

第二步:容器动画组件

@Component
export  struct HcSkeleton {

  // 做动画过渡的
  @State opacityValue: number = 1

  @Builder
  DefaultBuilder(){}

  @BuilderParam
  default: ()=>void = this.DefaultBuilder

  build() {
    Row(){
      this.default()
    }
    .padding(15)
    .opacity(this.opacityValue)
    .animation({
      duration: 600,
      iterations: -1,
      playMode: PlayMode.Alternate
    })
    .onAppear(()=>{
      this.opacityValue = 0.5
    })
  }
}

第四步:在页面内直接写样式

  • 往HcSkeleton定义的组件里面传,后面正常写Colimn的样式

//判断是否在加载
  @State isLoading: boolean = false

//第三步:当请求数据前false,请求完true
  async getQuestionTypeList() {
    try {
      this.isLoading = true
      const res = await http.request<QuestionType[]>({
        url: 'question/type'
      })
      this.questionTypeList = res
      this.isLoading = false
    } catch (e) {
      logger.error(JSON.stringify(e))
    }
  }

--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------

//骨架框
  @Builder
  SkeletonBuilder() {
    //第四步往HcSkeleton定义的组件里面传,后面正常写Colimn的样式
    HcSkeleton() {
      Column() {
        Row({ space: 16 }) {
          HcSkeletonItem({ widthValue: 60 })
          HcSkeletonItem({ widthValue: 100 })
          HcSkeletonItem({ widthValue: 80 })
          HcSkeletonItem({ widthValue: 40 })
        }
        .height(44)
        .width('100%')

        ForEach([1, 2, 3, 4, 5, 6], () => {
          Column({ space: 10 }) {
            HcSkeletonItem({ widthValue: '90%' })
            HcSkeletonItem({ widthValue: '45%' })
          }
          .height(80)
          .width('100%')
          .alignItems(HorizontalAlign.Start)
          .justifyContent(FlexAlign.Center)
        })
      }
      .padding({ left: 16, right: 16 })
    }
  }

-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
 build() {
   //第五步:加个判断,没加载成功显示骨架,成功了显示请求回数据的样式
    if (this.isLoading) {
      this.SkeletonBuilder()
    } else {
      //这里面是之前样式
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值