[避坑]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 回复