当前位置: 首页 > news >正文

0 基础入门React Native鸿蒙跨平台开发:useWindowDimensions会在屏幕尺寸变化时自动更新获取到的设备width和height值

本文是基于HarmonyOS API 24的进行的ReactNative 鸿蒙跨平台开发依托适配鸿蒙的 RN 运行层,使用 React 与 JS 编写一套业务代码,无需大量 ArkTS 原生开发,通用业务实现代码复用,支持按需扩展原生桥调用鸿蒙特有能力,有效降低多平台开发维护成本。

ReactNative 鸿蒙跨平台开发,简单来说就是基于 ReactNative 技术栈,依托鸿蒙平台适配层,使用 JavaScript 与 React 语法编写一套业务代码,经过编译适配后同时支撑鸿蒙应用、安卓、iOS 等多端运行的开发方案。开发者沿用前端熟悉的组件化、状态管理等 React 开发范式,不用分别针对鸿蒙原生 ArkTS、安卓原生、iOS 原生独立实现相同业务逻辑,依靠桥接层完成 JS 逻辑与鸿蒙原生能力的通信,调用鸿蒙的窗口、媒体、设备硬件等系统接口,最终打包生成鸿蒙应用安装包,兼顾开发效率与多端复用能力,同时也存在部分鸿蒙特有系统能力需要编写原生桥模块进行扩展适配,复杂交互、高性能场景下要权衡跨平台通用方案与原生开发的取舍。

ReactNative 鸿蒙跨平台开发优势:

  • 1.前端开发者直接复用已有的 React 开发经验与存量业务代码,一套代码可同时产出鸿蒙、安卓、iOS 多端应用,大幅降低多平台分别开发、维护的人力与时间成本,迭代更新时多数业务改动只需修改一处代码就能同步生效
  • 2.借助 JS 热更新机制还能绕过应用商店快速推送功能修复与轻度版本变更
  • 3.依托成熟的 React 生态,海量第三方组件、工具库可以直接接入,不用从零适配鸿蒙原生开发体系,上手门槛更低
  • 4.熟悉网页与 React 技术的开发人员可以快速转型参与鸿蒙应用建设;
  • 5.框架内置 JS 与原生的通信桥,基础 UI、网络、存储等通用设备能力开箱可用

大部分常规业务场景无需编写原生扩展模块,同时支持按需开发鸿蒙原生桥接模块调用系统独有能力,在跨端复用和平台特性之间保留灵活平衡,相比纯原生多端开发,团队可以更快完成产品落地,适合业务频繁迭代、需要同时覆盖多终端的中小型应用场景。

useWindowDimensions

import{useWindowDimensions}from'react-native';

useWindowDimensions会在屏幕尺寸变化时自动更新获取到的设备width和height值。使用方法如下:

constwindowWidth=useWindowDimensions().width;constwindowHeight=useWindowDimensions().height;

好的,我们来详细了解一下 React Native 中的useWindowDimensionsHook。

useWindowDimensions是 React Native 提供的一个强大的 Hook,用于在函数组件中获取当前窗口(或屏幕)的尺寸信息,并且它具备自动更新的能力,非常适合构建响应式界面。

核心功能与优势

与传统的DimensionsAPI 相比,useWindowDimensions的最大优势在于响应式。

  • 自动更新:当设备方向改变(横屏/竖屏)、可折叠设备屏幕展开/折叠、或系统字体大小变化时,useWindowDimensions会自动重新渲染组件并提供最新的尺寸数据。
  • 函数组件首选:对于函数组件,React 官方文档明确推荐使用useWindowDimensions而不是DimensionsAPI,因为它更符合 Hook 的编程范式,能更好地管理副作用。

基本使用方法

import { useWindowDimensions } from 'react-native'; function MyComponent() { // 使用 Hook 获取当前窗口的宽高 const { width, height } = useWindowDimensions(); return ( <View style={{ width: '100%', height: '100%' }}> <Text>屏幕宽度: {width}</Text> <Text>屏幕高度: {height}</Text> </View> ); }

返回的属性详解

useWindowDimensions返回一个包含以下属性的对象:

属性类型说明
widthnumber窗口或屏幕的宽度(以像素为单位)。这是最常用的属性。
heightnumber窗口或屏幕的高度(以像素为单位)。这是最常用的属性。
scalenumber设备的像素密度比例。例如,1 表示标准分辨率(96 DPI),2 表示高清屏(Retina 显示屏)。
fontScalenumber系统字体缩放比例。用户可以在系统设置中调整字体大小,此属性可以获取到当前的实际缩放值,有助于实现字体大小自适应。

重要注意事项与最佳实践

  1. 避免缓存尺寸值:
    虽然尺寸信息在组件首次渲染时可用,但它可能会在后续因设备方向变化等原因而改变。因此,不要将获取到的widthheight值缓存起来(例如存入变量或状态),而应在每次渲染时都通过useWindowDimensions()获取最新值。

  2. 适用于内联样式:
    基于尺寸的样式计算,建议使用内联样式(Inline Styles)或动态样式生成函数,而不是在StyleSheet.create中预先定义。

    // 推荐:使用内联样式 <View style={{ width: useWindowDimensions().width * 0.5 }} /> // 不推荐:缓存值(可能导致适配错误) const { width } = useWindowDimensions(); const styles = StyleSheet.create({ container: { width: width * 0.5, // 错误!width 可能过期 } });
  3. 结合其他工具实现完整适配:
    useWindowDimensions主要提供的是窗口尺寸。为了构建健壮的自适应界面,通常还需要结合其他工具:

    • SafeAreaView:确保内容在设备的安全区域(如刘海屏、圆角屏)内显示,避免被遮挡。
    • Platform模块:根据运行平台(iOS、Android)应用不同的样式或逻辑。
    • 第三方库:如react-native-responsive-dimensions等,可以提供更高级的响应式单位(如%vhvw)和 Hook。

与 Dimensions API 的对比

特性useWindowDimensions(Hook)Dimensions(API)
适用组件函数组件所有组件(函数和类)
自动更新是,方向变化时自动重新渲染否,需要手动监听change事件
使用便捷性更符合 Hook

实际代码参考:

importReactfrom"react";import{View,StyleSheet,Text,useWindowDimensions}from"react-native";constApp=()=>{constwindow=useWindowDimensions();return(<View style={styles.container}><Text>{`Window Dimensions: height -${window.height}, width -${window.width}`}</Text></View>);}conststyles=StyleSheet.create({container:{flex:1,justifyContent:"center",alignItems:"center"}});exportdefaultApp;

这段React Native代码实现了一个动态窗口尺寸显示应用,其核心功能是实时监测设备屏幕的宽度和高度,并通过用户界面直观地反馈当前尺寸。代码通过React Hooks和React Native的尺寸监听机制,构建了一个响应式布局组件。

在组件初始化阶段,代码使用useWindowDimensions Hook获取设备的当前窗口尺寸。这个Hook返回一个包含height和width属性的对象,分别表示屏幕的高度和宽度。通过解构赋值,代码将这两个值存储在window常量中。


组件的渲染逻辑基于StyleSheet.create定义的样式系统。container样式配置了flex: 1属性,使容器占据整个屏幕空间,并通过justifyContent和alignItems属性实现内容的垂直和水平居中对齐。这种布局设计确保了文本内容在不同设备上都能保持良好的视觉效果。

Text组件通过模板字符串动态显示窗口尺寸信息,格式为"Window Dimensions: height - [高度值], width - [宽度值]"。这种实时更新机制使得用户能够随时查看当前设备的屏幕尺寸,这对于开发响应式应用或调试布局问题非常有用。

整个应用的架构体现了React Hooks在状态管理中的现代应用。通过useWindowDimensions Hook,代码实现了对设备尺寸的实时监听,避免了手动计算和事件监听的复杂性。同时,这种声明式的UI设计模式确保了界面与数据的一致性,符合React的函数式编程理念。


安装DevEco Studio程序


选择目标安装目录:


设置环境变量,但是需要重启一下:


新建一个空白模板:


设置API为24的模板项目:

初始化项目,自动下载相关依赖:


打包

接下来通过打包命令npn run harmony将reactNative的代码打包成为bundle,这样可以进行在开源鸿蒙OpenHarmony中进行使用。


最后运行效果图如下显示:


http://www.jsqmd.com/news/1242489/

相关文章:

  • 2026年7月最新欧米茄宁波江北宝龙广场维修保养服务电话 - 欧米茄官方服务中心
  • TMS320F2837xS HRPWM高分辨率脉宽调制技术详解与工程实践
  • TI C2000 McBSP配置实战:SRG时钟与发送器全流程解析
  • 工业无线传感器网络标准
  • 2026成都奢表回收优质门店汇总,支持到店鉴定,拒绝隐形扣费 - 逸程奢侈品回收中心
  • 深入解析USB控制器中断与模式寄存器配置:从原理到实战
  • 2026 年 AI 标书工具选型全攻略:6 款主流平台实测对比,附避坑指南与场景匹配表
  • 新手必看:performance-optimization项目中的性能测试基础与实施步骤
  • 苏州回收古法黄金会不会扣损耗,焊点收费合理吗 - 生活时报
  • 苏仙区黄金回收哪家靠谱?2026 正规门店榜单出炉 - 黄金珠宝
  • 从FancyZones到MacsyZones:Windows用户迁移指南
  • uBlock Origin:3大核心优势打造极致浏览器隐私安全体验
  • 毕节市黔西市全屋定制哪家装修公司售后好 鸿福尚品整装大家居 13608524605 - 优企甄选
  • [PV]AXI R/W/RW带宽计算的tcl脚本
  • 天津河西区本地GEO获客怎么选?看这三点就够了
  • AI副业最后窗口期(仅剩18个月):头部技术IP正在抢占搜索/语音/Agent三大入口,错过再无低成本入场机会
  • 揭秘gh_mirrors/leet/leetcode-js:2000+题解背后的算法设计思路
  • 2026 济南历下名表回收门店实测,正规商家特征一览 - 好物测评局
  • 甄选专业的南京硬质合金刀厂家推荐, 数控加工选型经验分享 - 企师傅推荐官
  • 单细胞测序找到CAF线索后,PCF为什么比先做空转更贴近组织微环境观察?
  • 揭秘AirplaneJS工作原理:从RTL-SDR信号到浏览器地图的全流程解析
  • 【小程序课程设计/毕业设计】移动端智能预约报名与商品订购系统 便民生活预约订购数字化服务小程序 基于 SpringBoot 的订单预约生成与后台管理系统设计【附源码、数据库、万字文档】
  • GBDT二分类完整教程:GBDT_Simple_Tutorial从原理到代码实现
  • Blender角色绑定架构选型指南:从技术挑战到生产级解决方案
  • 原生鸿蒙像素画板实战 16:多项目管理
  • 原子工程用AC6编译不过问题
  • 计算机毕业设计之基于SpringBoot的全民健康守护平台设计与实现
  • 江棉斌:一个做新媒体培训机构的老板为什么要开发AI?
  • 2026 年广东厂房隔断、加气块隔墙施工,业主容易踩的几个大坑 - LYL仔仔
  • 2026年AI漫剧制作平台如何实现“漫剧一键生成”,6款AI动态漫生成平台盘点 - 品牌深度评测