鸿蒙Harmony--状态管理器--双向同步@Link详解

你这一生最重要的责任,就是保护好自己脆弱的梦想,熬过被忽略的日子,就轮到你上场了。

如何解决大模型的「幻觉」问题?

目录

一,定义

二,装饰器使用规则说明

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

 四,使用

①简单使用

 ②复杂类型的使用

五,注意事项

@Link装饰状态变量类型错误

一,定义

子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。

!注意:@Link装饰器不能在@Entry装饰的自定义组件中使用。

二,装饰器使用规则说明

@Link变量装饰器说明
装饰器参数
同步类型双向同步。
父组件中@State, @StorageLink和@Link 和子组件@Link可以建立双向数据同步,反之亦然。
允许装饰的变量类型Object、class、string、number、boolean、enum类型,以及这些类型的数组。
支持Date类型。
类型必须被指定,且和双向绑定状态变量的类型相同。
不支持any,不支持简单类型和复杂类型的联合类型,不允许使用undefined和null。
说明:
不支持Length、ResourceStr、ResourceColor类型,Length、ResourceStr、ResourceColor为简单类型和复杂类型的联合类型。
被装饰变量的初始值无,禁止本地初始化。

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

传递/访问说明
从父组件初始化和更新必选。与父组件@State, @StorageLink和@Link 建立双向绑定。允许父组件中@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp装饰变量初始化子组件@Link。
从API version 9开始,@Link子组件从父组件初始化@State的语法为Comp({ aLink: this.aState })。同样Comp({aLink: $aState})也支持。
用于初始化子组件允许,可用于初始化常规变量、@State、@Link、@Prop、@Provide。
是否支持组件外访问私有,只能在所属组件内访问。

 四,使用

  • 当装饰的数据类型为boolean、string、number类型时,可以同步观察到数值的变化

  • 当装饰的数据类型为class或者Object时,可以观察到赋值和属性赋值的变化,即Object.keys(observedObject)返回的所有属性

  • 当装饰的对象是array时,可以观察到数组添加、删除、更新数组单元的变化

  • 当装饰的对象是Date时,可以观察到Date整体的赋值,同时可通过调用Date的接口setFullYearsetMonthsetDatesetHourssetMinutessetSecondssetMillisecondssetTimesetUTCFullYearsetUTCMonthsetUTCDatesetUTCHourssetUTCMinutessetUTCSecondssetUTCMilliseconds 更新Date的属性。

@Link装饰的变量和其所属的自定义组件共享生命周期。

为了了解@Link变量初始化和更新机制,有必要先了解父组件和拥有@Link变量的子组件的关系,初始渲染和双向更新的流程(以父组件为@State为例)。

  1. 初始渲染:执行父组件的build()函数后将创建子组件的新实例。初始化过程如下:

    1. 必须指定父组件中的@State变量,用于初始化子组件的@Link变量。子组件的@Link变量值与其父组件的数据源变量保持同步(双向数据同步)。
    2. 父组件的@State状态变量包装类通过构造函数传给子组件,子组件的@Link包装类拿到父组件的@State的状态变量后,将当前@Link包装类this指针注册给父组件的@State变量。
  2. @Link的数据源的更新:即父组件中状态变量更新,引起相关子组件的@Link的更新。处理步骤:

    1. 通过初始渲染的步骤可知,子组件@Link包装类把当前this指针注册给父组件。父组件@State变量变更后,会遍历更新所有依赖它的系统组件(elementid)和状态变量(比如@Link包装类)。
    2. 通知@Link包装类更新后,子组件中所有依赖@Link状态变量的系统组件(elementId)都会被通知更新。以此实现父组件对子组件的状态数据同步。
  3. @Link的更新:当子组件中@Link更新后,处理步骤如下(以父组件为@State为例):

    1. @Link更新后,调用父组件的@State包装类的set方法,将更新后的数值同步回父组件。
    2. 子组件@Link和父组件@State分别遍历依赖的系统组件,进行对应的UI的更新。以此实现子组件@Link同步回父组件@State。

①简单使用

组件:

@Component
export default struct PropTest {
 
  @Link aaa:string

  build() {
    Row() {
      Column() {
        Text("aaa="+this.aaa)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.aaa ="999"
          })
      }.width('100%')
    }.height('100%')
  }
}

 使用:

import PropTest from './PropTest';

@Entry
@Component
struct Index {

  @State aaa:string ="222"

  build() {
    Column(){
      Text("aaa:"+this.aaa)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          this.aaa ="666"
         
        })
      PropTest({aaa:this.aaa})
    }
  }
}

运行:

点击aaa:222点击aaa=666

 ②复杂类型的使用

数据类:

export default class YuanZhen {

  public name: string = 'YuanZhen';

  public age: number = 18;

  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
}
import YuanZhen from './YuanZhen';

export default class Yuan {

  public number: number = 1;
  public yuanZhen: YuanZhen = new YuanZhen('yuanzhen', 18);

  constructor(number: number, yuanZhen: YuanZhen) {
    this.number = number
    this.yuanZhen = yuanZhen
  }
}

组件类:

import YuanZhen from './bean/YuanZhen'

@Component
export default struct YzComponent {
  @State yuanZhen:YuanZhen=new YuanZhen("袁震",18)

  build() {
    Row() {
      Column() {
        Text("name:"+this.yuanZhen.name+"\nage:"+this.yuanZhen.age)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

      }
      .width('100%')
    }
    .height('100%')
  }
}

父组件:

import Yuan from './bean/Yuan';
import YuanZhen from './bean/YuanZhen';
import PropTest from './PropTest';

@Entry
@Component
struct Index {

  @State yuan:Yuan=new Yuan(2,new YuanZhen("袁震",18))

  build() {
    Column(){
      Text("父name:" + this.yuan.yuanZhen.name+"\nage:"+this.yuan.yuanZhen.age+"\nnumber:"+this.yuan.number)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          this.yuan.number=1
          this.yuan.yuanZhen.age=32
          this.yuan.yuanZhen.name="袁震1"
        })
      PropTest({yuan:this.yuan})
    }
  }
}

使用:

点击父:

点击子:

五,注意事项

@Link装饰状态变量类型错误

在子组件中使用@Link装饰状态变量需要保证该变量与数据源类型完全相同,且该数据源需为被诸如@State等装饰器装饰的状态变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/309673.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Xcode15一个xcworkspace管理多个xcodeproj从零开始,一个主程序,多个子程序,一个主程序引用多个静态库

创建主程序:MainProject 目录结构: sandbox设置成NO:否则Xcode15不能运行 创建子程序 创建Framework 创建多个子程序后的目录结构 在主程序的Podfile中添加代码 # Uncomment the next line to define a global platform for your project pla…

python数据结构堆栈

堆 堆是一种树形结构:满足两个主要性质 堆是一种完全二叉树:堆中所有层级除了最后一层都是完全填满的,且最后一层的节点都是向左排列堆中的任意节点都不大于(或不小于)其子节点的值,这也是堆的属性 impo…

LCD—液晶显示中英文

本节主要介绍以下内容: 字符编码 字模 各种模式的液晶显示字符实验 本节字符编码说明参考网站 字符编码及转换测试:导航菜单 - 千千秀字 Unicode官网:http://www.unicode.org。 一、字符编码 由于计算机只能识别0和1,文字…

行为型设计模式——模板方法模式

学习难度:⭐ ,比较常用 模板方法模式 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知&#xff0…

WEB之HTML练习

第一题&#xff1a;用户注册界面 HTML代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

AlmaLinux 9.3 系统 安装配置 Zabbix6.4 监控系统(史上最全 小白都能看懂)

AlmaLinux 9.3 部署 Zabbix6.4 Zabbix安装部署 安装 Zabbix 源 rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/9/x86_64/zabbix-release-6.4-1.el9.noarch.rpm 清除缓存文件 dnf clean all 安装Zabbix server&#xff0c;Web前端&#xff0c;agent dnf install zabb…

Maven之私服

1 介绍 团队开发现状分析私服是一台独立的服务器&#xff0c;用于解决团队内部的资源共享与资源同步问题Nexus Sonatype公司的一款maven私服产品 下载地址&#xff1a;https://help.sonatype.com/repomanager3/download win版安装包&#xff1a;https://pan.baidu.com/s/1wk…

酷开科技 | 酷开系统—探索科技新“玩法”

科技发展一日千里&#xff0c;智能家居逐渐成为人们享受舒适生活的重要途径之一。在这个背景下&#xff0c;酷开科技凭借其研发技术和创新能力&#xff0c;精心打造了酷开系统&#xff0c;引领行业潮流。现在&#xff0c;我们一起探索酷开系统的独特“玩法”。 01.智能家居一站…

异构图 神经网络xFraud :Explaniable Fraud transcation detection

适用于异构图 2. 使用图进行异常检测 https://github.com/safe-graph/graph-fraud-detection-papers

效率交响曲:AIOps 协调卓越运营

作者&#xff1a;来自 Elastic Priscilla_Parodi ​ 在我们探索 AIOps 之前&#xff0c;让我们先澄清一些与不同 Ops 的一些单并非全部相关的关键概念&#xff1a; 1&#xff09;DevOps&#xff1a;开发运维 你可能已经听说过 DevOps。 它是一种通过协作和自动化促进交付来集…

常用的网站

PIXEL MOTION 注册-YesPMP平台 模型下载 - Ourblender - 专业的三维素材库 Vega AI 创作平台 夏沫的AI小站 Tripo AI B站视频下载工具 | 极简纯净

C++游戏引擎中的坐标系

一.Direct3D四大变换 <1.世界矩阵变换: 为了模拟3D物体的旋转,缩放,平移等功能,Direct3D将静态模型的顶点坐标x,y,z经过旋转平移矩阵变换以得到新的顶点坐标x1,y1,z1 D3DXMATRIX mTrans ; D3DXMatrixTranslation (&mTrans , 5 , - 3 , 0 ); g_pd3dDevice->SetTr…

app小程序开发定制?智创开发

模板小程序和定制小程序效果有很明显的差距的&#xff0c;二者开发花费的时间也不一样&#xff0c;价格自然也就不一样&#xff0c;主要区别在以下几个方面&#xff0c;大家可以参考&#xff0c;根据自身的情况进行选择。 1&#xff09;效果不一样 模板&#xff0c;顾名思义&…

出版实务 | 出版物的成本及其构成

文章目录 出版物成本的总体构成直接成本开发成本制作成本 间接成本期间费用 本量利分析原则特点和作用变动成本项目固定成本项目本量利分析的基本公式及其应用定价发行折扣率销售数量单位销售收入销售收入总额单位销售税金销售税金总额变动成本总额单位变动成本固定成本总额单位…

如何查看Ubuntu内存的使用情况

在Linux系统中&#xff0c;了解内存使用情况对于系统管理和性能优化非常重要。以下是一些常用的命令&#xff0c;以及它们的详细使用说明&#xff1a; 1. free 命令 用途: free 命令用于显示系统中空闲和已用的物理内存及交换内存。示例: 输入命令: free -m输出解释: 这将以M…

flutter 打包IOS及常用配置

修改APP名称 项目名字配置是在 ios/Runner/Info.plist 文件中的 dict 下的 CFBundleName testapp 。如下图所示: String里面就可以修改名称 修改项目 &#xff08;testapp&#xff09;的 Logo 图标 iOS 项目 Logo的配置是在 ios/Runner/Assets.xcassets/AppIcon.appiconset 文…

【LangChain学习之旅】—(5) 提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案

【LangChain学习之旅】—&#xff08;5&#xff09; 提示工程&#xff08;上&#xff09;&#xff1a;用少样本FewShotTemplate和ExampleSelector创建应景文案 提示的结构LangChain 提示模板的类型使用 PromptTemplate使用 ChatPromptTemplateFewShot 的思想起源使用 FewShotPr…

冠军团队!第二届百度搜索创新大赛AI方案

Datawhale干货 作者&#xff1a;李柯辰&#xff0c;Datawhale成员 写在前面 大家好&#xff0c;我们是2023年第二届百度搜索创新大赛 赛道三——AI应用设计赛道的冠军团队——“肝到凌晨”&#xff0c;很高兴能与大家分享我们这次比赛的经验&#xff0c;同时也希望以后有机会可…

RocketMQ 消费重试

消费者出现异常&#xff0c;消费某条消息失败时&#xff0c; Apache RocketMQ 会根据消费重试策略重新投递该消息进行故障恢复。本文介绍消费重试机制的原理、版本兼容性和使用建议。 一、应用场景​ Apache RocketMQ 的消费重试主要解决的是业务处理逻辑失败导致的消费完整性…

从0到1入门C++编程——05 类和对象之运算符重载、继承

文章目录 运算符重载1.加号运算符重载2.左移运算符重载3.递增运算符重载4.赋值运算符重载5.关系运算符重载6.函数调用运算符重载 继承1.继承的基本语法及继承方式2.继承中的对象模型3.继承中构造函数和析构函数的顺序4.继承中同名成员的处理方式5.继承中同名静态成员处理方式6.…