状体管理-装饰器

news2024/11/14 21:57:29

@State 自己的状态
注意:不是状态变量的所有更改都会引起刷新。只有可以被框架观察到的修改才会引起UI刷新。
1、boolean、string、number类型时,可以观察到数值的变化。
2、class或者Object时,可以观察 自身的赋值 的变化,第一层属性赋值的变化,即Object.keys(observedObject)返回的属性。

源代码:

index.ets:

import { componentUtils } from '@kit.ArkUI'

interface Car {
  name: string
}

interface Person {
  name: string,
  car: Car
}

const obj: Person = {
  name: 'zs',
  car: {
    name: '小黄车'
  }
}
console.log('查看第一层属性',Object.keys(obj))

@Entry
@Component
struct Index {
  // 状态变量
  // 1、string number boolean可以直接监视到变化
  @State message: string = 'hello world'
  // 2、复杂类型 object class 第一层随便改,嵌套的话需要进行整个嵌套对象的替换
  @State person: Person = {
    name: 'jack',
    car: {
      name: '宝马车'
    }
  }

  build() {
    Column({space: 10}) {
      Text(this.message).fontSize(20)
      Button('改message').onClick(() => {
        this.message = '你好'
      })
      Text(JSON.stringify(this.person))
      Button('改person').onClick(() => {
        // 1、全部修改可以
        // this.person = {
        //  name: 'any',
        //  car: {
        //    name: '保时捷'
        //  }
        // }
        // 2、修改name
        // this.person.name = 'tony'  修改第一层name可以
        // 如果不是对象的第一层属性,修改时,需要修改整个对象嵌套的对象,否则页面不会刷新,但是值已经改了
        // this.person.car.name = '小火车'  // 页面检测不到
        // console.log('car name', this.person.car.name )
        // this.person.car = {
        //   name: '小火车'
        // }
      })
    }
    .width('100%')
    .height('100%')
    .padding(20)
    .backgroundColor('#ccc')
  }
}

效果图:

@Prop 父子

@Prop - 父子单向
@Prop 装饰的变量可以和父组件建立单向的同步关系。
@Prop 装饰的变量是可变的,但是变化不会同步回其父组件。

源代码:

import { componentUtils } from '@kit.ArkUI'


@Component
struct SonCom {
  // 保证父组件的数据变化了,能够往下响应式的更新
  @Prop sCar: string = ''

  changeCar = ()=> {

  }

  build() {
    Column({space: 10}) {
      Text(`子组件 - ${this.sCar}`)
      Button('换车').onClick(() => {
        // 1、prop传值是单向传递
        // 子组件可以修改到 prop 传值,但是修改的更新不会同步到父组件
        // 通常不太会直接修改 prop 传值,因为父组件的状态一旦变化,会自动向下同步
        // this.sCar = '小黄车'

        // 2、如果实在想更新,希望保证父子同步 => 调用父组件传递过来的方法
        // 如果没有写箭头函数,意味着,this 指向调用者,而此处执行环境this -> 子组件
        this.changeCar()
      })
    }
    .padding(20)
    .backgroundColor(Color.Orange)
  }
}

@Entry
@Component
struct FatherCom {
  @State fCar: string = '劳斯莱斯'
  build() {
    Column({space: 10}) {
      Text(`父组件 - ${this.fCar}`)
      Button('换车').onClick(() => {
        this.fCar = '三轮车'
      })

      // 子组件
      SonCom({
        sCar: this.fCar,
        // 这里必须要用箭头函数,否则会有 this 指向的问题
        // 使用箭头函数的好处,会使用外部环境的this,不受传递过去的执行环境影响
        // 希望此处 this 指向的是父组件
        // changeCar(){
        changeCar: ()=> {
          console.log('这里可以写具体的业务逻辑')
          this.fCar = '超级大赛车'
        }
      })
    }
    .padding(50)
    .backgroundColor(Color.Pink)
  }
}

效果图:

@Prop 父向子练习

传参:

import { componentUtils } from '@kit.ArkUI'


@Component
struct SonCom {
  // 保证父组件的数据变化了,能够往下响应式的更新
  @Prop sCar: string = ''

  changeCar = (newCar: string)=> {

  }

  build() {
    Column({space: 10}) {
      Text(`子组件 - ${this.sCar}`)
      Button('换车').onClick(() => {
        // 1、prop传值是单向传递
        // 子组件可以修改到 prop 传值,但是修改的更新不会同步到父组件
        // 通常不太会直接修改 prop 传值,因为父组件的状态一旦变化,会自动向下同步
        // this.sCar = '小黄车'

        // 2、如果实在想更新,希望保证父子同步 => 调用父组件传递过来的方法
        // 如果没有写箭头函数,意味着,this 指向调用者,而此处执行环境this -> 子组件
        this.changeCar('老爷车')
      })
    }
    .padding(20)
    .backgroundColor(Color.Orange)
  }
}

@Entry
@Component
struct FatherCom {
  @State fCar: string = '劳斯莱斯'
  build() {
    Column({space: 10}) {
      Text(`父组件 - ${this.fCar}`)
      Button('换车').onClick(() => {
        this.fCar = '三轮车'
      })

      // 子组件
      SonCom({
        sCar: this.fCar,
        // 这里必须要用箭头函数,否则会有 this 指向的问题
        // 使用箭头函数的好处,会使用外部环境的this,不受传递过去的执行环境影响
        // 希望此处 this 指向的是父组件
        // changeCar(){
        changeCar: (newCar: string)=> {
          console.log('这里可以写具体的业务逻辑')
          this.fCar = newCar
        }
      })
    }
    .padding(50)
    .backgroundColor(Color.Pink)
  }
}

@Prop 父向子 练习二

import { componentUtils } from '@kit.ArkUI'

// comp
@Component
struct NumberCount {
  @Prop num: number = 1
  subFn = ()=> {

  }

  addFn = ()=> {

  }

  build() {
    // 数字框组件
    Row({ space: 5 }) {
      Button('-').onClick(() => {
        this.subFn()
      })
      Text(this.num.toString())
      Button('+').onClick(() => {
        this.addFn()
      })
    }
  }
}

@Entry
@Component
struct Index {
  @State num1: number = 5
  @State num2: number = 3
  build() {
    Column() {
      Row() {
        Text('茄子')
        NumberCount({ num: this.num1, addFn: () => {
          this.num1++
        }, subFn: ()=> {
          this.num1--
        }})
      }
      Row() {
        Text('香蕉')
        NumberCount({ num: this.num2, addFn: () => {
          this.num2++
        }, subFn: ()=> {
          this.num2++
        }})
      }
    }
  }
}

效果图:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【控制研究领域EI会议推荐】第四届电气工程与控制科学国际学术会议(IC2ECS 2024)

【拟IEEE出版|连续3届稳定EI检索|团队投稿可享优惠】 第四届电气工程与控制科学国际学术会议(IC2ECS 2024) 2024 4th International Conference on Electrical Engineering and Control Science *拟IEEE 出版,连续3届稳定EI检索&#xff0…

了解三大无线通信技术(Wifi、蓝牙、NFC)

1.WIFI Wi-Fi(Wireless Fidelity),又称作“移动热点”,是当今使用最广的一种无线网络传输技术。Wi-Fi技术是把有线网络信号转换成无线信号,形成无线局域网,将局域网内的设备联网。比如我们通过一个无线路由…

【Vue3】组件通信之自定义事件

【Vue3】组件通信之自定义事件 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋…

【重整化群】1.0 to Wilson RG

0. 写在最前面 从高能到统计物理模型RG的技术主要参考 大黄猫的量子多体讲义,杨展如NRG / DMRG 暂时没有想法,编排不出内容有趣的零碎内容,如 CFT,Z2 Lattice gauge, Fermi field 重整化零碎内容,下篇文章将逐一讲述 …

UE5.4内容示例(4)UI_UMG - 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例,可以用此熟悉一遍UE5的功能 UI示例 UI_UMG :基本UMGUI_CommonUI :UMG多层应用UI_SlatePostBuffer UI :FX的示例&…

python中的print函数总结

文章目录 打印变量打印数学计算多行文本复制n次字符串 x*n,n*x不换行输出多个数据换行符制表位转义原字符字符串切片格式化字符串千位分隔符(只适用于整数和浮点数)浮点数小数部分的精度字符串类型,.表示最大的显示长度整数类型浮点数类型 打…

<Qt> 常用控件

目录 一、控件概述 二、QWidget 核心属性 (一)QWidget的核心属性概览 1. enabled 2. geometry 3. WindowFrame的影响 4. windowTitle 5. window Icon 6. windowOpacity 7. cursor 8. font 9. toolTip 10. focusPolicy 11. styleSheet 三、…

docker网络介绍net

docker 几种网络模式 bridge模式 使用–netbridge参数指定网络模式,docker的默认模式就是bridge模式,默认选择bridge的情况下,容器启动的时候会通过DHCP获取一个ip地址,这可能不是我们想要的,在centos系统下&#xff…

springboot给类进行赋初值的四种方式

目录 1. 使用Value和ConfigurationProperties2. 使用PropertySource创建Person.java写一个测试类 3. 使用ImportResourceStudent类创建beans.xml在主类中引入测试 心得 1. 使用Value和ConfigurationProperties 这里不加赘述了,前面我也发过,这里就放个链…

redis--分布式锁(1)

分布式锁的基本需求 互斥性:在任何时刻,只有一个客户端能持有锁。无死锁:即使一个客户端在持有锁的期间崩溃,其他客户端也能获得锁。容错性:分布式锁的实现应该能够容忍部分组件的失败,例如,锁服…

Open Interpreter - 开放解释器

文章目录 一、关于演示它是如何工作的?与 ChatGPT 的代码解释器比较 二、快速开始三、更多操作1、互动聊天2、程序化聊天3、开始新的聊天4、保存和恢复聊天5、自定义系统消息6、更改模型7、在本地运行 Open Interpreter终端Python上下文窗口,最大令牌 8、…

JavaScript异步编程的Promise

目录 1.对Promise的了解 (1)介绍 (2)Promise 的优缺点 2.Promise的基本用法 (1)创建Promise对象 (2)Promise方法then() (3)Promise方法catch() &…

力扣SQL50 删除重复的电子邮箱 自连接删除 连表删除

Problem: 196. 删除重复的电子邮箱 👨‍🏫 参考题解 Code DELETE p1 FROM Person p1,Person p2 WHEREp1.Email p2.Email AND p1.Id > p2.Id

前端Web-JavaScript(下)

主要是补全一下JavaScript 基本对象: String对象 语法格式 方式1: var 变量名 new String("…") ; //方式一 例如: var str new String("Hello String"); 方式2: var 变量名 … ; //方式二 例如: var …

CHCSA第二次作业

#01、创建以上目录和文件结构,并将/yasuo目录拷贝4份到/目录下 [rootlocalhost ~]# ls /yasuo // 先检查是否有yasuo目录 ls: 无法访问 /yasuo: 没有那个文件或目录 [rootlocalhost ~]# mkdir -p /yasuo/dir1 // 递归创建目录 [rootlocalhost ~]#…

Pandas的30个高频函数使用介绍

Pandas是Python中用于数据分析的一个强大的库,它提供了许多功能丰富的函数。本文介绍其中高频使用的30个函数。 read_csv(): 从CSV文件中读取数据并创建DataFrame对象。 import pandas as pd df pd.read_csv(data.csv) read_excel(): 从Excel文件中读取数据…

嗖嗖移动业务大厅(JDBC)

一、项目介绍 1、项目背景: 该项目旨在模拟真实的移动业务大厅,。用户可以注册新卡、查询账单、管理套餐、充值话费、打印消费记录等功能。同时,项目还模拟了用户使用场景,如通话、上网、发短信等,并根据套餐规则进行相应的扣费…

AutoCAD ObjectArx二次开发(二) 关于程序入口的介绍

在上一章节中,我们介绍了环境搭建和程序插件的加载,基本的编程模板(框架)已经准备就绪。接下来,我们将开始编写自己的业务逻辑。ARX开发的核心在于将自定义函数注册到库中,并通过指定的调用命令来实现功能。…

【论文解读|Data Intelligence】 Large Knowledge Model: Perspectives and Challenges

论文链接:Large Knowledge Model: Perspectives and Challenges (sciengine.com) 来源: Data Intelligence 论文介绍: 文章简述了人类语言和世界知识的紧密关系,对比了语言模型和知识图谱在表示和处理人类知识方面的优缺点&…

Candance Allegro 入门教程笔记:PCB封装库的组成元素

文章目录 一、PCB封装库的组成元素二、使用Padstack Edictor制作封装焊盘引脚三、PCB Editor软件创建贴片封装(STM32F103T8U6 QFN36 为例)1.引入库2.读入数据 一、PCB封装库的组成元素 一般来说,针对于Allegro软件,完整的封装是由…