鴻蒙NEXT開發(fā)案例:保質期計算

2.gif

【引言】

保質期計算應用是一個基于鴻蒙NEXT框架開發(fā)的數(shù)字和文本統(tǒng)計組件。用戶可以輸入商品的生產日期和保質期天數(shù),應用會自動計算并展示相關信息,包括保質狀態(tài)、剩余天數(shù)、生產日期和到期日期。

【環(huán)境準備】

? 操作系統(tǒng):Windows 10

? 開發(fā)工具:DevEco Studio NEXT Beta1 Build Version: 5.0.3.806

? 目標設備:華為Mate60 Pro

? 開發(fā)語言:ArkTS

? 框架:ArkUI

? API版本:API 12

【實現(xiàn)思路】

1 組件定義

在應用中,我們定義了一個名為ExpiryDateCalculator的組件,其中包含了各種狀態(tài)變量和方法。通過監(jiān)聽輸入文本變化和選擇日期變化,實現(xiàn)了自動更新相關信息的功能。

2 UI界面構建

通過構建UI界面,我們使用了列布局和行布局來展示各個信息模塊。包括標題展示、統(tǒng)計結果展示、示例和清空按鈕、選擇生產日期等功能。通過設置字體顏色、背景色、陰影效果等,使界面更加美觀和易讀。

3 交互功能實現(xiàn)

在交互功能方面,我們實現(xiàn)了輸入框焦點狀態(tài)的切換、清空按鈕功能、選擇日期功能等。用戶可以方便地輸入信息并查看計算結果,提升了用戶體驗和操作便捷性。

【完整代碼】

@Entry
@Component
struct ExpiryDateCalculator {
  // 定義文本顏色的狀態(tài)變量,初始值為深灰色
  @State private textColor: string = "#2e2e2e";
  // 定義陰影邊框顏色的狀態(tài)變量,初始值為淺灰色
  @State private shadowColor: string = "#d5d5d5";
  // 定義基礎內邊距的狀態(tài)變量,初始值為30
  @State private basePadding: number = 30;
  // 定義是否已過期的狀態(tài)變量,初始值為false
  @State private isExpired: boolean = false;
  // 定義生產日期的狀態(tài)變量,初始值為空字符串
  @State private productionDate: string = "";
  // 定義到期日期的狀態(tài)變量,初始值為空字符串
  @State private expiryDate: string = "";
  // 定義剩余有效天數(shù)的狀態(tài)變量,初始值為0
  @State private remainingDays: number = 0;
  // 定義主題顏色,初始值為橙色
  @State private themeColor: string | Color = Color.Orange;
  // 輸入框是否獲得了焦點的狀態(tài)變量,初始值為false
  @State isInputFocused: boolean = false;
  // 定義監(jiān)聽輸入文本變化的狀態(tài)變量,初始值為"9"
  @State @Watch('inputChanged') private inputText: string = "9";
  // 定義選擇的日期狀態(tài)變量,初始值為當前日期
  @State @Watch('inputChanged') private selectedDate: Date = new Date()

  // 組件即將出現(xiàn)時的操作
  aboutToAppear(): void {
    // 調用輸入變化處理方法
    this.inputChanged()
  }

  // 獲取年月日的方法
  getYearMonthDay(date: Date) {
    // 獲取年份并格式化為4位數(shù)
    const year: string = date.getFullYear().toString().padStart(4, '0');
    // 獲取月份并格式化為2位數(shù)
    const month: string = (date.getMonth() + 1).toString().padStart(2, '0');
    // 獲取日期并格式化為2位數(shù)
    const day: string = date.getDate().toString().padStart(2, '0');
    // 返回格式化后的日期字符串
    return `${year}年${month}月${day}日`;
  }

  // 輸入變化時的處理方法
  inputChanged() {
    // 打印當前選擇的日期
    console.info(`selectedDate:${this.selectedDate}`);
    // 更新生產日期為選擇的日期
    this.productionDate = this.getYearMonthDay(this.selectedDate);
    // 創(chuàng)建到期日期對象
    let expiryDate: Date = new Date(this.selectedDate);
    // 根據(jù)輸入的天數(shù)更新到期日期
    expiryDate.setDate(expiryDate.getDate() + Number(this.inputText));
    // 更新到期日期為格式化后的字符串
    this.expiryDate = this.getYearMonthDay(expiryDate);
    // 判斷是否已過期
    this.isExpired = expiryDate.getTime() < new Date().getTime();
    // 計算時間差
    const timeDifference = expiryDate.getTime() - new Date().getTime();
    // 計算剩余天數(shù)
    this.remainingDays = Math.ceil(timeDifference / (1000 * 60 * 60 * 24));
  } 
  // 構建UI界面的方法
  build() {
    // 創(chuàng)建一個列布局容器
    Column() { 
      // 添加標題
      Text('保質期計算')
        .fontColor(this.textColor)// 設置字體顏色
        .fontSize(18)// 設置字體大小
        .width('100%')// 設置寬度為100%
        .height(50)// 設置高度為50
        .textAlign(TextAlign.Center)// 設置文本對齊方式為居中
        .backgroundColor(Color.White)// 設置背景顏色為白色
        .shadow({
          // 設置陰影效果
          radius: 2, // 陰影半徑
          color: this.shadowColor, // 陰影顏色
          offsetX: 0, // X軸偏移量
          offsetY: 5 // Y軸偏移量
        });
      // 創(chuàng)建可滾動的容器
      Scroll() {
        // 在可滾動容器內部創(chuàng)建列布局
        Column() {
          // 添加統(tǒng)計結果展示
          Column() {
            // 是否過期
            Row() {
              Text() {
                Span(`保質狀態(tài):`) // 顯示文本“保質狀態(tài):”
                Span(`${this.isExpired ? '已過期' : '未過期'}`)// 根據(jù)狀態(tài)顯示“已過期”或“未過期”
                  .fontColor(this.isExpired ? "#e74c3c" : "#3ace7d") // 根據(jù)狀態(tài)設置字體顏色
              }
              .fontColor(this.textColor) // 設置字體顏色
              .fontSize(16) // 設置字體大小
              .layoutWeight(1); // 設置布局權重
            }
            .constraintSize({ minHeight: 45 }) // 設置最小高度
            .justifyContent(FlexAlign.SpaceBetween) // 設置內容對齊方式
            .width('100%'); // 設置寬度為100%

            Divider(); // 添加分隔線
            // 剩余天數(shù)
            Row() {
              Text() {
                Span(`剩余天數(shù):`) // 顯示文本“剩余天數(shù):”
                Span(`${this.remainingDays < 0 ? 0 : this.remainingDays} `).fontColor(Color.Orange) // 顯示剩余天數(shù),負數(shù)顯示為0
                Span('天') // 顯示單位“天”
              }
              .fontColor(this.textColor) // 設置字體顏色
              .fontSize(16) // 設置字體大小
              .layoutWeight(1); // 設置布局權重
            }
            .constraintSize({ minHeight: 45 }) // 設置最小高度
            .justifyContent(FlexAlign.SpaceBetween) // 設置內容對齊方式
            .width('100%'); // 設置寬度為100%

            Divider(); // 添加分隔線
            // 生產日期
            Row() {
              Text() {
                Span(`生產日期:`) // 顯示文本“生產日期:”
                Span(`${this.productionDate} `) // 顯示生產日期
              }
              .fontColor(this.textColor) // 設置字體顏色
              .fontSize(16) // 設置字體大小
              .layoutWeight(1); // 設置布局權重
            }
            .constraintSize({ minHeight: 45 }) // 設置最小高度
            .justifyContent(FlexAlign.SpaceBetween) // 設置內容對齊方式
            .width('100%'); // 設置寬度為100%

            Divider(); // 添加分隔線
            // 到期日期
            Row() {
              Text() {
                Span(`到期日期:`) // 顯示文本“到期日期:”
                Span(`${this.expiryDate} `) // 顯示到期日期
              }
              .fontColor(this.textColor) // 設置字體顏色
              .fontSize(16) // 設置字體大小
              .layoutWeight(1); // 設置布局權重
            }
            .constraintSize({ minHeight: 45 }) // 設置最小高度
            .justifyContent(FlexAlign.SpaceBetween) // 設置內容對齊方式
            .width('100%'); // 設置寬度為100%
          }
          .alignItems(HorizontalAlign.Start) // 設置子項對齊方式
          .width('650lpx') // 設置寬度為650像素
          .padding(`${this.basePadding}lpx`) // 設置內邊距
          .margin({ top: `${this.basePadding}lpx` }) // 設置上邊距
          .borderRadius(10) // 設置圓角
          .backgroundColor(Color.White) // 設置背景顏色為白色
          .shadow({
            // 設置陰影效果
            radius: 10, // 陰影半徑
            color: this.shadowColor, // 陰影顏色
            offsetX: 0, // X軸偏移量
            offsetY: 0 // Y軸偏移量
          });

          // 添加示例和清空按鈕
          Column() {
            Row() {
              // 添加文本輸入?yún)^(qū)域
              Row() {
                TextInput({ text: $$this.inputText, placeholder: `請輸入保質期天數(shù)` })// 創(chuàng)建文本輸入框
                  .type(InputType.Number)// 設置輸入類型為數(shù)字
                  .layoutWeight(1)// 設置布局權重
                  .fontSize(16)// 設置字體大小
                  .textAlign(TextAlign.JUSTIFY)// 設置文本對齊方式
                  .backgroundColor(Color.Transparent)// 設置背景色為透明
                  .padding(0)// 設置內邊距為0
                  .height('100%')// 設置高度為100%
                  .placeholderColor(this.isInputFocused ? this.themeColor : Color.Gray)// 設置占位符顏色
                  .fontColor(this.isInputFocused ? this.themeColor : this.textColor)// 設置字體顏色
                  .caretColor(this.themeColor)// 設置光標顏色
                  .borderRadius(0)// 設置圓角為0
                  .onBlur(() => this.isInputFocused = false)// 失去焦點時更新狀態(tài)
                  .onFocus(() => this.isInputFocused = true)// 獲得焦點時更新狀態(tài)
                  .width('100%'); // 設置寬度為100%
              }
              .padding(`${this.basePadding / 2}lpx`) // 設置內邊距
              .backgroundColor("#f2f1fd") // 設置背景色
              .layoutWeight(1) // 設置布局權重
              .borderWidth(1) // 設置邊框寬度
              .borderRadius(10) // 設置圓角為10
              .borderColor(this.isInputFocused ? this.themeColor : Color.Gray) // 根據(jù)焦點狀態(tài)設置邊框顏色
              .margin({ right: `${this.basePadding / 2}lpx` }); // 設置右邊距

              Blank(); // 添加空白占位符

              // 清空按鈕
              Text('清空')// 顯示文本“清空”
                .fontColor("#e48742")// 設置字體顏色
                .fontSize(16)// 設置字體大小
                .padding(`${this.basePadding / 2}lpx`)// 設置內邊距
                .clickEffect({ level: ClickEffectLevel.LIGHT, scale: 0.8 })// 點擊效果
                .backgroundColor("#ffefe6")// 設置背景色
                .borderRadius(5)// 設置圓角為5
                .onClick(() => { // 點擊事件處理
                  this.inputText = ""; // 清空輸入文本
                });
            }
            .height(45) // 設置高度為45
            .alignItems(VerticalAlign.Center) // 設置內容垂直居中
            .justifyContent(FlexAlign.SpaceBetween) // 設置內容對齊方式
            .width('100%'); // 設置寬度為100%

            Divider(); // 添加分隔線

            // 選擇生產日期
            Row() {
              Text('請選擇生產日期')// 顯示文本“請選擇生產日期”
                .fontColor("#5871ce")// 設置字體顏色
                .fontSize(16)// 設置字體大小
                .padding(`${this.basePadding / 2}lpx`)// 設置內邊距
                .backgroundColor("#f2f1fd")// 設置背景色
                .borderRadius(5)// 設置圓角為5
                .clickEffect({ level: ClickEffectLevel.LIGHT, scale: 0.8 }) // 點擊效果
              Blank(); // 添加空白占位符
              CalendarPicker({ hintRadius: 10, selected: this.selectedDate })// 創(chuàng)建日歷選擇器
                .edgeAlign(CalendarAlign.END)// 設置對齊方式
                .textStyle({ color: "#ff182431", font: { size: 20, weight: FontWeight.Normal } })// 設置文本樣式
                .margin(10)// 設置外邊距
                .onChange((date: Date) => { // 日期變化事件處理
                  this.selectedDate = date // 更新選擇的日期
                })
            }
            .height(45) // 設置高度為45
            .justifyContent(FlexAlign.SpaceBetween) // 設置內容對齊方式
            .width('100%'); // 設置寬度為100%
          }
          .alignItems(HorizontalAlign.Start) // 設置內容水平對齊方式
          .width('650lpx') // 設置寬度為650像素
          .padding(`${this.basePadding}lpx`) // 設置內邊距
          .margin({ top: `${this.basePadding}lpx` }) // 設置上邊距
          .borderRadius(10) // 設置圓角為10
          .backgroundColor(Color.White) // 設置背景顏色為白色
          .shadow({
            // 設置陰影效果
            radius: 10, // 陰影半徑
            color: this.shadowColor, // 陰影顏色
            offsetX: 0, // X軸偏移量
            offsetY: 0 // Y軸偏移量
          });

          // 添加工具介紹
          Column() {
            Text('工具介紹')// 顯示文本“工具介紹”
              .fontSize(18)// 設置字體大小為18
              .fontWeight(600)// 設置字體粗細
              .fontColor(this.textColor); // 設置字體顏色為狀態(tài)變量中定義的文本顏色

            Text('輸入需要計算保質期商品的生產日期和保質期天數(shù),工具將為您自動計算商品的保質期狀態(tài)、剩余天數(shù)、到期日。')// 顯示工具介紹文本
              .textAlign(TextAlign.JUSTIFY)// 設置文本對齊方式為兩端對齊
              .fontSize(16)// 設置字體大小為16
              .fontColor(this.textColor)// 設置字體顏色為狀態(tài)變量中定義的文本顏色
              .margin({ top: `${this.basePadding / 2}lpx` }); // 設置上邊距為基礎內邊距的一半
          }
          .alignItems(HorizontalAlign.Start) // 設置內容水平對齊方式
          .width('650lpx') // 設置寬度為650像素
          .padding(`${this.basePadding}lpx`) // 設置內邊距
          .margin({ top: `${this.basePadding}lpx` }) // 設置上邊距
          .borderRadius(10) // 設置圓角為10
          .backgroundColor(Color.White) // 設置背景顏色為白色
          .shadow({
            // 設置陰影效果
            radius: 10, // 陰影半徑
            color: this.shadowColor, // 陰影顏色
            offsetX: 0, // X軸偏移量
            offsetY: 0 // Y軸偏移量
          });

        }
      }
      .scrollBar(BarState.Off) // 關閉滾動條
      .clip(false); // 不裁剪內容
    }
    .height('100%') // 設置高度為100%
    .width('100%') // 設置寬度為100%
    .backgroundColor("#f4f8fb"); // 設置背景顏色為指定顏色
  }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容