鸿蒙开发小案例(名片管理))

news2024/11/13 22:07:09

鸿蒙开发小案例(名片管理)

  • 1、页面效果
    • 1.1 初始页面
    • 1.2 点击名片展开
    • 1.3 点击收藏
    • 1.4 点击编辑按钮
  • 2、实现代码
    • 2.1 DataModel.ets
    • 2.2 RandomUtil.ets
    • 2.3 ContactList.ets

1、页面效果


1.1 初始页面

在这里插入图片描述

1.2 点击名片展开

在这里插入图片描述

1.3 点击收藏

在这里插入图片描述

1.4 点击编辑按钮

在这里插入图片描述

2、实现代码


2.1 DataModel.ets

let nextId = 1;

@Observed
export class Person {
  id: number;
  name: string;
  phone: string;
  isStar: boolean = false;

  constructor(name, phone) {
    this.id = nextId++;
    this.name = name;
    this.phone = phone;
  }
}

2.2 RandomUtil.ets

const names = [
  '张伟',
  '王芳',
  '李娜',
  '刘强',
  '陈军',
  '杨洋',
  '赵丽',
  '黄勇',
  '周雪',
  '吴宇',
  '徐鹏',
  '马丽',
  '孙建',
  '朱敏',
  '郭涛',
  '曹梅',
  '田亮',
  '林静',
  '范磊'
];

//随机抽取一个姓名
export function getRandomName() {
  let randomIndex = Math.floor(Math.random() * names.length);
  return names[randomIndex];
}

//随机生成一个年龄
export function getRandomAge() {
  return 10 + Math.floor(Math.random() * 30);
}

//随机生成一个手机号码
export function getRandomPhone() {
  const prefixArray = ['130', '131', '132', '133', '134', '135', '136', '137', '138', '139'];

  let phone = prefixArray[Math.floor(Math.random() * prefixArray.length)];

  // 生成后8位随机数字
  for (let i = 0; i < 8; i++) {
    phone += Math.floor(Math.random() * 10);
  }

  return phone;
}

2.3 ContactList.ets

import { getRandomName, getRandomPhone } from '../../../../utils/RandomUtil';
import { Person } from './model/DataModel';

@Entry
@Component
struct ContactsPage {
  // 初始化列表数据
  @State persons: Person[] = [new Person(getRandomName(), getRandomPhone()), new Person(getRandomName(), getRandomPhone())];
  // 点击名片展开的 id
  @State isOpenId: number = -1;
  // 是否选中
  @State isShowCheck: boolean = false;
  // 选中的名片 ID
  @State selectIdList: number[] = [];

  build() {
    Column() {
      //标题
      Row({ space: 10 }) {
        Text('联系人').titleStyle()
        Blank()
        /**
         * 通过 isShowCheck 控制 选择和取消 按钮的切换
         */
        Button(this.isShowCheck ? '取消' : '选择')
          .buttonStyle(Color.Gray)
          .onClick(() => {
            this.isShowCheck = !this.isShowCheck
          })
        Button('+')
          .buttonStyle(Color.Gray)
          /**
           * 点击新增 新增联系人
           */
          .onClick(() => {
            this.persons.push(new Person(getRandomName(), getRandomPhone()))
          })
      }
      .width('100%')
      .height(60)

      //列表
      List({ space: 10 }) {
        ForEach(this.persons, (person: Person) => {
          ListItem() {
            // 联系人组件
            ContactItem({
              person: person,
              isOpenId: $isOpenId,
              isShowCheck: this.isShowCheck,
              selectIdList: $selectIdList })
          }
        })
      }
      .width('100%')
      .layoutWeight(1)

      //按钮
      if (this.isShowCheck) {
        Button('删除')
          .buttonStyle(Color.Red)
          .margin({ top: 10 })
          .onClick(() => {
            this.persons = this.persons.filter(person => !this.selectIdList.includes(person.id));
          })
      }
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#EFEFEF')
    .padding(10)
  }
}

@Component
struct ContactItem {
  @ObjectLink person: Person;  // 双向绑定父组件的 person 对象
  @State isShowPhone: boolean = false;  // 定义是否展示 phone
  @Link @Watch("numberChanger") isOpenId: number;   // 监听点击打开的名片 实现只能打开一个 再打开会关闭其他名片
  @Prop isShowCheck: boolean; // 接收父组件的值是否选中
  @Link selectIdList: number[]  // 绑定父组件的选中 ID 列表

  /**
   * 监听函数
   * 监听当前选中的名片 id 是否为点击的名片 id
   */
  numberChanger() {
      this.person.id == this.isOpenId ? this.isShowPhone = true : this.isShowPhone = false;
  }

  build() {
    Column() {
      Row({ space: 10 }) {
        if (this.isShowCheck) {
          Toggle({
            type: ToggleType.Checkbox
          })
            /**
             * 删除函数
             * 当被选中时 将名片 id 添加到 绑定父组件的selectIdList中
             * 当未选中时 移除绑定父组件的selectIdList中的 名片 id
             */
            .onChange((value) => {
              value ? this.selectIdList.push(this.person.id) : this.selectIdList.slice(this.selectIdList.indexOf(this.person.id), 1)
          })
        }
        //头像
        Image($r('app.media.img_user_avatar'))
          .width(40)
          .height(40)
        //姓名
        Text(this.person.name)
          .fontSize(20)
          .fontWeight(500)

        Blank()
        //收藏
        /**
         * 双向绑定父组件的 person 对象中的 person.isStar 判断是否收藏
         */
        Image(this.person.isStar ? $r('app.media.ic_star_filled') : $r('app.media.ic_star_empty'))
          .width(30)
          .height(30)
          .onClick(() => {
            this.person.isStar = !this.person.isStar;
          })
      }.justifyContent(FlexAlign.SpaceBetween)
      .padding(10)
      .width("100%")
      /**
       * 点击
       * 1、改变展示名片 手机号
       * 2、记录正在展示的名片 id 用于给 numberChanger() 监听函数判断是否是当前名片展开 如果是则关闭其他名片
       */
      .onClick(() => {
        this.isShowPhone = !this.isShowPhone;
        this.isOpenId = this.person.id;
      })

      if (this.isShowPhone) {
        Divider()
        Row() {
          Text(this.person.name)
            .fontSize(20)
          Text(this.person.phone)
            .fontSize(20)
            .margin({ left: 20 })
        }
        .backgroundColor(Color.White)
        .width('100%')
        .height(70)
        .padding(10)
        .borderRadius(10)
      }
    }
    .backgroundColor(Color.White)
    .padding(10)
    .borderRadius(10)
  }
}

/**
 * 一些 css 样式
 */

@Extend(Text) function titleStyle() {
  .fontSize(30)
  .fontWeight(500)
}

@Extend(Button) function buttonStyle(color: ResourceColor) {
  .height(30)
  .backgroundColor(color)
}

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

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

相关文章

第二证券:资金抱团“高股息”,超三成A股年内创历史新低!

A股商场行情冰火两重天。 “预制菜榜首股”跌破发行价 7月8日&#xff0c;味知香盘中最低跌至19.26元/股&#xff0c;股价跌破发行价&#xff0c;并创前史新低。揭露资料显现&#xff0c;公司是集研发、生产、销售为一体的半成品菜企业&#xff0c;现在具有8大产品系列&#…

短视频矩阵系统源代码开发---多种剪辑逻辑再次升级

揭秘AI短视频运营秘籍&#xff0c;轻松涨粉&#xff01; 1、数据管理方面&#xff0c;我们提供了全面的账号及视频Top 10的数据统计服务。 2、在AI视频创意制作领域&#xff0c;我们采用原创视频批量剪辑、阶乘算法和去重原理&#xff0c;以提升内容的独特性和吸引力。 3、同…

腾讯发布2024大模型十大最新趋势!

近日&#xff0c;在2024世界人工智能大会上&#xff0c;腾讯正式发布了《2024大模型十大趋势——走进“机器外脑”时代》报告。目前&#xff0c;这一报告正在AI产业界各大社群快速传播。 报告中&#xff0c;腾讯研究院试图通过10个关键性的趋势&#xff0c;去理解全世界范围内正…

【Ubuntu】windows和Linux文件互传、共享

【Ubuntu】windows和Linux文件互传、共享 一、FTP、SAMBA、NFS简介 FTP: File Transfer Protocol&#xff08;文件传输协议) SAMBA: 基于SMB(Server Message Block服务器消息块)协议的软件实现 NFS: Network File System&#xff08;网络文件系统&#xff09; 二、Linux 共享文…

无法下载 https://mirrors./ubuntu/dists/bionic/main/binary-arm64/Packages

ubuntu系统执行sudo apt update命令的时候&#xff0c;遇到如下问题&#xff1a; 忽略:82 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/universe arm64 Packages 错误:81 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/main arm64 Packa…

算法013:水果成篮

水果成篮. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/fruit-into-baskets/ 这道题题目很长&#xff0c;仔细阅读过后&#xff0c;我们其实可以简化成&#xff…

202488读书笔记|《365日创意文案》——无聊的 到底是这世间, 还是自己?懂得忘却的人才能前进

202488读书笔记|《365日创意文案》——无聊的 到底是这世间&#xff0c; 还是自己&#xff1f;懂得忘却的人才能前进 1月2月3月4月5月6月7月8月9月10月11月12月 《365日创意文案》WRITES PUBLISHING&#xff0c;一些日常&#xff0c;是烟火&#xff0c;也是幸福的印记。 当下也…

昇思学习打卡-8-FCN图像语义分割

目录 FCN介绍FCN所用的技术训练数据的可视化模型训练模型推理FCN的优点和不足优点不足 FCN介绍 FCN主要用于图像分割领域&#xff0c;是一种端到端的分割方法&#xff0c;是深度学习应用在图像语义分割的开山之作。通过进行像素级的预测直接得出与原图大小相等的label map。因…

c向c++的过渡

目录 1.不同版本的hello word&#xff01; 2.namespace和&#xff1a;&#xff1a;域作用限定符以及using 2.1 namespace 2.2&#xff1a;&#xff1a; 2.3using用于展开域 3.C输入和输出 4.缺省参数 5.重载 6.引用 1.不同版本的hello word&#xff01; 还记得第一次写C语…

【JavaWeb程序设计】JSP访问数据库(三)

目录 一、使用表格展示数据库中stuinfo表中的个人信息 1. 建表&#xff08;stuinfo&#xff09; 2. Bean对象 3. 显示所有学生信息 3.1 DAO层 3.2 Service层 3.3 Servlet 3.4 主页面&#xff08;home.jsp&#xff09; 3.5 运行截图 4. 新增学生信息 4.1 add.jsp 4.2…

C语言相关内容模块

C语言相关内容模块 1、函数指针定义方式 1、函数指针定义方式 函数指针的具体用法

推荐3款免费电脑工具

Tools-Web Tools-Web是一个在线工具箱&#xff0c;提供丰富的工具和功能&#xff0c;适用于日常工作和学习。根据用户评价&#xff0c;Tools-Web的工具种类丰富且操作简单&#xff0c;是日常工作和学习的好帮手。该工具箱涵盖了开发运维、文本处理、图片处理、图表处理、随机工…

202487读书笔记|《我有个拥抱,你要不要》——生活从来如此,你的态度赋予它意义

202487读书笔记|《我有个拥抱&#xff0c;你要不要》——生活从来如此&#xff0c;你的态度赋予它意义 《我有个拥抱&#xff0c;你要不要》作者一天到晚气fufu&#xff0c;挺有愛的小漫画&#xff0c;适合用来看图说话锻炼小语言&#xff0c;我看的很快乐也写得很痛快&#xf…

【C++深度探索】继承机制详解(二)

hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1…

linux主机离线安装python3环境

一、下载好python版本 Index of /ftp/python/https://www.python.org/ftp/python/ 二、创建文件夹 mkdir /home/python/ 三、上传到主机 四、解压 # 解压xz得到tar包 xz -d Python-3.9.8.tar.xz # 解压tar包 tar -xvf Python-3.9.8.tar 五、指定安装路径 # 进入解压后的…

论文解析——Full Stack Optimization of Transformer Inference: a Survey

作者及发刊详情 摘要 正文 主要工作贡献 这篇文章的贡献主要有两部分&#xff1a; 分析Transformer的特征&#xff0c;调查高效transformer推理的方法通过应用方法学展现一个DNN加速器生成器Gemmini的case研究 1&#xff09;分析和解析Transformer架构的运行时特性和瓶颈…

SketchUp如何阵列?

sketchup如何阵列&#xff1f;请看下面方法。 方法 打开SketchUp。 以默认人物为例。 按M&#xff0c;选中人物&#xff0c;再按住Ctrl移动鼠标&#xff08;不要点击鼠标键&#xff09; 按键盘数字键输入距离&#xff0c;按回车&#xff0c;不要动鼠标。 按*10设置阵列数。 按…

C++视觉开发 四.手势识别

本章记录传统手势识别&#xff0c;在表示0-5六个数值时的识别问题。例如识别剪刀石头布&#xff0c;手势&#xff0c;以及其表示的动作。在识别时将手势中的凹陷区域称为凸缺陷&#xff0c;其个数作为识别的重要依据。 需要注意&#xff0c;在凸缺陷个数为0时&#xff0c;无法…

如何解决模型的灾难性遗忘问题?清华大学提出新方法

获取本文论文原文PDF&#xff0c;请在公众号【AI论文解读】留言&#xff1a;论文解读 探索连续学习中的新方法 在人工智能领域&#xff0c;尤其是在语言模型&#xff08;LM&#xff09;的发展过程中&#xff0c;连续学习&#xff08;CL&#xff09;始终是一个挑战。传统的学习…

【HTML入门】第四课 - 换行、分割横线和html的注释

这一小节&#xff0c;我们继续说HTML的入门知识&#xff0c;包括换行、横线分割以及注释&#xff08;html的注释&#xff09;。 目录 1 换行 2 分割横线 3 html注释 1 换行 html中分为块元素和行内元素。这一小节呢&#xff0c;先不说这些元素们&#xff0c;我们先说一下换…