鸿蒙Next中@consume和@prop的区别是什么

鸿蒙Next中@consume@prop的具体区别是什么?在什么场景下应该使用@consume而不是@prop?能不能举例说明两者的典型用法和注意事项?

2 回复

鸿蒙Next里,@consume@prop就像一对相声搭档:
@prop是单口相声,数据只能从父组件传下来,子组件不能改;
@consume是群口相声,数据能被所有子组件共享和修改,还能自动同步更新。
简单说:一个单向传值,一个全家共享!

更多关于鸿蒙Next中@consume和@prop的区别是什么的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next(HarmonyOS NEXT)中,@consume@prop 是用于组件间状态管理的装饰器,主要区别如下:

1. 数据流向

  • @prop:单向数据流,用于父组件向子组件传递数据。子组件接收父组件的状态,但修改该状态不会影响父组件(默认行为)。
  • @consume:双向数据流,用于跨组件层级共享状态。子组件可以读取并修改祖先组件提供的状态,修改会同步到所有使用该状态的组件。

2. 使用场景

  • @prop:适用于父子组件间的简单数据传递,子组件仅依赖父组件数据但不直接修改它。
  • @consume:适用于跨多层级组件的状态共享(配合 @provide 使用),避免逐层传递。

3. 代码示例

使用 @prop

// 父组件
@Entry
@Component
struct ParentComponent {
  @State message: string = 'Hello'

  build() {
    Column() {
      ChildComponent({ message: this.message })
    }
  }
}

// 子组件
@Component
struct ChildComponent {
  @Prop message: string

  build() {
    Text(this.message)
      .onClick(() => {
        this.message = 'Updated' // 仅修改子组件本地状态,不影响父组件
      })
  }
}

使用 @consume@provide

// 祖先组件
@Entry
@Component
struct AncestorComponent {
  @Provide message: string = 'Hello'

  build() {
    Column() {
      ParentComponent()
    }
  }
}

// 中间组件(无需传递)
@Component
struct ParentComponent {
  build() {
    Column() {
      ChildComponent()
    }
  }
}

// 子组件
@Component
struct ChildComponent {
  @Consume message: string

  build() {
    Text(this.message)
      .onClick(() => {
        this.message = 'Updated' // 修改会同步到所有 @consume 组件
      })
  }
}

4. 关键区别总结

  • 数据同步@prop 是局部同步,@consume 是全局同步。
  • 层级依赖@prop 需显式传递,@consume 可跨层级直接访问。
  • 性能影响@consume 可能因状态全局共享带来更多渲染,需谨慎使用。

根据需求选择:简单父子通信用 @prop,复杂跨组件状态共享用 @consume

回到顶部