首页 > 其他分享 >七、Harmony OS 之状态装饰器

七、Harmony OS 之状态装饰器

时间:2023-12-12 09:56:15浏览次数:27  
标签:Prop 装饰 State Link Harmony 组件 OS StateManagement

@State:@State装饰器的变量拥有其所属组件的状态,可以作为其子组件单向和双向同步的数据源。当其数值改变时,会引起相关组件的渲染刷新。

@Prop:@Prop装饰的变量可以和父组件建立单向同步关系,@Prop装饰的变量二hi可变的,但修改不会同步回父组件。

@Link:@Link装饰的变量和父组件构建双向同步关系的状态变量,父组件会接受来自@Link装饰的变量的修改的同步,父组件的更新也会同步给@Link装饰的变量。

@Provide/@Consume:@Provide/@Consume装饰的变量用于跨组件层级(多层组件)同步状态变量,可以不需要通过参数命名机制传递,通过alias(别名)或者属性名绑定。

@Observed:@Observed装饰class,需要观察多层嵌套场景的class需要被@Observed装饰。单独使用@Observed没有任何作用,需要和@ObjectLink、@Prop连用。

@ObjectLink:@ObjectLink装饰的变量接收@Observed装饰的class的实例,应用于观察多层嵌套场景,和父组件的数据源构建双向同步。

 

@State------>@Prop@State <--------> @Link

驱动build()更新

@State ------> @Prop(this.进行传参)

@State -------> @Link(传参使用$)

@Entry
@Component
struct StateManagement {
  // @State 必须初始化
  @State name: string = '帝心'
  build() {
    Row() {
      Column() {
        Text(this.name).StateManagement_textStyle()
        Button('你干嘛~~').StateManagement_btnStyle(() => {
          this.name = this.name === '帝心' ? '庄生' : '帝心'
        })
        Divider()
        StateManagement_prop({content_prop:this.name})
        Divider()
        // 如果是 state <----> link 参数传递时,需要使用$变量名进行传递
        StateManagement_link({content_link:$name})
      }
      .width('100%')
    }
    .height('100%')
  }
}
// 踩坑注意: 自定义组件、自定义样式的函数名称 要保证在整个项目中是唯一的否则会报错!!
//          可以使用 文件名_样式名(组件名) 来命名样式函数或组件函数
//
// 声明一个自定义组件
// 存放一个 @Prop 装饰的状态数据,方便父子组件之间进行数据传递和同步 State -----> Prop
@Component
struct StateManagement_prop{
  // 组件的形参
  // @Prop 装饰的变量不允许初始化赋值
  @Prop content_prop:string
  build(){
    Column(){
      // 父组件数据修改,子组件的数据同步变化
      Text('prop:' + this.content_prop).StateManagement_textStyle()
      // 修改子组件的数据,父组件不同步变化
      Button('修改prop数据').StateManagement_btnStyle(() => {
        this.content_prop = 'HarmonyOS4.0'
      })
    }
  }
}
// 存放一个 @Link 装饰的状态数据
@Component
struct StateManagement_link{
  @Link content_link: string
  build() {
    Column() {
      Text('Link:' + this.content_link).StateManagement_textStyle()
      Button('修改link数据').StateManagement_btnStyle(() => {
        this.content_link = '全网最细'
      })
    }
  }
}
// text样式封装
@Extend(Text) function StateManagement_textStyle(){
  .fontSize(30)
  .fontWeight(FontWeight.Bold)
  .fontColor(Color.Green)
}
// button样式封装
@Extend(Button) function StateManagement_btnStyle(click:Function){
  .fontSize(30)
  .onClick(()=>{
    click()
  })
}

 

标签:Prop,装饰,State,Link,Harmony,组件,OS,StateManagement
From: https://www.cnblogs.com/ckfuture/p/17896119.html

相关文章

  • 车机 Android 环境下利用 CarAudioService 实现自定义 Java 服务自启动
    注意:本文基于Android11进行分析Qidi2023.11.28(MarkDown&Haroopad)0.简介AndroidRO(ResourceOverlay)机制Overlay实现的效果正如其字面意思,就是“在原有效果的基础上再叠加一些效果”。Android提供了两种实现方式:编译时:https://source.android.com/docs/set......
  • docker部署PostgreSQL数据库(带有postgis插件)
    1、拉PostgreSQL(带有postgis插件)镜像dockerpullmdillon/postgis2、启动数据库容器dockerrun--namepostgis-ePOSTGRES_PASSWORD=postgis-p5432:5432-dmdillon/postgis:latest参数解释:--namepostgis为容器指定一个名称;-p5432:5432:指定端口映射,格式为:......
  • Linux系统C++程序设计1-Linux系统和POSIX 标准入门
    1Linux系统和POSIX标准入门本书介绍了Linux以及我们如何在Linux环境中使用C++来管理关键资源。我们想花一些时间在本章中加深对操作系统(OS)的基本了解。您将更多地了解一些特定技术、系统调用接口和可移植操作系统接口(POSIXPortableOperatingSystemInterface)的起源。在Lin......
  • 在CentOS7等老系统上配置clangd进行C/C++开发
    应该有许多公司开发机器上还是用着比较老的环境,比如CentOS7之类的。这类系统上很可能他的glibc的版本不到2.18,clangd要求的最低glibc版本就是2.18,因此我们没办法直接在这类老系统上运行clangd。但是vscode上微软的那个c++插件一坨史,慢不说,补全也差劲。我的要求有几点:不能升级......
  • 23种设计模式——装饰者模式
    今天给大家说一下23种设计模式中装饰者模式。一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。这个时候,我们就需要用到装饰者模式了,它可以实现在不增加很多子类的情况下扩展类的功能。概念:装饰者模式(DecoratorPatt......
  • 装饰器
    【一】函数的四种定义方式无参无返回值的函数defindex():res=1+1print(res)index()#2有参无返回值的函数defindex(x):print(x)index(1)#1有参有返回值defindex(x):returnxres=index(1)print(res)#1多个参数多个返回值......
  • 装饰器
    装饰器【一】什么是装饰器装饰代指为被装饰对象添加新的功能代指器具/工具,装饰器与被装饰的对象均可以是任意可调用对象。概括地讲,装饰器的作用就是在不修改被装饰对象源代码和调用方式的前提下为被装饰对象添加额外的功能。装饰器经常用于有切面需求的场景插入日志、性能......
  • 前端学习笔记202310学习笔记第一百壹拾玖天-模块包-内置模块http之post之3
    varhttp=require("http")varurl=require("url")varhttps=require("https")http.createServer((req,res)=>{varurlobj=url.parse(req.url)res.writeHead(200,{"content-Type":"application/json;......
  • 前端歌谣-第四拾陆课-node之http模块之post
    前言我是歌谣微信公众号关注前端小歌谣一起学习前端知识今天继续给大家讲解node中post请求的讲解案例varhttp=require("http")varurl=require("url")varhttps=require("https")http.createServer((req,res)=>{varurlobj=url.parse(req.url)res.writeHead(200,......
  • 前端学习笔记202310学习笔记第一百壹拾玖天-模块包-内置模块http之post之1
     ......