V1 和 V2 的区别

7 阅读6分钟

状态管理 V1 主要装饰器

  • @State‌:组件内部状态,可被外部初始化,修改后触发 UI 刷新。
  • @Prop‌:父组件向子组件单向传递数据,‌子组件可修改但不会同步回父组件‌。
  • @Link‌:实现父子组件双向绑定,一方修改另一方同步更新。
  • @Provide / @Consume‌:跨多层组件共享状态(提供者与消费者)。
  • @Observed / @ObjectLink‌:用于嵌套对象,配合实现深度属性监听(需逐层封装)。
  • @Watch‌:监听状态变量变化,但‌仅能观测第一层属性‌,无法获取变更前值。
  • @StorageProp / @StorageLink 等‌:用于与应用级存储(如 AppStorage)联动。

V1 基于“代理观察者”机制,‌仅能监听对象第一层变化‌,嵌套属性修改不会触发 UI 更新 ‌‌**。


状态管理 V2 主要装饰器

  • @ComponentV2‌:声明 V2 组件(替代 V1 的 @Component)。
  • @Local‌:组件内部私有状态,‌禁止外部初始化或修改‌,仅限内部使用 ‌‌**。
  • @Param‌:父传子单向只读状态,‌子组件不可直接修改‌(编译报错),需配合 @Event 通知父组件 ‌‌**。
  • @Once‌:与 @Param 搭配使用,仅初始化时同步一次父值,之后解耦为本地变量 ‌‌**。
  • @Event‌:子组件向父组件发送事件的标准回调,实现可控双向通信 ‌‌**。
  • @ObservedV2 + @Trace‌:实现‌深度属性监听‌,任意层级嵌套对象属性变化均可触发 UI 更新 ‌‌**。
  • @Monitor‌:替代 @Watch,支持‌同时监听多个变量‌,可获取变更前后值,并支持深度观测(需配合 @Trace)‌‌**。
  • @Computed‌:计算属性,依赖状态变化时才重新计算,避免重复运算 ‌‌**。
  • @Provider / @Consumer‌:跨层级状态共享,‌强制别名匹配‌,@Consumer 必须提供兜底默认值 ‌‌**。

V2 采用“深度观察”机制,‌无需代理即可精准感知任意层级数据变更‌,性能更优、结构更清晰 ‌‌**。


V1 与 V2 主要状态装饰器对照

功能/场景V1 装饰器/APIV2 装饰器/API简要说明
组件装饰器@Component@ComponentV2V2 的组件装饰器需搭配 V2 状态变量使用,禁止与 V1 装饰器混用。
内部状态@State@Local两者都用于声明组件内部的可变状态。V2 的 @Local 更明确表示局部状态。
组件参数@Prop@Link@Param@EventV1 的 @Prop 和 @Link 分别实现单向和双向同步。V2 解耦为 @Param(输入)和 @Event(输出),通过事件驱动实现通信。
对象观察@Observed@Track@ObservedV2@TraceV1 需搭配 @ObjectLink 观察第一层属性;V2 通过 @ObservedV2 标记可观察类,@Trace 修饰属性,支持任意深度嵌套属性的观察。
状态监听@Watch@MonitorV1 监听状态变量本身及第一层属性变化;V2 结合 @Trace 支持深层监听,且在一次事件中合并多次更新。
提供/消费@Provide@Consume@Provider@Consumer功能兼容,用于跨组件层级共享状态。
计算属性不支持@ComputedV2 新增,用于缓存计算结果,避免重复计算。
全局状态AppStorageLocalStorageAppStorageV2@ObservedV2/@TraceV1 的全局状态管理与持久化逻辑耦合;V2 的 AppStorageV2 功能解耦,持久化能力由独立的 PersistenceV2 提供。
环境变量Environment调用 Ability 接口V2 建议直接调用系统接口获取环境变量,不再与 AppStorage 耦合。
持久化存储PersistentStoragePersistenceV2V2 的持久化能力可独立使用。

二、V1 与 V2 的核心区别

关键区别总结

特性V1V2
观测深度仅第一层支持任意嵌套层级(@ObservedV2 + @Trace)
父子通信@Prop(可改)、@Link(双向)@Param(只读) + @Event(回调)
内部状态@State(可外部传入)@Local(仅内部初始化)
性能优化无计算属性,重复渲染风险高支持 @Computed 缓存结果
混合使用可与 V2 组件共存于同一项目但‌同一组件内不能混用 V1/V2 装饰器‌ ‌‌**

V1 与 V2 的核心区别

  1. 设计理念与观察能力

    • V1 以组件层级为核心。其装饰器(如 @State@Link)主要管理组件级别的状态,但仅支持对象第一层属性的浅层观察 2。若要观察嵌套对象(如 person.address.city),必须手动为每个嵌套类添加 @Observed,并通过 @ObjectLink 逐层绑定,代码冗余且易出错。
    • V2 以数据对象为核心。通过 @ObservedV2 和 @Trace 装饰器,能够直接对嵌套属性进行深度观察 3。修改深层属性(如 person.address.city)可直接触发 UI 更新,无需额外的链路声明,极大简化了复杂数据结构的响应式管理。
  2. 组件通信机制

    • V1 依赖双向绑定(如 @Link),父子组件之间的数据同步由框架隐式处理,导致组件耦合度高,逻辑交织,调试和维护相对困难。
    • V2 倡导单向数据流 + 事件驱动 2。父组件通过 @Param 传递数据给子组件,子组件通过 @Event 触发事件回调来通知父组件更新。这种显式通信使数据流更清晰,提升了代码的可维护性和可测试性。
  3. 性能与渲染优化

    • V1 在状态更新时,常因对象整体赋值(如 this.obj = newObj)而触发所有依赖组件的重新渲染,可能导致冗余刷新 3。
    • V2 支持属性级更新。当只有某个深层属性(如 city)发生变化时,框架能够精准定位并仅重绘依赖该属性的 UI 组件(如特定的 Text 组件),有效减少了渲染开销,提升了应用性能。
  4. 功能增强与工程化改进

    • V2 引入了新能力@Computed 用于定义计算属性,避免重复计算;@Monitor 在监听状态变化时不仅能感知变化后的数据,还能获取变化前的数据,更利于实现风控、日志等场景。
    • 状态管理解耦:V1 的 AppStorage 将全局状态、环境变量、持久化存储能力耦合在一起。V2 将其拆分为独立的 AppStorageV2(全局状态)、系统 Ability 接口(环境变量)和 PersistenceV2(持久化),架构更清晰,职责更单一。
    • 内存管理优化:V2 引入了自动清理机制,减少了组件销毁后状态残留的风险;而 V1 需要开发者更多关注手动管理。

使用建议

  • 新项目‌:‌优先使用 V2‌,官方推荐,更适合复杂应用 ‌‌**。
  • 旧项目‌:若 V1 已满足需求,可暂不迁移;若需优化性能或支持深度数据绑定,建议‌渐进式迁移到 V2‌ ‌‌**。
  • 注意兼容性‌:V1 和 V2 组件可互相引用,但‌装饰器不能混用在同一组件中‌ ‌‌