场景一: 存在一个 2000 行左右的xxx.ets文件,并有 10 处重复使用 50 行相同逻辑的代码,此时需要给这一块逻辑增加 / 修改日志输出的格式。
场景二: 项目开发时,已在其中一个页面实现定制化的弹窗提示,但是在之后的新需求中,需要在新页面中再次使用相同的弹窗提示。
两个开发场景中,都需要重复使用相同代码逻辑,因此就需要将公共的、可重用的代码块进行封装,作为一个子组件来使用。
子组件必须的组成要素:
(1)@Component 装饰器
(2)struct 关键字
(3)build() 函数
@Component
struct ChildComponent {
...
build() {
...
}
}
补充说明:
若子组件单独定义在一个文件中时,需要使用export
导出子组件。
子组件定义的位置不同,引入的方式存在区别。
例:子组件为 ChildComponent
@Entry
@Component
struct ParentComponent {
build() {
// 直接使用子组件
ChildComponent()
}
}
//引入子组件
import {ChildComponent} from './ChildComponent'
@Entry
@Component
struct ParentComponent {
build() {
// 先引入再使用子组件
ChildComponent()
}
}
这里仅介绍@Prop、@Provide / @Consume两种简单方式。@Link、@Observed / @ObjectLink同样可以进行传参,之后需要单独说明这几种方式的区别。
在子组件中声明变量,该变量允许不用初始化。当@Prop装饰的变量没有初始化时,父组件需要提供数据源进行初始化;若@Prop装饰的变量初始化时,父组件非必需提供数据源。
@Component
struct ChildComponent {
@Prop name: string
build() {}
}
@Entry
@Component
struct ParentComponent {
@State ParentName: string = "LiHua"
build() {
ChildComponent({ name: this.ParentName })
}
}
与@Prop不同的是,@Provide / @Consume支持更多层级组件之间传递参数,支持子孙组件直接接受到祖先组件的参数,解决父组件参数需要在子组件之间依次传递参数的问题;
@Component
struct ChildSonComponent {
@Consume name: string
build() {}
}
@Component
struct ChildComponent {
build() {
ChildSonComponent()
}
}
@Entry
@Component
struct ParentComponent {
@Provide ParentName: string = "LiHua"
build() {
ChildComponent()
}
}