【每日學點HarmonyOS Next知識】狀態變量、動畫UI殘留、Tab控件顯示、ob前綴問題、文字背景拉伸

1、HarmonyOS 怎么用一個變量觀察其他很多個變量的變化?

有一個提交按鈕的顏色,需要很多個值非空才變為紅色,否則變為灰色,可不可以用一個變量統一觀察這很多個值,去判斷按鈕該顯示什么顏色,比如Button().backgroundColor(this.color),this.color的值取決于很多個輸入框的值

想將子組件與父組件的變量綁定起來,實現其中一個變量改變,對應的變量也做同步的改變,可以做如下操作:將子組件的變量需要用@Link修飾,且不能初始化將父組件的變量需要用@State修飾。傳值的時候使用$符號修飾。

import Prompt from '@system.prompt'
@Entry
@Component
struct Index {//父組件的變量需要用@State修飾@State inputUserName:string ='張三'@State inputUserPsw:string ='張三'build() {Row() {Column() {Text(this.inputUserName).fontSize(20)// 使用子組件傳值的時候用$傳遞LoginInput({hint:'請輸入賬號',inputVale:$inputUserName})LoginInput({hint:'請輸入賬號',inputVale:$inputUserPsw})}.width('100%')}.height('100%')}}
@Component
struct LoginInput {private hint: string = '請輸入賬號密碼';//子組件的變量需要用@Link修飾,且不能初始化@Link inputVale: string;build() {TextInput({placeholder:this.hint,text:this.inputVale}).onChange((value)=>{this.inputVale= value;Prompt.showToast({message:value})})}
}
2、HarmonyOS 動畫過程中UI殘留?

等長沒有異常。只有3->2出現 出現后點擊屏幕任意點 刷新消失

參考以下示例通過onChange實現切換時自定義tabBar和TabContent的聯動:

// xxx.ets
@Entry
@Component
struct TabsExample {@State fontColor: string = '#182431'@State selectedFontColor: string = '#007DFF'@State currentIndex: number = 0private controller: TabsController = new TabsController()@Builder tabBuilder(index: number, name: string) {Column() {Text(name).fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor).fontSize(16).fontWeight(this.currentIndex === index ? 500 : 400).lineHeight(22).margin({ top: 17, bottom: 7 })Divider().strokeWidth(2).color('#007DFF').opacity(this.currentIndex === index ? 1 : 0)}.width('100%')}build() {Column() {Tabs({ barPosition: BarPosition.Start, index: this.currentIndex, controller: this.controller }) {TabContent() {Column().width('100%').height('100%').backgroundColor('#00CB87')}.tabBar(this.tabBuilder(0, 'green'))TabContent() {Column().width('100%').height('100%').backgroundColor('#007DFF')}.tabBar(this.tabBuilder(1, 'blue'))TabContent() {Column().width('100%').height('100%').backgroundColor('#FFBF00')}.tabBar(this.tabBuilder(2, 'yellow'))TabContent() {Column().width('100%').height('100%').backgroundColor('#E67C92')}.tabBar(this.tabBuilder(3, 'pink'))}.vertical(false).barMode(BarMode.Fixed).barWidth(360).barHeight(56).animationDuration(400).onChange((index: number) => {this.currentIndex = index}).width(360).height(296).margin({ top: 52 }).backgroundColor('#F1F3F5')}.width('100%')}
}
3、HarmonyOS Tabs 控件 底部顯示不全?

Tabs 控件 底部顯示不全 TabContent() 中的頁面,底部顯示不全

Scroll(this.scroller)的高度設百分比,和上面的相加為100%即可,參考DEMO:

@Entry
@Component
struct newPage {@State fontColor: string = '#182431'@State selectedFontColor: string = '#007DFF'@State currentIndex: number = 0private controller: TabsController = new TabsController()scroller: Scroller = new Scroller()private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]@BuildertabBuilder(index: number, name: string) {Column() {Text(name).fontColor(this.currentIndex === index ? this.selectedFontColor : this.fontColor).fontSize(16).fontWeight(this.currentIndex === index ? 500 : 400).lineHeight(22).margin({ top: 17, bottom: 7 })Divider().strokeWidth(2).color('#007DFF').opacity(this.currentIndex === index ? 1 : 0)}.width('100%')}build() {Column() {Tabs({ barPosition: BarPosition.End, index: this.currentIndex, controller: this.controller }) {TabContent() {Column() {Row() {Text('首頁').align(Alignment.Center)}.justifyContent(FlexAlign.Center).height('10%') //上面的設10%.width('100%').padding({ left: 10, right: 10 }).backgroundColor(Color.Green)Scroll(this.scroller) {Column() {ForEach(this.arr, (item: number) => {Text(item.toString()).width('90%').height(150).backgroundColor(0xFFFFFF).borderRadius(15).fontSize(16).textAlign(TextAlign.Center).margin({ top: 10 })}, (item: string) => item)}.width('100%')}.height('90%')  //Scroll設90%.scrollable(ScrollDirection.Vertical) // 滾動方向縱向.friction(0.6).edgeEffect(EdgeEffect.None)}}.tabBar(this.tabBuilder(0, 'green'))TabContent() {Column().width('100%').height('100%').backgroundColor('#007DFF')}.tabBar(this.tabBuilder(1, 'blue'))}.vertical(false).barMode(BarMode.Fixed).barWidth(360).barHeight(56).animationDuration(400).onChange((index: number) => {this.currentIndex = index}).width('100%').height('100%').backgroundColor('#F1F3F5')}.width('100%').height('100%')}
}
4、HarmonyOS 被@ObservedV2和@Trace標記的類及字段,使用JSON.stringify之后字段名稱都加上了“__ob_”開頭的字段?

使用JSON.stringify序列化之后字段名稱都改變了,導致無法反序列化回來。

關于序列化后會有__ob_前綴的問題,可以在序列前替換掉__ob_前綴,demo如下

import  { plainToClass } from "class-transformer";
@ObservedV2
class Son {@Trace age: number = 100;
}
class Father {son: Son = new Son();
}
@Entry
@Component
struct Index {father: Father = new Father();aboutToAppear(): void {let a = JSON.stringify(this.father);let b: Father = plainToClass(Father,this.father);//{"son":{"__ob_age":100}}替換成{"son":{"age":100}}console.log(JSON.stringify(convertKeysToCamelCase(this.father)))}build() {Column() {// 當點擊改變age時,Text組件會刷新Text(`${this.father.son.age}`).onClick(() => {this.father.son.age++;})}}
}// utils.ets
export function underscoreToCamelCase(underscoreString:string):string {// 捕獲__ob_替換成''return underscoreString.replace(/(__ob_)/g, (match:string, letter:string):string=> {console.log(letter)return '';});
}
export function convertKeysToCamelCase(obj:ESObject):ESObject {if (obj && typeof obj === 'object') {const newObj:ESObject = {};Object.keys(obj).forEach((key)=> {if (obj.hasOwnProperty(key)) {const newKey = underscoreToCamelCase(key);newObj[newKey] = convertKeysToCamelCase(obj[key]);}})return newObj;} else {return obj;}
}
5、HarmonyOS 文字背景局部拉伸問題?
  1. backgroundImageResizable設置無作用,Image設置resizable是可以的
  2. 如何讓同級控件寬度自適應文字寬度

獲取文本長度的方式參考文檔,讓backgroundImageSize改為文字的寬度:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-measure-V5#ZH-CN_TOPIC_0000001884917586__measuremeasuretext

實現方式demo:

import measure from '@ohos.measure'@Entry
@Component
struct IR240513200608052 {@State message: string = 'Hello World啊哈哈哈哈哈哈哈哈哈';@State textWidth: number = measure.measureText({ textContent: this.message })build() {Column() {Text(this.message).backgroundImage($r('app.media.startIcon')).backgroundImageResizable({slice: {top: 3,left: 3,bottom: 3,right: 3}}).backgroundImageSize({ width: this.textWidth })}.height('100%').width('100%')}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73107.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73107.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全鏈條自研可控|江波龍汽車存儲“雙輪驅動”體系亮相MemoryS 2025

3月12日,MemoryS 2025在深圳盛大開幕,匯聚了存儲行業的頂尖專家、企業領袖以及技術先鋒,共同探討存儲技術的未來發展方向及其在商業領域的創新應用。江波龍董事長、總經理蔡華波先生受邀出席,并發表了題為《存儲商業綜合創新》的主…

基于Python+SQLite實現校園信息化統計平臺

一、項目基本情況 概述 本項目以清華大學為預期用戶,作為校內信息化統計平臺進行服務,建立網頁端和移動端校內信息化統計平臺,基于Project_1的需求實現。 本項目能夠滿足校內學生團體的幾類統計需求,如活動報名、實驗室招募、多…

(每日一題) 力扣 2418. 按身高排序

文章目錄 🦄 LeetCode 2418.按身高排序|雙解法對比與下標排序的精妙設計📝 問題描述💡 解法思路分析方法一:Pair打包法(直接排序)方法二:下標排序法(當前實現&#xff09…

計算機畢業設計:ktv點歌系統

ktv點歌系統mysql數據庫創建語句ktv點歌系統oracle數據庫創建語句ktv點歌系統sqlserver數據庫創建語句ktv點歌系統springspringMVChibernate框架對象(javaBean,pojo)設計ktv點歌系統springspringMVCmybatis框架對象(javaBean,pojo)設計 ktv點歌系統mysql數據庫版本源碼&#xf…

Deepin通過二進制方式升級部署高版本 Docker

一、背景: 在Deepin系統中通過二進制方式升級部署高版本 Docker,下面將詳細介紹二進制方式升級部署高版本 Docker 的具體步驟。 二、操作步驟 1.根據需求下載二進制文件,下載地址如下: https://mirrors.tuna.tsinghua.e…

2025年Draw.io最新版本下載安裝教程,附詳細圖文

2025年Draw.io最新版本下載安裝教程,附詳細圖文 大家好,今天給大家介紹一款非常實用的流程圖繪制軟件——Draw.io。不管你是平時需要設計流程圖、繪制思維導圖,還是制作架構圖,甚至是簡單的草圖,它都能幫你輕松搞定。…

道路運輸安全員考試備考:循序漸進,穩步提升

備考道路運輸安全員考試是一個循序漸進的過程,需要穩步提升自己的知識和能力。? 第一階段是基礎鞏固階段。這一階段要以教材為核心,全面系統地學習各個知識板塊。從道路運輸法規開始,逐章逐節地學習,理解每一條法規的含義和適用…

滑動窗口(2)——哈希表輔助的滑動窗口算法

歡迎來到博主的專欄:算法解析 博主ID:代碼小豪 文章目錄 leetcode438——找到字符串中所有字母異位詞題目解析算法原理題解代碼 leetcode30——串聯所有單詞的子串題目解析算法原理題解代碼 leetcode438——找到字符串中所有字母異位詞 題目解析 異位詞…

Deepseek -> 如何寫 Dockerfile

嗯,用戶問的是如何制作Dockerfile,我得先理清楚步驟。首先,Dockerfile的基礎結構是什么?應該從基礎鏡像開始,對吧?比如FROM指令。然后可能需要設置工作目錄,用WORKDIR。接著復制文件&#xff0c…

RabbitMQ重復消費如何解決

消息重復消費的原因 生產者重試:網絡波動導致生產者未收到 Broker 確認,重復發送消息。消費者失敗:消費者處理消息后未發送 ACK,消息重新入隊。集群故障轉移:主節點宕機,未確認消息被重新投遞。 解決方案 …

Node-RED基礎1

目錄 一、概述二、安裝三、基操四、通訊五、數據六、節點七、 應用END 一、概述 Rode-Red是什么? 基于Node.js的物聯網開發工具,做API、通訊;提供了一些基本的監控功能,可在編輯器界面中查看節點的運行狀態、消息流量等信息。通…

java登神之階之順序表

一、了解List接口 在Java中,List接口是一個非常重要的集合框架接口,它繼承自Collection接口(Collection接口繼承Iterable接口)。List接口定義了一個有序集合,允許我們存儲元素集合。并且可以根據元素的索引來訪問集合中…

redux_舊版本

reduxjs/toolkit(RTK)是 Redux 官方團隊推出的一個工具集,旨在簡化 Redux 的使用和配置。它于 2019 年 10 月 正式發布,此文章記錄一下redux的舊版本如何使用,以及引入等等。 文件目錄如下: 步驟 安裝依…

MySQL:SQL優化實際案例解析(持續更新)

文章目錄 一、MySQL:SQL優化1、時間格式化問題(字符串)2、in/inner join的問題 一、MySQL:SQL優化 1、時間格式化問題(字符串) -- 優化前 SELECT * FROM test_table WHERE date_format( begin_time, %Y-%…

【含文檔+PPT+源碼】基于Python的美食數據的設計與實現

項目介紹 本課程演示的是一款基于Python的美食數據分析系統,主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 包含:項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 帶你從零開始部署運行本套系統 該項目附帶的源碼…

vue調整表格樣式之深度修改

舉例&#xff1a; <div class"grid-item"><h3>日數據</h3><el-table :data"dailyData" v-loading"loading"><el-table-column label"銷售姓名" align"center" prop"salesName" />…

【Go每日一練】統計字符出現的次數

&#x1f47b;創作者&#xff1a;丶重明 &#x1f47b;創作時間&#xff1a;2025年3月9日 &#x1f47b;擅長領域&#xff1a;運維 目錄 1.&#x1f636;?&#x1f32b;?題目&#xff1a;統計字符出現的次數2.&#x1f636;?&#x1f32b;?代碼中可用的資源3.&#x1f636;…

uniapp在APP平臺(Android/iOS)選擇非媒體文件

TOC 背景 在我們APP開發過程中&#xff0c;經常會有這樣一個需求場景&#xff1a;從手機中選擇文件然后進行上傳&#xff0c;這些文件主要分為兩類&#xff0c;媒體文件和非媒體文件。而媒體文件選擇在APP平臺我們可以使用uni.chooseImage和uni.chooseVideo這兩個API來實現。…

【eNSP實戰】配置交換機端口安全

拓撲圖 目的&#xff1a;讓交換機端口與主機mac綁定&#xff0c;防止私接主機。 主機PC配置不展示&#xff0c;按照圖中配置即可。 開始配置之前&#xff0c;使用PC1 ping 一遍PC2、PC3、PC4、PC5&#xff0c;讓交換機mac地址表刷新一下記錄。 LSW1查看mac地址表 LSW1配置端…

卡爾曼濾波算法從理論到實踐:在STM32中的嵌入式實現

摘要&#xff1a;卡爾曼濾波&#xff08;Kalman Filter&#xff09;是傳感器數據融合領域的經典算法&#xff0c;在姿態解算、導航定位等嵌入式場景中廣泛應用。本文將從公式推導、代碼實現、參數調試三個維度深入解析卡爾曼濾波&#xff0c;并給出基于STM32硬件的完整工程案例…