鸿蒙开发中最容易被误解的三兄弟:@State、@Prop、@Link 到底怎么用?【华为根技术】

举报
Echo_Wish 发表于 2025/11/05 21:09:03 2025/11/05
【摘要】 鸿蒙开发中最容易被误解的三兄弟:@State、@Prop、@Link 到底怎么用?

鸿蒙开发中最容易被误解的三兄弟:@State、@Prop、@Link 到底怎么用?

大家好,我是你们熟悉的鸿蒙自媒体博主 Echo_Wish
今天咱们来聊一个很多鸿蒙(ArkUI)开发者刚入门时都会踩的坑:状态管理

你是不是也曾经历过下面这几个瞬间:

  • 页面变量明明改了,UI就是不刷新?
  • 我传了个值给子组件,结果它却改不了?
  • 明明要共享状态,但怎么传都不优雅?

没错,这些问题的本质都是 @State、@Prop、@Link 的使用场景没分清

它们就像三兄弟,看着相似,但性格完全不一样。
用对了,代码丝滑;用错了,心态崩掉。

今天,我们就把它们彻底说透。


一、引子:UI不是“画出来的”,是“算出来的”

ArkUI 的一个核心理念:
UI = f(state)
也就是:UI 是根据状态计算得来的

当状态变化时,UI才会自动刷新。
所以,状态类型选错,UI 自然不会动。

状态管理不是语法技巧,是组件通信的底层逻辑

想清楚一个问题,你就不会再乱用:

这个变量是谁拥有的?谁可以改?改完是否要刷新UI?


二、原理讲解:三兄弟的性格图(通俗易懂)

装饰器 谁拥有数据? 谁能修改? 改了会刷新UI吗? 典型用途
@State 自己组件内部 本组件自己可以改 ✅ 会刷新 私有状态,如输入框、tab状态
@Prop 父组件拥有 子组件不能改 ❌ 不刷新(除非父改后传新值) 父传子只读数据,例如标题、颜色
@Link 父组件拥有 父子都可改(共享状态) ✅ 刷新父和子 父子共享状态,例如购物车数量

一句话记忆:

@State 自己用的,@Prop 父给你的,@Link 父子一起用的。


三、实战代码示例:用最常见的“计数器”讲清

1) @State:自己玩自己的

@Entry
@Component
struct CounterStateDemo {
  @State count: number = 0;

  build() {
    Column() {
      Text(`当前计数:${this.count}`)
      Button("点我+1")
        .onClick(() => {
          this.count += 1; // 本组件自己改,UI自动刷新
        })
    }
  }
}

@State → 内部自带刷新能力,适合组件自己管理数据。


2) @Prop:父给子用,但你别动

@Component
struct ChildTitle {
  @Prop title: string; // 子组件只读

  build() {
    Text(this.title)
  }
}

@Entry
@Component
struct Parent {
  build() {
    ChildTitle({ title: "我是父组件传来的标题" })
  }
}

子组件只能用 title,不能改它。
想改?那必须父组件自己改,然后重新传递。


3) @Link:父子共用一个变量

@Component
struct ChildCounter {
  @Link count: number;

  build() {
    Button(`子组件加1:${this.count}`)
      .onClick(() => {
        this.count++; // 改的其实是父组件的 count
      })
  }
}

@Entry
@Component
struct ParentCounter {
  @State count: number = 0;

  build() {
    Column() {
      Text(`父组件显示:${this.count}`)
      ChildCounter({ count: $count }) // 注意这里是:$count
    }
  }
}

子组件按钮点一下,父组件数字也变,这就是共享状态。

⚠️ 关键点:@Link 在传的时候必须用 $变量
不然只是传值,而不是传引用。


四、场景应用:到底什么时候用谁?

需求场景 推荐使用
仅组件内部使用的状态 ✅ 用 @State
父→子传值,子不改变 ✅ 用 @Prop
父↔子共享状态,双方都能改 ✅ 用 @Link
多层组件共享状态(全局) 使用 @Provide / @Consume / AppStorage

再用一句人话解释:

  • 你自己的小心事 → @State
  • 父母给你的零花钱,但不能乱花 → @Prop
  • 家庭共同账户 → @Link

是不是一下子就明白了?😁


五、Echo_Wish式思考:状态不是工具,是思想

很多人学框架总想先记语法,但真正决定你写得顺不顺的,是你理解不理解“数据是谁的”

鸿蒙的状态管理,其实是在推动我们思考:

组件是独立的,数据责任也是独立的。
能自己管就自己管,需要共享就声明共享,该只读就别乱改。

你会发现:

  • 项目越大,越要减少混乱的状态流动
  • @State 和 @Prop 越分得清晰,代码越稳定
  • @Link 用少比用多更高级

最终,你写的不是“页面”,而是关系清晰、自洽的系统


❤️ 最后一句话(敲黑板)

UI 不会因为你想让它变而变,它只会因为“状态”变而变。

学会管理状态,就是学会掌控 UI。
当你真正用明白了 @State、@Prop、@Link,
你就已经迈入了专业鸿蒙开发者的门槛。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。