鸿蒙列表,item组件封装传参问题?@ObjectLink 和@Observerd

news2025/2/5 23:02:20

鸿蒙列表渲染,封装内容组件,进行item传参会报错?


class FoodClass {
  order_id: number = 0
  food_name:  string = ""
  food_price: number = 0
  food_count: number = 0
}

@Entry
@Component
struct Demo07 {
  @State message: string = 'Hello World'
  @State cartList: FoodClass[] = [{
    order_id: 1,
    food_name: '鱼香肉丝',
    food_price: 18.8,
    food_count: 1
  },{
    order_id: 2,
    food_name: '粗溜丸子',
    food_price: 26,
    food_count: 2
  },{
    order_id: 3,
    food_name: '杂粮煎饼',
    food_price: 12,
    food_count: 1
  }]
  build() {
    Row() {
      Column({space:20}) {
        ForEach(this.cartList,(item:FoodClass)=>{
          FoodItem({ item: $item })
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}


@Component
struct FoodItem {
  @link item:FoodClass
  build() {
    Row(){
      Text(this.item.food_name)
      Text(`价格:${this.item.food_price}`)
      Text(`数量:${this.item.food_count}`)
    }.width('100%').justifyContent(FlexAlign.SpaceAround)
  }
}

报错:在这里插入图片描述
ArtTS不支持这么做,也就是Link修饰的数据必须得是最外层的 State数据,想要实现我们刚刚的设想,我们还得另辟蹊径。-后续ObjectLink 和Observerd会解决这个问题

解决方案:需要使用arkts官方提供的@ObjectLink 和@Observerd 以及 next版本规范的定义对象的interface解决
当然,如果只是对item内容进行纯ui渲染, 可以不使用装饰器修饰,直接进行数据传递和接受渲染即可

import { goodsModel } from './Demo05'
@Entry
@Component
struct Demo07 {
  @State message: string = 'Hello World'
  @State cartList: FoodClass[] = [new FoodClassModel({
    order_id: 1,
    food_name: '鱼香肉丝',
    food_price: 18.8,
    food_count: 1
  }), new FoodClassModel({
    order_id: 2,
    food_name: '粗溜丸子',
    food_price: 26,
    food_count: 2
  }), new FoodClassModel({
    order_id: 3,
    food_name: '杂粮煎饼',
    food_price: 12,
    food_count: 1
  })]

  show(){
    return this.cartList.reduce((n,m)=>{
      return n+m.food_count
    },0)
  }

  build() {
    Row() {
      Column({ space: 20 }) {
        ForEach(this.cartList, (item: FoodClassModel) => {
          FoodItem({ item:item,carList:$cartList })
        })

        Text(this.show()+'')
      }
      .width('100%')
    }
    .height('100%')
  }
}


@Component
struct FoodItem {
  @ObjectLink item: FoodClassModel
  @Link carList:FoodClassModel[]
  build() {
    Row() {
      Text(this.item.food_name)
      Text(`价格:${this.item.food_price}`)
      Text(`数量:${this.item.food_count}`).onClick(()=>{
        this.carList = this.carList.map((aa:FoodClassModel)=>{
          if(aa.order_id===this.item.order_id){
             aa.food_count++
          }
          return aa
        })
      })
    }.width('100%').justifyContent(FlexAlign.SpaceAround)
  }
}


interface FoodClass {
  order_id: number
  food_name: string
  food_price: number
  food_count: number
}

@Observed
export class FoodClassModel implements FoodClass {
  order_id: number = 0
  food_name: string = ''
  food_price: number = 0
  food_count: number = 0

  constructor(model: FoodClass) {
    this.order_id = model.order_id
    this.food_name = model.food_name
    this.food_price = model.food_price
    this.food_count = model.food_count
  }
}

案例中:父组件的总和,是需要再传一个list数据进去,在子组件中使用@link 进行数据双向更新,才能实现ui试图更新的,因为鸿蒙数据只支持单层数据响应式更新。

鸿蒙-传智播客-博学谷

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

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

相关文章

C练习——不创建临时变量,交换两个数值

面试可能会问 方法一&#xff08;有缺陷&#xff0c;int 型数值有上限&#xff0c;ab可能超范围&#xff09; // int 型数值有上限&#xff0c;ab可能超范围 #include <stdio.h> int main() {int a 2;int b 3;printf("交换前&#xff1a;%d %d\n", a, b);a…

SpringBoot整合JWT+Spring Security+Redis实现登录拦截(一)登录认证

一、JWT简介 JWT 全称 JSON Web Token&#xff0c;JWT 主要用于用户登录鉴权&#xff0c;当用户登录之后&#xff0c;返回给前端一个Token&#xff0c;之后用户利用Token进行信息交互。 除了JWT认证之外&#xff0c;比较传统的还有Session认证&#xff0c;如何选择可以查看之前…

基于单片机的语音识别自动避障小车(论文+源码)

1.系统设计 此次基于单片机的语音识别自动避障小车&#xff0c;以STC89C52单片机作为系统的主控制器&#xff0c;利用超声波模块来实现小车与障碍物距离的测量并通过LCD液晶显示&#xff0c;当距离低于阈值时会通过WT588语音模块进行报警提示&#xff0c;并且小车会后退来躲避…

知识付费saas租户平台的核心功能设计:打造高效、个性化的学习体验

在在当今数字化时代&#xff0c;知识付费市场正在迅速崛起&#xff0c;而私域流量的概念也日益受到重视。私域流量指的是企业通过自有渠道获取的、能够自由支配的流量&#xff0c;这种流量具有更高的用户粘性和转化率。因此&#xff0c;打造一个基于私域流量的知识付费小程序平…

【C++】并发:异步操作

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍并发&#xff1a;异步操作。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不…

Astro无人车发布,颜值与功能兼修

介绍 Astro是云讷科技&#xff08;深圳&#xff09;有限公司推出的一款高度智能化和轻量化的小型无人车&#xff0c;其外观基于Tesla Cybertruck 1:10比例还原&#xff0c;支持ROS机器人软件系统开发和视觉SLAM、激光SLAM、路径规划、深度学习等应用。 在线文档&#xff1a; h…

【Unity6.0+AI】Sentis加载模型识别手写数字案例实现

按照国际惯例,看效果: 素材准备: 自己在PS中绘制黑底白字手写字体,导出jpg,尺寸28*28! 素材设置 基本步骤 准备工作:从 ONNX Model Zoo 下载手写识别 ONNX 模型文件 【下载模型】MNIST 手写数字识别模型 mnist-12.onnx,并将其拖入项目窗口的 Assets 文件夹。 【下载模…

亿赛通电子文档安全管理系统 user JNDI远程命令执行

产品简介 亿赛通电子文档安全管理系统&#xff0c;&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资…

Dbeaver如何连接Oceanbase?

Dbeaver & Oceanbase 一、新增驱动二、连接数据库 一、新增驱动 1、新建驱动 点击数据库 -> 驱动管理器 -> 新建 2、设置驱动 驱动名称可随意填写注意驱动类型要是Generichost:port填写实际的host和port 库中新增下载的oceanbase驱动jar包 二、连接数据库 1、找…

RK3568驱动指南|第八篇 设备树插件-第83章 设备树插件驱动分析实验

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

JAVA web面试大全(全)

摘自&#xff1a; Java技术栈 公众号 一、JVM篇 &#xff08;含&#xff1a;JVM类加载机制&#xff0c;JVM内存模型&#xff0c;垃圾收集机制&#xff0c;类字节码实现机制&#xff0c;JVM调优案例&#xff0c;GC日志详解等&#xff09; 二、Java并发编程 &#xff08;含&am…

微信小程序---API的promise化

1.实现API promise化 npm install --save miniprogram-api-promise1.0.4 2.构建miniprogram_npm&#xff0c;先把miniprogram_npm删除&#xff0c;再点击工具->构建npm 3. 4.页面使用 async getInfo(){const {data:res} await wx.p.request({method:GET,url:https://ap…

项目管理及系统规划

一、项目管理 1.软件工程基本概念 1.1 软件 &#xff08;1&#xff09;什么是软件&#xff1f; 软件一般认为由三部分组成&#xff1a; • 程序&#xff1a;在运行时&#xff0c;能提供所希望的功能和性能的指令集。 • 数据结构&#xff1a;使程序能够正确运行的数据结构 …

少走十年弯路!!!webpack详解

webpack是什么&#xff1f;&#xff1f; 本质上&#xff0c;webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时&#xff0c;它会在内部从一个或多个入口点构建一个 依赖图(dependency graph)&#xff0c;然后将你项目中所需的每一个模…

【问题系列】同时管理多版本node方案

目录 一、问题描述 二、解决方案 三、详细步骤 3.1 安装NVM&#xff1a; 3.2 运行NVM 3.3 安装Node.js 3.4 切换Node.js版本 3.5 验证安装&#xff1a; 四、拓展 4.1 设置默认 Node.js 版本 4.2 列出已安装的 Node.js 版本 4.3 其他命令介绍 一、问题描述 需要运行…

java:4-7运算符优先级

运算符优先级 运算符有不同的优先级&#xff0c;所谓优先级就是表达式运算中的运算顺序。如右表&#xff0c;上一行运算符总优先于下一行。只有单目运算符&#xff08;第二行&#xff09;、赋值运算符&#xff08;倒数3行&#xff09;是从右向左运算的。一览表, 不要背&#x…

Fiddler抓包,怎么抓抓得好抓得快?

01.什么是 Fiddler? Fiddler 是一个 HTTP 协议调试代理工具&#xff0c;它能够记录并检查所有你的电脑和互联网之间的 HTTP 通讯。Fiddler 提供了电脑端、移动端的抓包、包括 http 协议和 https 协议都可以捕获到报文并进行分析&#xff1b;可以设置断点调试、截取报文进行请…

智慧导游带你“一部手机游景区”——VR版

不知不觉中&#xff0c;元旦小假期快要来了&#xff0c;既然期待了这么久&#xff0c;那肯定不能让假期就这样平淡的“溜走”&#xff0c;各大景区的攻略你都做好了吗&#xff1f;是不是翻遍网上各式各样的图文攻略&#xff0c;依旧感觉没有做到位呢&#xff1f;你可能需要一个…

echarts生成地图(自定义区域色块,自定义图标样式,自定义移入效果)

一、使用echarts生成一个地图,看一下生成效果图 二、使用步骤 1.先准备需要的数据 DataV.GeoAtlas地理小工具系列 可以去这个网站下载需要的json数据,也可在线引入,但是发布到线上有问题,所以我这边是直接把数据下载到本地使用。 把下载好的数据放入到public里面 在api写入一…