ArkTS 状态管理@Prop、@Link

2023-12-19

当父子组件之间需要数据同步的时候,可以使用@Prop和@Link装饰器。

实现的案例之中,代码时平铺直叙的,阅读性可理解性比较差。我们应改遵循组件化开发的思想。

在我们使用组件开发的时候,遇到数据同步问题的时候,@State状态是解决不了的。所以就要用到@Prop和@Link

我们可以将任务进度卡片封装为一个组件、将任务按钮和卡片列表封装为另外一个组件,来实现组件化的目的。

任务进度卡片封装

我们先用@State尝试着封装任务进度卡片组件,然后再入口函数中使用。

@Component
struct TaskStatistics {
  @State finishTask: number = 0
  @State totalTask: number = 0
  build(){
    Row(){
      Text("任务进度")
        .fontSize(30)
        .fontWeight(FontWeight.Bold)
      Stack(){
        Progress({
          value:this.finishTask,
          total:this.totalTask,
          type:ProgressType.Ring
        })
          .width(100)
        Row(){
          Text(this.finishTask.toString())
            .fontSize(24)
            .fontColor('#36d')
          Text(' / ' +this.totalTask.toString())
            .fontSize(24)
        }
      }
    }
    .card()
    .margin({top:20,bottom:10})
    .justifyContent(FlexAlign.SpaceEvenly)
  }
}

这样一来  PropPage组件就是父组件、TaskStatistics就是子组件。

其中的任务数量是由PropPage来维护的。所以我们需要从父亲向子传递数量属性,这时候我们会发现报错了,提示@State不支持之类的。

这说明再父子传值的时候,@State状态已经不支持了。我们这个时候可以使用Prop和Link两个装时期。

Prop和Link装饰器

@Prop @Link
同步类型 单向同步 双向同步
允许装饰的变量类型

1.@Prop只支持string、number、boolean、enum类型

2.父组件对象类型、子组件对象属性

3.不可以是数组、any

1.父子类型一致:string、number、boolean、enum、object、class,以及他们的数组

2.数组中元素增、删、替换会引起刷新

3.嵌套类型以及数组中的对象属性无法触发视图更新。

初始化方式 不允许子组件初始化 父组件传递,禁止子组件初始化

@Prop是单向同步,父组件的改变会立即传递给子组件,但是子组件的修改不会影响父组件,他传递的是拷贝的值。

@LInk是双向同步,传递的是变量的引用,父亲和儿子使用的是一个变量,所以两方都会感知到变量的改变。

任务列表的封装

在封装任务列表的时候,要注意一些问题,比如说build函数下不能放入多个顶层,所以我们加一个Column容器,我们将按钮函数也加入。因为任务列表同任务进度是同步更新数据的,这里我们使用Link状态来完成。

@Component
struct TaskList {
  // 任务数量
  @State tasks: Task[] = []
  // 完成任务列表
  @Link finishTask: number
  // 所有的任务列表
  @Link totalTask: number
  // 通过过滤方法 更新已完成的任务数量
  handleTaskChange(){
    // 更新任务总数量
    this.totalTask = this.tasks.length
    // 已经完成的任务数量
    this.finishTask = this.tasks.filter(item => item.finished).length
  }
  build(){
      Column(){
        // 2.新增任务按钮
        Button('新增任务')
          .width(200)
          .onClick(()=>{
            // 1.新增任务
            this.tasks.push(new Task())
            // 2.更新任务数组
            this.totalTask = this.tasks.length
          })
        // 3.卡片列表
        List({space:10}){
          ForEach(
            this.tasks,
            (item: Task,index)=>{
              ListItem(){
                Row(){
                  Text(item.name)
                    .fontSize(20)
                  Checkbox()
                    .select(item.finished)
                    .onChange(val=>{
                      item.finished = val
                      // 通过过滤方法 更新已完成的任务数量
                      this.handleTaskChange()
                    })
                }
                .card()
                .justifyContent(FlexAlign.SpaceBetween)
              }
              .swipeAction({end:this.DeleteButton(index)})
            }
          )
        }
        .width('100%')
        .layoutWeight(1)
        .alignListItem(ListItemAlign.Center)
      }
  }
  @Builder DeleteButton(index: number){
    Button("删除")
      .onClick(()=>{
        this.tasks.splice(index,1)
        this.handleTaskChange()
      })
  }

  }

我们在使用Link的时候,父类里面穿参数,需要使用$语法。

我们会发现效果与我们最开始的效果是一样一样的。

验证数据类型

我们来验证一下@Prop和@Link的数据类型

我们来验证是否支持对象属性

1.创建一个统计信息的类

// 任务统计信息
class StaticInfo{
  totalTask: number = 0
  finishTask: number = 0
}

父组件中直接实例化 传值直接传入属性

2.子组件使用对象属性

我们在组件中使用对象属性来完成

struct TaskList {
  // 任务数量
  @State tasks: Task[] = []
  @Link stat: StaticInfo
  // 通过过滤方法 更新已完成的任务数量
  handleTaskChange(){
    // 更新任务总数量
    this.stat.totalTask = this.tasks.length
    // 已经完成的任务数量
    this.stat.finishTask = this.tasks.filter(item => item.finished).length
  }

@Provide和@Consume装饰器

@Provide和@Consume可以跨组件提供类似@State和@Link的双向同步功能。

@Provide和@Consume内部就能传递信息,不需要手写传递。

如何使用

我们可以直接使用provide和consume,参数就不需要传递了,内部帮忙维护,代价是资源的损耗。所以我们在使用的时候优先考虑@State和@Link状态,遇到跨组件的时候,在使用@Provide和@Consume。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ArkTS 状态管理@Prop、@Link 的相关文章

随机推荐

  • CCF编程能力等级认证GESP—C++5级—样题1

    CCF编程能力等级认证GESP C 1级 样题1 单选题 每题 2 分 共 30 分 判断题 每题 2 分 共 20 分 编程题 每题 25 分 共 50 分 小杨的锻炼 小杨的队列 参考答案 单选题
  • 【网络安全】—Shell编程入门(1)

    Shell编程入门 Shell 是 Unix Linux 操作系统下的一种命令行解释器 它接收用户输入的命令然后调用相应的程序 我们可以通过 Shell 脚本来自动执行一系列的命令 接下来 我们将详细介绍 Shell 编程的基本概念和技能
  • 新入门IT行业想学编程?你可以选Python!

    最近有不少新入门IT行业的同学问小编 Python是什么 所以 小编给大家准备好了一份Python学习攻略 我们一起来看一下吧 01 Python是什么 Python由荷兰数学和计算机科学研究学会的Guido van Rossum 于199
  • uniapp H5项目使用ucharts的Echart组件方式创建圆环

    问题 没有报错但是图表不出来 调试了半天圆环图表没有不出来 是因为没有明示设置宽度与高度 请根据实际需求修改父元素尺寸 组件自动识别宽高 charts box width 100 height 300px 最终效果 先导入ucharts到项
  • 软件测试/测试开发/人工智能/测试管理圆桌讨论会 | 解锁测试管理的核心问题,提升您的管理实力!

    人工智能的出现 对我们的测试行业有哪些明显的影响呢 我们又应该如何应对 如何更好地拥抱人工智能呢 如何打造积极向上 主动 执行力强 不推诿 不甩锅 服从安排 和谐 互帮互助的团队 如何有效的追踪团队的测试效率 后续对测试时间 质量等评估做支
  • 2023年12月中国数据库排行榜:人大金仓跻身前五,南大通用、中兴热度再升

    破冰行舟蓄势起 壮志猛发破浪飞 2023年12月的 墨天轮中国数据库流行度排行 火热出炉 本月共有288个数据库参与排名 本月排行榜前十名有所变动 人大金仓冲入前五开新局 南大通用 中兴通讯排名上升占优势 墨天轮十强名次归属再迎变动 本月排
  • 测试编排效率提升:掌握前置接口响应数据的引用方法

    宁波银行深圳分行综合柜员面经 三方寄过去了 告诉我停止24届招聘 全部毁约 牛的 he芯 毁约应届生 34316 地产投资岗上岸啦 经验分享 江西农发行市级支行信贷岗面试 最终还是搏了一把 2023届CV视觉算法岗求职记录贴 规划指南 实习
  • 浅谈专项测试之弱网络测试

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • unittest自动化测试断言方法的介绍

    断言如同在测试用例上 类似于预期结果与实际结果是否一致 如果一致则表示测试通过 Assert断言 很好的用于测试结果判断上 更灵活的对预期结果和实际结果进行对比 下面简单的介绍一下unittest的Assert断言 unittest中基础的
  • 干货:教你如何在JMeter中调用Python代码N种方法!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • AI绘画生成器让你秒变画神,输入文字就能生成精美图片的AI绘画功能,AI绘画软件推荐

    在当今这个数字化时代 图片编辑已经成为我们日常生活和工作中的一项重要任务 无论是社交媒体上的个人展示 还是商业广告中的产品推广 精美的图片总能吸引更多的关注和赞誉 为了满足广大用户对图片编辑的需求 我们推出了一款全新的软件 首助编辑高手 1
  • CCF编程能力等级认证GESP—C++4级—20230923

    CCF编程能力等级认证GESP C 4级 20230923 单选题 每题 2 分 共 30 分 判断题 每题 2 分 共 20 分 编程题 每题 25 分 共 50 分 进制转换 变长编码 答案及解析 单选题
  • 数据结构学习笔记(七)搜索结构

    文章目录 1 前言 2 概念 3 静态搜索结构 3 1 静态搜索表 3 2 顺序搜索表 3 2 1 基于有序顺序表和顺序搜索和折半搜索 4 二叉搜索树
  • 吴恩达机器学习笔记八 正则化

    使第一项均方差较小来符合数据 使第二项正则化项较小来使 w 较小 0 采用高阶多项式会过拟合 非常大 则每个 w 都很小 F X 约为 b 结果为一条直线 欠拟合 含正则化线性回归的梯度下降 含正则化逻辑回归的梯度下降 到这里第一个专项课程
  • Lazada商品详情API在电商中的价值及实时数据获取实践

    一 引言 在电商行业 数据是驱动业务增长的关键 Lazada作为东南亚地区知名的电商平台 其商品详情API对于电商行业具有深远的影响 本文将探讨Lazada商品详情API在电商行业中的重要性 并介绍如何实现实时数据获取 二 Lazada商品
  • sourcetree 无效的源路径 细节提示:系统找不到指定的文件

    工具 gt 选项 gt git 直接下拉到底 点击红框 重新下载一个内嵌git就可以了 我感觉是因为改变了原有git安装路径的问题
  • 基于ssm的校园闲置物品交易平台

    收藏关注不迷路 源码文章末 文章目录 前言 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 前言 互联网日益成熟 走进千家万户 改变多个行业传统的工作方式 校园闲置物品交易管理以校园闲置物品交易和用户需求为
  • 如何编写产品需求文档(PRD)?「附模板」

    在数字化时代的快速变革中 产品开发不再是一个单向的 线性的过程 它涉及多方面的互动 多维度的考量 以及多个利益相关者的参与 那么 如何确保每个人都对产品的最终形态有一个清晰 一致的理解 如何确保每个人都在为同一个目标努力 产品需求文档就在产
  • Python爬坑指北:大神不会告诉你的优化小技巧

    Python是一种优美的编程语言 简洁 易读 非常适合快速原型设计 然而 随着代码库的增长 性能问题的风险也在增加 低效的Python代码可能会令人沮丧地缓慢 而且通常很难找到瓶颈所在 但是不用担心 在这篇文章中 我们将探讨一些优化Pyth
  • ArkTS 状态管理@Prop、@Link

    当父子组件之间需要数据同步的时候 可以使用 Prop和 Link装饰器 实现的案例之中 代码时平铺直叙的 阅读性可理解性比较差 我们应改遵循组件化开发的思想 在我们使用组件开发的时候 遇到数据同步问题的时候 State状态是解决不了的 所以