状态管理@Prop

     

目录

1、父组件@State到子组件@Prop简单数据类型同步

2、父组件@State数组项到子组件@Prop简单数据类型同步

3、从父组件中的@State类对象属性到@Prop简单类型的同步


         @Prop主要用用于父组件到子组件的数据级联更新,父组件的数据变化会影响到子组件的数据变化,但发过来子组件的数据变化则不会影响到父组件的更新。 被@Prop装饰的变量可以和父组件建立单向的同步关系。子组件中@Prop装饰的变量是可变的,但是变化不会同步回其父组件。

        @Prop变量值初始化和更新机制:

  • 初始渲染
  1. 执行父组件的build()函数将创建子组件的新实例,将数据源传递给子组件;
  2. 初始化子组件@Prop装饰的变量。
  • 更新
  1. 子组件@Prop更新时,更新仅停留在当前子组件,不会同步回父组件;
  2. 当父组件的数据源更新时,子组件的@Prop装饰的变量将被来自父组件的数据源重置,所有@Prop装饰的本地的修改将被父组件的更新覆盖。

1、父组件@State到子组件@Prop简单数据类型同步

@Entry
@Component
struct PropDemoPage {
  @State message: string = '演示@Prop装饰器的使用:\n该装饰器用于实现修改父组件' +
    '然后子组件自动更新的单向联动(子组件数据更新不会反馈到父组件中)'
  @State index: number = 0

  build() {
    Row() {
      Column() {
        Text(this.message).letterSpacing(2)
        Text(`${this.index}`)
          .fontSize(48)
          .fontColor(Color.Pink)
          .padding(5)
          .backgroundColor("#67c8ff")
          .onClick(() => {
            this.index++
          })
        Divider()
        ChildView({ indexProp: this.index })
      }
      .width('100%')
    }
    .height('100%')
  }
}

@Component
struct ChildView {
  @Prop
  indexProp: number

  build() {
    Row() {
      Text(`${this.indexProp}`)
        .fontSize(24)
        .fontColor(Color.Pink)
        .padding(8)
        .backgroundColor("#8067c8ff")
        .onClick(() => {
          this.indexProp++
        })
    }
  }
}

        父组件中用@State修饰了变量index,通过“从父组件初始化”将其值赋值给子组件@Prop修饰的变量indexProp,同时在父组件和子组件中绑定了点击事件,表现如下:

  • 点击父组件,index的变化能够更新到子组件indexProp上。
  • 点击子组件,indexProp的变化不能更新到父组件index上。

2、父组件@State数组项到子组件@Prop简单数据类型同步

@Entry
@Component
struct PropDemo2Page {
  @State arr: number[] = [1, 2, 3];

  build() {
    Row() {
      Column() {
        Child({ value: this.arr[0] })
        Child({ value: this.arr[1] })
        Child({ value: this.arr[2] })

        Divider().height(5)

        ForEach(this.arr,
          item => {
            Child({ value: item })
          },
          item => JSON.stringify(item)
        )
        Text('replace entire arr')
          .fontSize(50)
          .onClick(() => {
            // 两个数组都包含项“3”。
            this.arr = this.arr[0] == 1 ? [3, 4, 5] : [1, 2, 3];
          })
      }
    }
  }
}

@Component
struct Child {
  @Prop value: number;

  build() {
    Text(`${this.value}`)
      .fontSize(50)
      .onClick(() => {
        this.value++
      })
  }
}

        3个子组件都有从父组件的@State变量的拷贝,所以点击子组件,会发现上面的数字会变化,但是下面的数据不会变化(因为下面的数据位于父组件中)。

        把上面三个数据都改为8 8 8,在点击下面的replace entire arr,会发现数据都变成了3 4 5;为什么呢?

         当点击replace entire arr按钮的时候,由于子组件的数据变化不会反应到父组件中,虽然子组件显示8 8 8 ,但是父组件中的数据依然还是1 2 3,当点击事件发生的时候,依据判断条件就会把3 4 5赋值给数组,注意这里时发生在父组件中的赋值,其行为会反映到子组件中,所以会触发子组件的更新,也就时上面三个数据变成了3 4 5。

3、从父组件中的@State类对象属性到@Prop简单类型的同步



@Entry
@Component
struct PropDemo3Page {
  @State book: Book = new Book('100 secrets of C++', 765);

  build() {
    Column() {
      ReaderComp({ title: this.book.title, readIt: this.book.readIt })
      ReaderComp({ title: this.book.title, readIt: this.book.readIt })
    }
  }
}
class Book {
  public title: string;
  public pages: number;
  public readIt: boolean = false;

  constructor(title: string, pages: number) {
    this.title = title;
    this.pages = pages;
  }
}

@Component
struct ReaderComp {
  @Prop title: string;
  @Prop readIt: boolean;

  build() {
    Row() {
      Text(this.title)
      Text(`... ${this.readIt ? 'I have read' : 'I have not read it'}`)
        .onClick(() => this.readIt = true)
    }
  }
}

        如果图书馆有一本图书和两位用户,每位用户都可以将图书标记为已读,此标记行为不会影响其它读者用户。从代码角度讲,对@Prop图书对象的本地更改不会同步给图书馆组件中的@State图书对象。

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

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

相关文章

Arma3/武装突袭3东风战役最后一关游戏无法保存的解决办法

Arma3这个游戏玩进去还是非常有可玩性的,可是在玩过了它本体自带的东风系列战役后,在最精髓的最后一关——game over这个关卡,却有个非常头疼的问题。 逃跑其实是非常简单的,但是想要无伤环游全岛确十分困难,因为这关卡…

Lazada商品详情API在电商中的价值及实时数据获取实践

一、引言 在电商行业,数据是驱动业务增长的关键。Lazada作为东南亚地区知名的电商平台,其商品详情API对于电商行业具有深远的影响。本文将探讨Lazada商品详情API在电商行业中的重要性,并介绍如何实现实时数据获取。 二、Lazada商品详情API的…

秋招总结_就业

2020秋招总结 【前言】 以下内容是写给研二学弟学妹们的秋招总结,研一的师弟师妹们如有需要,也可看看。先说一下我为什么要写这个总结: 1、时代在变化,社会在发展,一届有必要给下一届讲一些经验。 2、我平时和你们…

强大矢量图编辑器 Boxy SVG 激活最新

Boxy SVG for Mac功能介绍 1、干净,直观的UI深受Inkscape,Sketch和Adobe illustrator的启发 2、广泛支持画布上编辑对象几何,转换,绘画和其他属性 3、保存为SVG和SVGZ格式,导出为PNG,JPG,WebP和…

第二证券:耐心等待指数企稳 关注数据要素等板块

其时或是布局商场的时间窗口。2024年美联储或打开降息周期,欧洲降息预期也在增强,全球流动性有望迎来拐点。中心经济工作提及2024年的职业及工业方向,政策有望落地施行,将会为职业配备带来较多的催化要素,是具备配备价…

RTLS 解决现实场景的25种问题

实时定位系统 (RTLS) 可以改变我们理解周围世界的方式。 想想你有多少次停下来寻找某样东西。您可能正在寻找钥匙、电话、鞋子、零食、背包、办公室中的重要文件、停车场中的车辆,或者可能正在寻找街道标志或地标来引导自己。我们大多数人每天都会希望更好地了解我…

【参天引擎】华为参天引擎内核架构源码架构,多线程服务,数据节点管理,多节点间元数据管理

cantian引擎源码结构 ​专栏内容: 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点…

分享一个好看的vs主题

最近发现了一个很好看的vs主题(个人认为挺好看的),想要分享给大家。 主题的名字叫NightOwl,和vscode的主题颜色挺像的。操作方法也十分简单,首先我们先在最上面哪一行找到扩展。 然后点击管理扩展,再搜索栏…

北京冬雪中:邂逅那台加洛韦绿的路特斯Eletre

文|张 坤 北京的冬天时而让人情感交织:虽然雪后银装素裹,能够完美勾勒出城市寒素清澈的美景,映衬出红墙石砖的雄伟壮丽。但在深冬的寒风萧瑟中,也迫使人们紧裹衣衫,赏景之路亦多了几分艰辛。 在北京“…

9.鸿蒙app用户界面的跳转abilityslice的跳转

9.用户界面的跳转abilityslice的跳转,值传递,数值累加 首页页面显示1,第2页显示2,再次点击返回首页3。。。 MainAbilitySlice.java 关键代码: 点击事件 text.setClickedListener(new Component.ClickedListener() …

芯片高科技制造业如何实现高效且安全的文件数据传输

随着工业4.0的快速发展,制造行业作为一个长产业链且高度集中复杂的领域,数据与信息传输管理变得尤为重要,成为提高生产效率的关键因素。从研发、设计、采购、生产、库存、销售到售后等各个环节,整个业务流程都需要高效传递信息&am…

五年一贯专转本这么管用的记忆法你用了吗?

在枯燥无聊的学习当中,能有好的学习记忆方式就能事半功倍,但是怎样的学习记忆方式才适合我们呢?那我今天就给大家介绍一下吧,如果觉得好用,可以试试,让我们在之后的转本考试当中能有个好成绩!zb…

Vue2 即将结束支持!!!

Vue2 Vue 2.0 发布于 2016 年,已经有超过 7 年的历史,它是 Vue 框架成为主流的重要里程碑。许多当前的 Vue 用户都是在 Vue 2 时期就开始使用 Vue 的,并且有许多出色的项目是基于 Vue 2 构建的。 Vue2将弃用 随着 2024 年的临近&#xff0…

【DOM笔记二】操作元素(修改元素内容,修改常见元素/表单元素/元素样式属性,排他思想,自定义属性操作,应用案例!)

文章目录 4 操作元素4.1 修改元素的内容4.2 修改常见元素的属性案例:分时问候 4.3 修改表单元素属性案例:登录时隐藏/显示密码 4.4 修改元素样式属性4.4.1 行内样式操作 element.style案例1:关闭二维码广告案例2:遍历精灵图案例3&…

php自定义请求工具(请求频次+动态参数)

在项目开发中,前后端进行接口对接时,一定离不开接口测试。所以这个时候就很需要一些第三方api接口测试工具了。比如postman,apifox之类的。lz有事闲暇之余也会做点小项目,不可避免的会用到测试接口工具之类的。在进行测试时突发奇…

JS加密/解密之JSX解密解析(photoshop插件)

简介 Adobe Photoshop 插件通常使用 JSX(JavaScript XML)脚本语言。这是一种基于JavaScript的扩展,专门设计用于处理Adobe Creative Suite(包括Photoshop)的任务。JSX脚本允许开发者编写自定义脚本以扩展和增强Photos…

VueStu02-创建一个Vue实例

一、核心步骤 1.准备容器 准备一个盒子div。 2.引包 从官网引包,有开发版本和生产版本之分。 3.创建Vue实例 创建一个Vue实例,new Vue()。 4.指定配置项 指定配置项,用于渲染数据 。 el:指定挂载点。知道自己将来要管理的是…

springboot解决XSS存储型漏洞

springboot解决XSS存储型漏洞 XSS攻击 XSS 攻击:跨站脚本攻击(Cross Site Scripting),为不和 前端层叠样式表(Cascading Style Sheets)CSS 混淆,故将跨站脚本攻击缩写为 XSS。 XSS(跨站脚本攻击):是指恶意攻击者往 Web 页面里插…

科研成果 | 数说故事联合中大HCP实验室共创「大模型」领域论文,获国际AI学术顶会AAAI收录

日前,中国计算机学会(CCF)推荐的A类国际学术会议AAAI人工智能大会 2024论文接收结果公布。中山大学HCP实验室和数说故事研究员合著的论文《Adaptive Prompt Routing for Arbitrary Text Style Transfer with Pre-trained Language Models》成…

解决虚拟机报错:当前硬件版本不支持设备“nvme”。

报错内容如下图所示: 当前硬件版本不支持设备“nvme”。 未能启动虚拟机。 我们首先在帮助里面查看VMware的版本 我这里是16 打开报错的虚拟机文件夹,找到镜像文件(.vmx文件) 使用记事本(文本编辑器)打开…
最新文章