当前位置: 首页 > news >正文

前端开发转鸿蒙开发1-父子组件传值差异

1. 页面结构与多组件写法

  • 一个.ets文件里可以写多个组件:一个@Entry页面组件 + 若干普通子组件。
  • @Entry有且只能有一个,表示页面入口。
  • 子组件只加@Component,不加@Entry

2. 响应式状态:@State

  • 作用:数据改变 → 页面自动刷新(对应 Vue 的ref)。

  • 用法:

    @State cartCount: number = 0
  • 修改变量必须用this.xxx,否则报错。

3. 父子组件传值(今天最重点)

① 传基础类型(string /number/boolean)

  • @Prop
  • 最简单、最安全,不会报错

② 传对象 / 复杂数据

  • 必须用:@Observed类 +@ObjectLink

    1. 先定义被观察类:

      @Observed class ProductItem { name: string; price: number; image: string constructor(name: string, price: number, image: string) { this.name = name; this.price = price; this.image = image } }
    2. 父组件用new ProductItem()创建实例

    3. 子组件用@ObjectLink product: ProductItem接收

③ 传函数 / 回调事件

  • 直接写函数名,不需要任何装饰器

    onAddToCart: () => void

4. 点击事件

  • 语法:.onClick(() => { })
  • 对应 Vue 的@click,逻辑完全一样。

5. 布局与样式回顾

  • Column():垂直布局(默认从上到下)
  • Row():水平布局(默认从左到右)
  • Blank():自动撑开空白(实现左右对齐)
  • 阴影:.shadow({ radius, color, offsetX, offsetY })

6. 鸿蒙 ↔ Vue 关键区别(必记)

  1. Vue 可以直接props传对象,鸿蒙不行
  2. Vue 不用写this.,鸿蒙必须写
  3. Vue 构造函数可写键值对,TS / 鸿蒙只能按顺序传参
  4. 鸿蒙对象传参强制要求@Observed+@ObjectLink

7. 今天遇到的经典报错避坑

  1. @Prop 不支持对象→ 对象改用@ObjectLink
  2. @ObjectLink 必须搭配 @Observed 类→ 把对象包成 class
  3. Cannot find name 'name'→ 少写了this.
  4. new 构造函数不能写 key:value→ 直接按顺序传参

示例代码

@Observed class ProductItem { name: string; price: number; image: string constructor(name: string, price: number, image: string) { this.name = name; this.price = price; this.image = image } } @Component struct ProductCard { @ObjectLink product: ProductItem onAddToCart: () => void build() { Column() { Image(this.product.image) .width(200) .height(200) .objectFit(ImageFit.Contain) .margin({ bottom: 15 }) Text(this.product.name) .fontSize(20) .fontWeight(FontWeight.Medium) .margin({ bottom: 10 }) Text(`¥${this.product.price}`) .fontSize(24) .fontColor('#ff6600') .fontWeight(FontWeight.Bold) Button('加入购物车') .width('100%') .height(45) .onClick(() => { this.onAddToCart() }) } .width('90%') .padding(20) .backgroundColor('#fff') .borderRadius(16) .shadow({ color: '#ddd', radius: 8, offsetX: 2, offsetY: 2 }) } } @Entry @Component struct IndexDemo { @State cartCount: number = 0 @State product: ProductItem = new ProductItem( "鸿蒙开发学习", 100, "https://res2.vmallres.com/pimages/uomcdn/CN/pms/202403/gbom/6942103109560/428_428_9D3B788CDF5A83F6820BCA9411A6899Dmp.png" ) build() { Column() { Row() { Text("极简购物商城") .fontSize(24) .fontWeight(FontWeight.Bold) Blank() Text(`购物车:${this.cartCount}`) .fontSize(18) .fontColor('#ff6600') } .width('100%') .padding({ left: 20, right: 20, top: 20, bottom: 20 }) ProductCard({ product: this.product, onAddToCart: () => { this.cartCount++ } }) .margin({ top: 20 }) } .width("100%") .height("100%") .backgroundColor("#f2f3f5") } } export default IndexDemo
http://www.jsqmd.com/news/622099/

相关文章:

  • 如何从SQL中提取年份或月份:EXTRACT与日期函数用法
  • L293D直流电机控制库GBALib_DCMotor详解
  • 从GPT-3到Stable Diffusion:拆解InstructPix2Pix图像编辑的底层技术链
  • 录音一小时整理几分钟这款工具太适合上课用
  • 写了 42 年的程序,我会被 AI 取代吗?
  • Clawdbot管理平台教程:5步搞定Qwen3:32B代理部署
  • git 两个仓库之间代码合并、更新
  • Agent 属于个人,治理属于企业:新一代人机协同的底层逻辑
  • 别再只盯着fMRI了!用fNIRS做脑科学实验,从设备选型到数据处理的全流程避坑指南
  • Pixel Dream Workshop 效果进阶:利用STM32嵌入式系统打造实体AI艺术装置
  • 7、说说Loader和Plugin的区别?编写Loader,Plugin的思路?
  • Java入门必学:类与对象初步认识
  • 如何高效聚合多维度统计报表:单查询替代30次SELECT的实战方案
  • Qwen3.5-4B-Claude-Opus入门指南:从模型名称解读其Claude风格推理定位
  • Neeshck-Z-lmage_LYX_v2精彩案例分享:电影级光影中文提示词生成高清作品
  • 别再为测试发愁!用KEPServerEX 6.4快速搭建一个OPC UA模拟服务器(附详细配置截图)
  • DeepAnalyze在供应链管理中的预测分析应用
  • 2026绵阳起重设备安装维保厂家名录:合规与服务能力对比 - 优质品牌商家
  • 天融信防火墙双机热备-备防火墙替换 NGFW4000G-UF(TG-56008-YL)
  • 通义千问3-VL-Reranker-8B多模态应用:工业质检报告-缺陷图-维修视频关联分析
  • 告别手动填数据!用TSMaster的Panel和C小程序做个CAN报文发送器(附完整源码)
  • HunyuanVideo-Foley效果展示:RTX4090D优化版生成的城市街道音效实测
  • 2026建材硬核复盘:得时宝云石胶“全域适应性”基准测试与性能分析
  • Chandra OCR实战案例:扫描文档转Markdown,保留表格公式原格式
  • Llama-3.2-3B多语言能力实测:西班牙语/法语/日语问答效果展示
  • Shell批量操作实战(服务器集群、多文件处理)
  • Pixel Script Temple 性能对比展示:不同参数下的生成速度与质量
  • cv_resnet18_ocr-detection从部署到实战:电商商品图文字提取
  • 为Linux打包.NET应用,VS2019卡在NuGet源?一份保姆级的网络环境排查清单
  • 【码动四季】科研绘图不再难!LabPlot 高效科研制图实战指南