【每日学点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.mzph.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硬件的完整工程案例…