鸿蒙开发 - 状态管理之@Prop

2023-12-21 15:57:32

@Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装饰的变量是可变的,但是变化不会同步回其父组件。

概述

@Prop装饰的变量和父组件建立单向的同步关系:

  • @Prop变量允许在本地修改,但修改后的变化不会同步回父组件。
  • 当父组件中的数据源更改时,与之相关的@Prop装饰的变量都会自动更新。如果子组件已经在本地修改了@Prop装饰的相关变量值,而在父组件中对应的@State装饰的变量被修改后,子组件本地修改的@Prop装饰的相关变量值将被覆盖。

限制条件

@Prop装饰器不能在@Entry装饰的自定义组件中使用。

装饰器使用规则说明

@Prop变量装饰器说明
装饰器参数
同步类型单向同步:对父组件状态变量值的修改,将同步给子组件@Prop装饰的变量,子组件@Prop变量的修改不会同步到父组件的状态变量上
允许装饰的变量类型string、number、boolean、enum类型。不支持any,不允许使用undefined和null。必须指定类型。在父组件中,传递给@Prop装饰的值不能为undefined或者null,
被装饰变量的初始值允许本地初始化。

变量的传递/访问规则说明

传递/访问说明
从父组件初始化如果本地有初始化,则是可选的。没有的话,则必选,支持父组件中的常规变量、@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp去初始化子组件中的@Prop变量。
用于初始化子组件@Prop支持去初始化子组件中的常规变量、@State、@Link、@Prop、@Provide。
是否支持组件外访问@Prop装饰的变量是私有的,只能在组件内访问。

初始化规则图示
请添加图片描述

观察变化和行为表现

观察变化

@Prop装饰的数据可以观察到以下变化。

当装饰的类型是允许的类型,即stringnumberbooleanenum类型都可以观察到的赋值变化;

// 简单类型
@Prop count: number;
// 赋值的变化可以被观察到
this.count = 1;

对于@State@Prop的同步场景:

  • 使用父组件中@State变量的值初始化子组件中的@Prop变量。当@State变量变化时,该变量值也会同步更新至@Prop变量。
  • @Prop装饰的变量的修改不会影响其数据源@State装饰变量的值。
  • 除了@State,数据源也可以用@Link@Prop装饰,对@Prop的同步机制是相同的。
  • 数据源和@Prop变量的类型需要相同。

框架行为

要理解@Prop变量值初始化和更新机制,有必要了解父组件和拥有@Prop变量的子组件初始渲染和更新流程。

1.初始渲染:

  • 执行父组件的build()函数将创建子组件的新实例,将数据源传递给子组件;
  • 初始化子组件@Prop装饰的变量。

2.更新:

  • 子组件@Prop更新时,更新仅停留在当前子组件,不会同步回父组件;
  • 当父组件的数据源更新时,子组件的@Prop装饰的变量将被来自父组件的数据源重置,所有@Prop装饰的本地的修改将被父组件的更新覆盖。

使用场景

1.父组件@State到子组件@Prop简单数据类型同步;

2.父组件@State数组项到子组件@Prop简单数据类型同步

3.从父组件中的@State类对象属性到@Prop简单类型的同步

4.@Prop本地初始化不和父组件同步

  • 为了支持@Component装饰的组件复用场景,@Prop支持本地初始化,这样可以让@Prop是否与
  • 父组件建立同步关系变得可选。当且仅当@Prop有本地初始化时,从父组件向子组件传递@Prop的数据源才是可选的

注意:由于我用的DevEco版本是 DevEco Studio 3.1.1 ReleaseAPI9,非最新版,所以在@Prop本地初始化的时候会报错提示,但是不影响程序运行。

在这里插入图片描述

文章来源:https://blog.csdn.net/SSY_1992/article/details/135130078
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。