[避坑]HarmonyOS 鸿蒙Next:状态为啥不生效

[避坑]HarmonyOS 鸿蒙Next:状态为啥不生效

开发过程中遇到一个问题这个问题不知道大家会不会也有遇到

具体代码如下:

@Component
export struct CustomWidget {
  state: StateData = new StateData(new CheckPoint("组件内的state").mockStr("BB"))
  @Provide name: string = this.state.name  // 【2】
  aboutToAppear(): void {
    console.log("CheckPoint Provide 的初始值到底是多少啥 " + this.name)
    console.log("CheckPoint state 的初始值到底是多少啥 " + this.state.name)
  }
  
  build() {
    ...自定义组件
  }
}
@Entry
@Component
export struct Index {
  build() {
    Column(){
      CustomWidget(
        {
          state: new StateData(new CheckPoint("父容器传递的state").mockStr("AA"))// 【1】
        }
      )
    }
  }
}

代码描述

(1) 父容器传递 state 对象 用于 自定义组件的 状态提供 【1】

(2) 自定义组件在参数定义出就从 state 中取出需要的数据对状态进行了初始化 【2】

(3) 使用时发现 name 的初值并非父容器传递过来的数据

使用checkPoint类检查执行流程Log

CheckPoint:父容器传递的state
CheckPoint:组件内的state
CheckPoint Provide 的初始值到底是多少啥 [组件内的state]: BB
CheckPoint state 的初始值到底是多少啥 [父容器传递的state]: AA

由此判断 页面构建的执行流程是

1 执行组件创建 此时创建了要传递给子组件的数据体

2 初始化组件的参数 即组件内的初始 而非使用传递过来的数据进行初始化

3 在 aboutToAppear 将父容器传递过来的数据体赋值给已经初始化过一次的组件参数 (这个逻辑是自动执行的)

4 在aboutToAppear执行的时候 组件的属性已经被赋值为父容器传递过来的数据了

由此看来 name 值没被赋值为 组件外提供的值的原因 就是 组件会在接收外部传值之前先初始化,那些没有二此赋值的 状态信息会默认使用 组件内部初始化的值 这会导致 在开发时 明明传递的状态进来但是却没有绑定上的问题

解决方法: 在 aboutToAppear 方法内部进行 状态的二次赋值即可 (这个细节很容易导致一些无法很快定位的问题出现)


更多关于[避坑]HarmonyOS 鸿蒙Next:状态为啥不生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于[避坑]HarmonyOS 鸿蒙Next:状态为啥不生效的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对帖子标题“[避坑]HarmonyOS 鸿蒙Next:状态为啥不生效”的问题,以下是可能的回答:

在HarmonyOS鸿蒙Next系统中,如果状态不生效,可能的原因有多种。首先,确保你已经正确设置了状态的相关属性和值。状态在鸿蒙系统中通常与组件的属性、数据绑定以及业务逻辑紧密相关。

检查以下几个方面可能有助于解决问题:

  1. 状态属性设置:确认你设置的状态属性是否正确,包括属性名、数据类型以及值是否符合预期。

  2. 数据绑定:如果状态是通过数据绑定来控制的,检查绑定的数据源是否已正确初始化,并且数据的变化能否正确触发状态的更新。

  3. 组件生命周期:在某些情况下,组件的生命周期可能会影响状态的生效。例如,在组件未完全加载或已卸载时设置状态,可能会导致状态不生效。

  4. 代码逻辑错误:检查代码中是否存在逻辑错误,如条件判断错误、循环错误等,这些错误可能会影响状态的正确设置和更新。

如果以上检查均未发现问题,但状态仍然不生效,可能是由于系统或框架的bug导致的。此时,可以尝试更新鸿蒙系统或相关框架到最新版本,看是否解决了问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html,

回到顶部