鸿蒙 ArkTS 实战|用卡片组件重构化合反应学习
·


一、设计思路
化合反应"多变一"的知识点结构化程度高,非常适合 ArkTS 的数据驱动 + 组件化开发。我们把每个方程式建模为 interface,用 @Prop 属性传递、ForEach 批量渲染成统一卡片,四个反应类型页面复用同一个 EquationCard 组件。
二、数据模型(Equation 接口)
// 化合反应数据模型
interface Equation {
equation: string; // 化学方程式
condition: string; // 反应条件:点燃 / 加热 / 常温
phenomenon: string; // 实验现象
note: string; // 易错点 / 考点备注
}
三、公共卡片组件(EquationCard.ets)
/**
* 化学方程式展示卡片(公共组件)
* 化合 / 分解 / 置换 / 复分解四个页面复用
*/
@Component
export struct EquationCard {
@Prop equation: string = '';
@Prop condition: string = '';
@Prop phenomenon: string = '';
@Prop note: string = '';
@Prop accentColor: string = '#4C7DFF';
build() {
Column({ space: 10 }) {
// 方程式主体
Text(this.equation)
.fontSize(17)
.fontWeight(FontWeight.Bold)
.fontColor('#111827')
.width('100%')
.textAlign(TextAlign.Center)
.lineHeight(26)
// 反应条件标签(空则不显示)
if (this.condition.length > 0) {
Text(this.condition)
.fontSize(12)
.fontColor(this.accentColor)
.backgroundColor(this.accentColor + '1A')
.padding({ left: 12, right: 12, top: 3, bottom: 3 })
.borderRadius(10)
.margin({ top: 2 })
}
Divider().color('#EEF2F7').strokeWidth(1).margin({ top: 4, bottom: 4 })
// 实验现象
if (this.phenomenon.length > 0) {
Row({ space: 6 }) {
Text('🎯').fontSize(14)
Text(this.phenomenon)
.fontSize(13).fontColor('#4B5563')
.layoutWeight(1).lineHeight(20)
}.width('100%').alignItems(VerticalAlign.Top)
}
// 备注
if (this.note.length > 0) {
Row({ space: 6 }) {
Text('💡').fontSize(14)
Text(this.note)
.fontSize(13).fontColor('#6B7280')
.layoutWeight(1).lineHeight(20)
}.width('100%').alignItems(VerticalAlign.Top)
}
}
.width('100%')
.padding(16)
.borderRadius(16)
.backgroundColor(Color.White)
.border({ width: 1, color: '#E5EAF2' })
}
}
四、化合反应页面(CombinationReaction.ets)
import { router } from '@kit.ArkUI';
import { EquationCard } from '../common/EquationCard';
/**
* 化合反应学习页(多变一)通式:A + B → AB
*/
@Entry
@Component
struct CombinationReaction {
private themeColor: string = '#4C7DFF';
private equations: Equation[] = [
{ equation: '2Mg + O₂ → 2MgO', condition: '点燃',
phenomenon: '发出耀眼白光,放出大量热',
note: '生成白色固体氧化镁,镁带燃烧是中考常考点' },
{ equation: '4P + 5O₂ → 2P₂O₅', condition: '点燃',
phenomenon: '产生大量白烟,放出热量',
note: '红磷燃烧可用于测定空气中氧气含量' },
{ equation: '3Fe + 2O₂ → Fe₃O₄', condition: '点燃',
phenomenon: '剧烈燃烧,火星四射,放热',
note: '集气瓶底放少量水或细沙,防止高温熔落物炸裂瓶底' },
{ equation: 'C + O₂ → CO₂', condition: '点燃',
phenomenon: '发出白光,放热',
note: '生成能使澄清石灰水变浑浊的气体' },
{ equation: '2C + O₂ → 2CO', condition: '点燃(氧气不充足)',
phenomenon: '发出蓝色火焰,放热',
note: '碳不完全燃烧生成一氧化碳,CO 有毒,注意通风' },
{ equation: 'S + O₂ → SO₂', condition: '点燃',
phenomenon: '发出明亮的蓝紫色火焰,放热',
note: 'SO₂ 有刺激性气味,是空气污染物' },
{ equation: '2H₂ + O₂ → 2H₂O', condition: '点燃',
phenomenon: '发出淡蓝色火焰,放热',
note: '点燃氢气前必须先验纯,防止爆炸' },
{ equation: '2CO + O₂ → 2CO₂', condition: '点燃',
phenomenon: '发出蓝色火焰,放热',
note: 'CO 是可燃性有毒气体,尾气需处理' },
{ equation: 'CO₂ + H₂O → H₂CO₃', condition: '常温',
phenomenon: '无明显现象',
note: '碳酸使紫色石蕊变红,加热后又恢复紫色' },
{ equation: 'CaO + H₂O → Ca(OH)₂', condition: '常温(放热)',
phenomenon: '放出大量热',
note: '生石灰作食品干燥剂,产物为熟石灰' },
{ equation: '2Na + Cl₂ → 2NaCl', condition: '点燃',
phenomenon: '剧烈燃烧,发出黄色火焰',
note: '钠在氯气中燃烧,生成白烟(氯化钠固体小颗粒)' }
];
build() {
Column() {
// 顶部标题栏
Row() {
Text('‹').fontSize(34).fontColor(Color.White)
.onClick(() => router.back())
Text('化合反应').fontSize(20).fontWeight(FontWeight.Bold)
.fontColor(Color.White).margin({ left: 8 })
Blank()
}
.width('100%').height(56).padding({ left: 10, right: 16 })
.backgroundColor(this.themeColor)
Scroll() {
Column({ space: 14 }) {
// 定义卡片
Column({ space: 8 }) {
Text('📖 什么是化合反应')
.fontSize(16).fontWeight(FontWeight.Bold).fontColor('#111827')
.width('100%')
Text('由两种或两种以上的物质生成另一种物质的反应。')
.fontSize(14).fontColor('#4B5563').lineHeight(22).width('100%')
Text('特征:多变一。判断时只看生成物是否只有一种。')
.fontSize(13).fontColor(this.themeColor).width('100%')
}
.width('100%').padding(16).borderRadius(16)
.backgroundColor('#EAF0FF').border({ width: 1, color: '#D4E2FF' })
// 通式卡片
Column({ space: 6 }) {
Text('通式').fontSize(12).fontColor('#9CA3AF').width('100%')
Text('A + B → AB')
.fontSize(22).fontWeight(FontWeight.Bold)
.fontColor(this.themeColor).width('100%')
.textAlign(TextAlign.Center)
}
.width('100%').padding(16).borderRadius(16)
.backgroundColor(Color.White).border({ width: 1, color: '#E5EAF2' })
// ForEach 批量渲染方程式卡片
ForEach(this.equations, (item: Equation) => {
EquationCard({
equation: item.equation,
condition: item.condition,
phenomenon: item.phenomenon,
note: item.note,
accentColor: this.themeColor
})
}, (item: Equation) => item.equation)
// 口诀卡片
Column({ space: 8 }) {
Text('🗣️ 记忆口诀')
.fontSize(16).fontWeight(FontWeight.Bold).fontColor('#111827')
.width('100%')
Text('多变一,化合记;生成物只看一种,别把燃烧混进来。')
.fontSize(14).fontColor('#4B5563').lineHeight(24).width('100%')
}
.width('100%').padding(16).borderRadius(16)
.backgroundColor('#FFF7E6').border({ width: 1, color: '#FDEBC8' })
}
.padding(14)
}
.layoutWeight(1).scrollBar(BarState.Off)
}
.height('100%').width('100%').backgroundColor('#F4F6FA')
}
}
五、代码要点
- 组件复用:
EquationCard用@Prop接收数据,四个反应类型页面共享同一卡片样式,只改accentColor换主题色。 - 数据驱动:
interface Equation定义结构化数据,ForEach遍历渲染,增删方程式只需改数组。 - 唯一渲染键:
ForEach第三个参数(item) => item.equation保证列表 diff 高效。
六、化合反应速记
| 要点 | 内容 |
|---|---|
| 定义 | 多种物质 → 一种物质(A + B → AB) |
| 判定 | 只看生成物是否唯一 |
| 常见现象 | Mg 耀眼白光、S 蓝紫色火焰、Fe 火星四射、P 白烟、H₂ 淡蓝色火焰 |
| 典型易错 | 铁丝燃烧生成 Fe₃O₄ 而非 Fe₂O₃;点燃前氢气必须验纯 |
| 口诀 | 多变一,化合记;生成物只看一种 |
更多推荐



所有评论(0)