【鸿蒙开发实战】HarmonyOS单词库应用

核心功能:

  1. 添加单词:输入英文单词和中文释义

  2. 删除单词:每个单词项都有删除按钮

  3. 搜索功能:实时搜索单词或释义

  4. 统计信息:显示单词总数

界面特点:

  • 简洁的Material Design风格

  • 两种视图模式:列表视图和添加视图

  • 响应式布局,适配不同屏幕

  • 实时搜索过滤

  • 添加示例单词按钮

使用说明:

  1. 点击"添加新单词"切换到添加视图

  2. 输入英文单词和中文释义

  3. 点击"添加单词"保存

  4. 在列表视图中可以删除单词或搜索单词

完整代码

复制代码
// WordsLibrary.ets
import { promptAction } from '@ohos.promptAction';
import { display } from '@ohos.display';

// 定义单词数据模型
class WordItem {
  id: number;
  word: string;
  meaning: string;
  date: string;

  constructor(id: number, word: string, meaning: string) {
    this.id = id;
    this.word = word;
    this.meaning = meaning;
    this.date = new Date().toLocaleString();
  }
}

@Entry
@Component
struct WordsLibrary {
  // 状态管理
  @State words: WordItem[] = [];
  @State inputWord: string = '';
  @State inputMeaning: string = '';
  @State searchText: string = '';
  @State currentView: string = 'list'; // 'list' 或 'add'

  // 添加单词
  addWord() {
    if (!this.inputWord.trim() || !this.inputMeaning.trim()) {
      promptAction.showToast({ message: '请输入完整的单词和释义' });
      return;
    }

    const newWord = new WordItem(
      Date.now(),
      this.inputWord.trim(),
      this.inputMeaning.trim()
    );

    this.words = [newWord, ...this.words];
    this.inputWord = '';
    this.inputMeaning = '';
    promptAction.showToast({ message: '添加成功' });
    this.currentView = 'list';
  }

  // 删除单词
  deleteWord(id: number) {
    this.words = this.words.filter(item => item.id !== id);
    promptAction.showToast({ message: '删除成功' });
  }

  // 获取显示的单词列表(支持搜索)
  getDisplayWords(): WordItem[] {
    if (!this.searchText.trim()) {
      return this.words;
    }
    const search = this.searchText.toLowerCase().trim();
    return this.words.filter(item =>
      item.word.toLowerCase().includes(search) ||
      item.meaning.toLowerCase().includes(search)
    );
  }

  // 获取统计信息
  getStats(): string {
    return `共 ${this.words.length} 个单词`;
  }

  build() {
    Column() {
      // 标题栏
      Row({ space: 10 }) {
        Text('单词库')
          .fontSize(24)
          .fontWeight(FontWeight.Bold)
          .fontColor(Color.Blue)

        Text(this.getStats())
          .fontSize(14)
          .fontColor(Color.Gray)
      }
      .width('100%')
      .justifyContent(FlexAlign.Center)
      .padding(15)

      // 顶部按钮
      Row({ space: 20 }) {
        Button(this.currentView === 'list' ? '单词列表' : '返回列表')
          .onClick(() => {
            this.currentView = 'list';
          })
          .backgroundColor(this.currentView === 'list' ? Color.Blue : Color.Gray)

        Button('添加新单词')
          .onClick(() => {
            this.currentView = 'add';
          })
          .backgroundColor(this.currentView === 'add' ? Color.Blue : Color.Gray)
      }
      .width('100%')
      .justifyContent(FlexAlign.Center)
      .padding(10)

      // 搜索栏(仅在列表视图显示)
      if (this.currentView === 'list') {
        Row() {
          TextInput({ placeholder: '搜索单词或释义...' })
            .width('80%')
            .height(40)
            .onChange((value: string) => {
              this.searchText = value;
            })

          if (this.searchText) {
            Button('✕')
              .width(40)
              .height(40)
              .fontSize(12)
              .onClick(() => {
                this.searchText = '';
              })
          }
        }
        .width('90%')
        .padding(10)
        .borderRadius(20)
        .backgroundColor(Color.White)
        .shadow({ radius: 2, color: Color.Gray, offsetX: 1, offsetY: 1 })
      }

      // 主要内容区域
      if (this.currentView === 'list') {
        this.buildWordList();
      } else {
        this.buildAddForm();
      }
    }
    .width('100%')
    .height('100%')
    .backgroundColor(Color.LightGray)
    .padding(10)
  }

  // 构建单词列表
  @Builder
  buildWordList() {
    const displayWords = this.getDisplayWords();

    if (displayWords.length === 0) {
      Column() {
        Image($r('app.media.icon'))
          .width(100)
          .height(100)
          .margin({ bottom: 20 })

        Text(this.searchText ? '未找到相关单词' : '暂无单词,点击"添加新单词"开始学习')
          .fontSize(16)
          .fontColor(Color.Gray)
          .textAlign(TextAlign.Center)
      }
      .width('100%')
      .height('60%')
      .justifyContent(FlexAlign.Center)
      .alignItems(HorizontalAlign.Center)
      return;
    }

    List({ space: 10 }) {
      ForEach(displayWords, (item: WordItem) => {
        ListItem() {
          Column({ space: 5 }) {
            // 单词和释义
            Row() {
              Text(item.word)
                .fontSize(18)
                .fontWeight(FontWeight.Bold)
                .fontColor(Color.Black)

              Text(`(${new Date(item.date).toLocaleDateString()})`)
                .fontSize(12)
                .fontColor(Color.Gray)
                .margin({ left: 10 })
            }
            .width('100%')
            .justifyContent(FlexAlign.Start)

            Text(item.meaning)
              .fontSize(16)
              .fontColor(Color.DarkGray)
              .width('100%')
              .textAlign(TextAlign.Start)

            // 操作按钮
            Row({ space: 20 }) {
              Button('删除')
                .width(60)
                .height(30)
                .fontSize(12)
                .backgroundColor(Color.Red)
                .fontColor(Color.White)
                .onClick(() => this.deleteWord(item.id))
            }
            .width('100%')
            .justifyContent(FlexAlign.End)
            .margin({ top: 10 })
          }
          .padding(15)
          .width('100%')
          .backgroundColor(Color.White)
          .borderRadius(10)
          .shadow({ radius: 2, color: Color.Gray, offsetX: 1, offsetY: 1 })
        }
      }, (item: WordItem) => item.id.toString())
    }
    .width('100%')
    .height('75%')
    .margin({ top: 10 })
  }

  // 构建添加表单
  @Builder
  buildAddForm() {
    Column({ space: 20 }) {
      // 单词输入
      Column({ space: 5 }) {
        Text('单词')
          .fontSize(16)
          .fontColor(Color.Black)
          .width('90%')
          .textAlign(TextAlign.Start)

        TextInput({ placeholder: '输入英文单词' })
          .width('90%')
          .height(50)
          .fontSize(18)
          .onChange((value: string) => {
            this.inputWord = value;
          })
          .backgroundColor(Color.White)
          .borderRadius(10)
          .padding(10)
      }

      // 释义输入
      Column({ space: 5 }) {
        Text('释义')
          .fontSize(16)
          .fontColor(Color.Black)
          .width('90%')
          .textAlign(TextAlign.Start)

        TextInput({ placeholder: '输入中文释义' })
          .width('90%')
          .height(50)
          .fontSize(18)
          .onChange((value: string) => {
            this.inputMeaning = value;
          })
          .backgroundColor(Color.White)
          .borderRadius(10)
          .padding(10)
      }

      // 添加按钮
      Button('添加单词')
        .width('90%')
        .height(50)
        .fontSize(18)
        .backgroundColor(Color.Blue)
        .fontColor(Color.White)
        .onClick(() => this.addWord())
        .margin({ top: 30 })

      // 示例单词
      Column({ space: 10 }) {
        Text('示例:')
          .fontSize(14)
          .fontColor(Color.Gray)

        Row({ space: 20 }) {
          Button('Apple')
            .onClick(() => {
              this.inputWord = 'Apple';
              this.inputMeaning = '苹果';
            })
          Button('Book')
            .onClick(() => {
              this.inputWord = 'Book';
              this.inputMeaning = '书';
            })
          Button('Computer')
            .onClick(() => {
              this.inputWord = 'Computer';
              this.inputMeaning = '计算机';
            })
        }
      }
      .margin({ top: 30 })
    }
    .width('100%')
    .padding(20)
    .backgroundColor(Color.White)
    .borderRadius(15)
    .shadow({ radius: 5, color: Color.Gray, offsetX: 2, offsetY: 2 })
    .margin({ top: 20 })
  }
}

入门鸿蒙开发又怕花冤枉钱?别错过!现在能免费系统学 -- 从 ArkTS 面向对象核心的类和对象、继承多态,到吃透鸿蒙开发关键技能,还能冲刺鸿蒙基础 +高级开发者证书,更惊喜的是考证成功还送好礼!快加入我的鸿蒙班,一起从入门到精通,班级链接:点击https://developer.huawei.com/consumer/cn/training/classDetail/b7365031334e4353a9a0fd6785bb0791?type=1?ha_source=hmosclass\&ha_sourceId=89000248免费进入

相关推荐
zhuweisky4 小时前
ArkTS实现鸿蒙手机视频聊天、屏幕分享(HarmonyOS)
音视频·harmonyos·鸿蒙开发
大雷神5 小时前
HarmonyOS智慧农业管理应用开发教程--高高种地--第32篇:应用测试、优化与调试
华为·harmonyos
前端不太难5 小时前
HarmonyOS 游戏中,被“允许”的异常
游戏·状态模式·harmonyos
木斯佳6 小时前
HarmonyOS 6实战(源码教学篇)— MindSpore Lite Kit 【从证件照工具到端侧图像分割技术全解析】
华为·harmonyos
三声三视6 小时前
HarmonyOS 路由框架 HMRouter 全解析:从原理到实践
华为·harmonyos
王码码20356 小时前
Flutter for OpenHarmony 实战之基础组件:第十七篇 滚动进阶 ScrollController 与 Scrollbar
flutter·harmonyos
以太浮标7 小时前
华为eNSP模拟器综合实验之- DHCP Option 43 解析
服务器·网络·华为·云计算
小哥Mark7 小时前
Flutter开发鸿蒙年味 + 实用实战应用|春节祝福:列表选卡 + 贴纸拖动 + 截图分享
flutter·harmonyos·鸿蒙
m0_685535087 小时前
华为光学工程师面试题汇总
华为·光学·光学设计·光学工程·镜头设计
王码码20357 小时前
Flutter for OpenHarmony 实战之基础组件:第十六篇 约束布局 ConstrainedBox 与 AspectRatio
flutter·harmonyos