RN(React Native)

article/2025/10/3 21:26:43

 RN是React的原生组件库

网址:React Native 中文网 · 使用React来编写原生应用的框架

一、ReactNative开发环境的搭建

 在本机搭建RN项目开发运行环境 —— 3GB+

 ①安装必需的编译软件:Node.js + JDK

 ②安装Android原生App开发软件 —— Android Studio

 ③使用Android开发软件下载编译必需的第三方模块—— Android SDK

 ④配置系统的环境变量,告诉系统Android SDK的安装路径

 ⑤下载并安装RN项目脚手架工具,创建空白项目  

npx   react-native   init   MyRnApp

 ⑥编译空白项目,得到AndroidApp安装文件

cd  MyRnApp

npx  react-native   run-android

RN英文官网: reactnative.dev

RN中文网:reactnative.cn

运行RN空白项目 —— 254MB+

  1.安装并启动Android模拟器(例如夜神、雷电、逍遥等)

  2.在模拟器中安装空白项目中的.apk文件

@\android\app\build\outputs\apk\debug\app-debug.apk

  3.启动空白脚手架项目自带的开发服务器

npm  start

  4.启动手机中的App,配置开发服务器的IP地址和端口号

172.163.100.77:8081

  5.重启手机中的App,即可以自动连接到开发服务器

手机中无法见到“Welcome To ReactNative”欢迎界面的可能原因:

① 没有启动开发服务器

② 手机App没有正确的配置开发服务器IP和端口号

③ 配置完服务器地址后没有重新启动App

手机中App无法启动,或提示“MyRnApp启动失败”,或闪退,或白屏 解决办法:

① 重启App试试;如果不行,继续②

② 卸载App,再重新安装;重启后重新配置服务器IP和端口号;如果不行,继续③

③ 重启模拟器,重新安装App,重新配置服务器IP和端口号;如果不行,继续④

④ 重启Windows,重启模拟器,重新安装App,重新配置服务器IP和端口号;如果不行,继续⑤

⑤ 卸载夜神,换其他模拟器

三、RN项目中的样式问题

 RN中没有CSS;

 有一套自己的样式规则,其中有些与标准的CSS名称相近而已——RN项目被编译为Java或OC,运行时完全脱离浏览器的!!!

 声明组件的样式只能用style,没有class —— RN中没有任何一个属性/事件是“通用”的

 具体的样式编写规则:

 1.View组件的display属性只有两个可取值:flex(默认)、none;没有inline、block等;

 2.所有的容器都是弹性容器,主轴方向默认都是column,而不是row;

 3.RN中没有float属性,不能使用浮动/流式布局;

 4.RN中有position属性,可取值只有relative/absolute/fixed;

 5.组件的样式有三种形式:

行内样式:<Text style={{color:'red'}}>

内部样式:let ss = StyleSheet.create({danger:{color:'red'}})   

<Text style={ss.danger}>

外部样式:export default let gss = StyleSheet.create({danger:{color:'red'}})   

import gss from 'style.js'   <Text style={gss.danger}>

 6.RN中的样式没有Cascading(级联)特性,即父组件的样式不会继承给子组件——Text中的Text除外

 7.RN中的尺寸单位只有两种:%、px;而且像素需要省略px,例如:200px需要简写为200;

 8.默认字体大小也是14px,且没有最小值限制;

 9.RN中所有的样式都是“单值的”,一个属性只能赋一个值,例如:padding: 30;  错误:padding: 30  50;

   所有需要赋值为“多值的”的样式,都被取消了,例如:border、background。

、RN中的常用组件

  1、Text:文本组件,RN中唯一可以放置文本的组件

  2、View:视图容器,默认采用弹性布局

  3、Image:图片,分为两种形式:

①手机本地的图片(静态图片):使用时务必把图片打包入App(即必需导入)

let  logo = require('../img/logo.png')

import  logo  from  '../img/logo.png'

<Image source={logo}/>

②远程服务器上的图片(动态图片):使用时必须明确指定宽高尺寸(否则默认宽高都是0)

<Image style={{width: 100, height: 50}}  source={{uri: '图片地址'}}/>

提示:Image没有onPress或类似的属性。

  4、ImageBackground:背景图组件,为其中包含着的组件添加背景图

<ImageBackground  source={本地或远程图片}> 其它任意组件 </ImageBackground>

  5、Button:按钮组件,是一个单标记标签,不能添加innerText;没有style属性!!! 

<Button title="登录" onPress={处理方法}/>

提示:由于Button无法使用style订制样式,项目中一般用Text代替。

 6、Pressable:可按压的组件,为其它组件添加“按压”相关的4个事件

<Pressable onPress={} onLongPress={} onPressIn={} onPressOut={}>其它组件</Pressable>

 7、TextInput:文本输入组件,可用于单行文本输入框、单行密码输入框、多行文本输入框

<TextInput placeholder="" secureTextEntry={} multiline={}  value={}  onChangeText={}/>

提示:获取用户的输入值,只能使用类似“受控组件”方案(没有“非受控组件”方案),且onChange事件替换为onChangeText —— RN此时没有完全模拟出DOM操作!!

 8、FlatList:平面列表,用于“纵向”或 “横向”或“横+纵向”呈现批量数据

<FlatList  data={数组}  renderItem={渲染一个列表项的方法}/>

 9、TouchableOpacity:触摸后不透明度发生改变的组件,主要为其它元素添加点击反馈

<TouchableOpacity>需要添加点击反馈的子组件</TouchableOpacity>

 10、ActivityIndicator:活动指示器,显示一个不停旋转的加载中提示动画

AJAX异步数据请求效果有哪些实现方案?

①XHR  ②jQuery.ajax()  ③axios   ④wx.request   ⑤uni.request   ⑥fetch

、RN中的异步数据请求

  React项目中如果是基于浏览器的,可以使用XHR或fetch任意方案;

  RN项目都是脱离浏览器的,不能使用XHR;官方模拟fetch API标准实现了一套类似的接口。

//使用fetch发起GET请求

let res = await fetch( url )

let data = await res.json( )

//使用fetch发起POST请求

let options = {method, headers, body}

let res = await fetch( url, options )

let data = await res.json( )

框架

路由导航

Vue.js

Vue-Router

小程序

pages.json + 五个跳转方法

uni-app

pages.json + 五个跳转方法

React

基于浏览器的项目:React-Router-DOM

脱离浏览器的RN项目:React-Navigation

六、RN中的路由导航模块 —— React-Navigation

  是一个专用于脱离浏览器的RN项目的路由导航模块;

  英文官网: https://reactnavigation.org

  简历上:“熟练使用英文手册 —— 大标题字+示例代码”

  基础使用步骤:

  ①在RN项目中下载导航必需的第三方模块

npm  i   @react-navigation/native

npm  i   react-native-screens

     npm  i   react-native-safe-area-context

npm  i   @react-navigation/native-stack

  ②重新构建一遍当前的App安装文件重新安装到手机中

npx  react-native   run-android        此步需要安装3GB+的开发环境

  ③在启动模块中创建路由器>路由词典>路由”

let {Navigator, Screen} = createNativeStackNavigator()

<NavigationContainer>

<Navigator>

<Screen name="login" component={AdminLogin}/>

....

</Navigator>

</NavigationContainer>

  ④访问测试确保每个地址都可以显示出对应的组件

  ⑤修改标题栏文字及样式

<Screen name=" " component={ }  options={{title: ' ', ...}}/>

  ⑥如何在两个 屏幕/页面 间跳转
导航跳转:props.navigation.navigate('路由名称')

导航返回:props.navigation.goBack( )

  ⑦页面跳转时传递路由参数

Screen1:props.navigation.navigate('Screen2',  {k1: v1,  k2: v2, ...})   //类似于父子组件间发射事件

Screen2:组件挂载时  let v2 = props.route.params.k2

?k=v&k=v 称为“查询字符串”或“搜索参数” —— 是HTTP协议的一部分,用于规定客户端浏览器与WEB服务器之间传递数据的格式要求

React生态系统中成员的最新版本:

React:18.2

React-Router-DOM:6.4

React Native:0.70

React-Navigation:6.x

、RN中的innerHTML绑定

技术

innerText绑定

innerHTML绑定

Vue.js

小程序/uni-app

React

ReactNative

<Text>{内容}</Text>

RN项目脱离浏览器的,无法解释执行HTML片段!

只能在RN项目中嵌入一个微型浏览器才行——WebView组件!

<WebView  source={{uri: 'https://tmooc.cn'}}/>

<WebView  source={{html: '<h1>标题</h1><hr/>'}}/>

提示:ReactNative官方的WebView已经禁止使用了;推荐使用社区提供的react-native-webview,但此组件的高度无法自动增长,推荐使用第三方提供的 AutoHeightWebView 组件;使用方法:

①下载必需模块文件

npm  i   react-native-webview

npm  i   react-native-autoheight-webview

②重新构建一遍整个RN项目,得到新的.apk文件,重新安装到手机中

npx  react-native  run-android

③在页面中使用AutoHeightWebView

<AutoHeightWebView  source={{uri: 'https://tmooc.cn'}}/>

<AutoHeightWebView  source={{html: '<h1>标题</h1><hr/>'}}/>

、RN项目构建        

  RN项目最终都被编译为原生Java或Objective-C代码,有两种构建模式:

  ① 调试模式 —— 编译得到的代码未经优化,但是可以连接开发服务器进行实时更新

  npx   react-native    run-android

  得到安装文件:  app-debug.apk——45MB

  ② 发布模式 —— 编译得到的代码经过优化压缩,可以发布到应用商店供用户正式使用

  得到安装文件:  app-release.apk——20MB

     类似于之前的 npm run build 操作;但是本质不同:是把JS=>Java,编译Java项目(需要Gradle)

  提示:想执行此操作,必须之前安装好3GB+的环境了

  打包发布RN应用为Android APP的步骤

  官网手册地址:https://www.react-native.cn/docs/signed-apk-android

  ①生成一个签名密钥(即App所有权证书)

keytool   -genkeypair   -v   -storetype   PKCS12   -keystore  d:/my-release-key.keystore  -alias  my-key-alias  -keyalg  RSA   -keysize  2048   -validity   10000

提示:keytool.exe文件在JDK的安装目录下的/bin目录下,上述命令必须在此目录下运行

  ②设置gradle变量(Gradle就是Java项目中的“Webpack”)

把my-release-key.keystore文件放到你工程中的/android/app文件夹下

修改/android/gradle.properties,在最后添加如下变量的声明:

MYAPP_RELEASE_STORE_FILE=my-release-key.keystore

MYAPP_RELEASE_KEY_ALIAS=my-key-alias

MYAPP_RELEASE_STORE_PASSWORD=*****

MYAPP_RELEASE_KEY_PASSWORD=*****

  ③把证书相关变量加入到项目的gradle配置中

修改/android/app/build.gradle,在第148行后添加:

release {

            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {

                storeFile file(MYAPP_RELEASE_STORE_FILE)

                storePassword MYAPP_RELEASE_STORE_PASSWORD

                keyAlias MYAPP_RELEASE_KEY_ALIAS

                keyPassword MYAPP_RELEASE_KEY_PASSWORD

            }

     }

修改第176行,把 signingConfig signingConfigs.debug  修改为 signingConfig signingConfigs.release

  (可选)修改App图标和名称

修改\android\app\src\main\res\values\strings.xml文件,可以设置App的名字:

<string name="app_name">学子管理端</string>

把自己的App图标文件替换默认的,替换掉\android\app\src\main\res\mipmap-xxxx目录下的所有图标

  ⑤如果App需要访问网络(例如:访问服务器端数据API),需要向用户申请网络使用权限

在\android\app\src\main\AndroidManifest.xml中确保有如下行:

    <uses-permission android:name="android.permission.INTERNET" />

  使用gradle编译项目生成发行版的APK文件

进入项目的/android,运行此目录下的文件:

gradlew  assembleRelease

  成功后,在\android\app\build\outputs\apk\release\下得到app-release.apk,可以发布到各大应用市场或者直接下载到手机安装即可

API-1.1: 管理员登录:

https://www.codeboy.com/xuezi/admin/data/admin_login.php?aname=admin&apwd=123456

API-1.2: 当前登录的管理员可用的功能菜单: 

https://www.codeboy.com/xuezi/admin/data/main_menu.php

API-1.3: 商品列表:

https://www.codeboy.com/xuezi/admin/data/product_list.php?pno=2&pageSize=10

API-1.4: 商品详情:

https://www.codeboy.com/xuezi/admin/data/product_details.php?lid=3


http://chatgpt.dhexx.cn/article/d0BMuVnc.shtml

相关文章

优化Linux系统性能的必杀技:调整进程优先级!学会使用nice命令,让你的系统飞一般的顺畅!

文章目录 前言一. nice命令介绍1.1 nice的介绍1.2 cpu资源的调度1.3 nice是控制内核吗&#xff1f; 二. 语法格式及常用选项三. 参考案例3.1 将ls命令的优先级调整为最高3.2 将 find 命令的优先级调整为最低3.3 如何查看nice值 四. nice和renice的区别总结 前言 大家好&#x…

Linux nice及renice命令使用

Linux nice及renice命令使用 引言: linux内核是一个了不起的马戏表演者,它在进程和系统资源之间小心地玩着杂耍,并保持系统的正常运转。同时,内核也很公平,它将资源公平地分配给各个进程。但是,如果用户需要给一个重要进程提高优先级、或是降低优先级,该怎么办呢?答案是…

Linux进程监测和操控之top、ps、kill、nice、renice命令

文章目录 1、概述2、动态监测进程信息&#xff1a;top命令2.1、Linux系统的整体情况2.2、Linux进程的情况2.3、监控指定进程 3、静态查看进程信息&#xff1a;ps命令3.1、查看进程的资源占用3.2、查看父进程ID3.3、查看指定进程的内存占用 4、结束进程5、进程优先级5.1、启动程…

linux的nice 命令和renice命令

二者没有太大的区别&#xff0c;都是用于改变进程的优先级&#xff0c;所谓的优先级就是谁有更大的机会先执行&#xff0c;那么为什么要有nice这个命令呢&#xff1f;nice”是指“niceness”&#xff0c;即友善度&#xff0c;所以这个值越小的话&#xff0c;比如-10&#xff0c…

Linux 中的 renice 命令详解及C/C++代码实现

Linux 中的 nice 命令有助于执行具有修改的调度优先级的程序/进程。 它启动具有用户定义的调度优先级的进程。 如果我们给一个进程更高的优先级&#xff0c;那么内核会为这个进程分配更多的 CPU 时间。 而 renice 命令允许您更改和修改已运行进程的调度优先级。 什么是进程 …

Java之throw和throws的区别

throw和throws的区别 共同点区别总结 共同点 两者在抛出异常时&#xff0c;抛出异常的方法并不负责处理&#xff0c;顾名思义&#xff0c;只管抛出&#xff0c;由调用者负责处理。 区别 &#xff08;1&#xff09;throws用于方法头&#xff0c;表示的只是异常的申明&#xf…

Throw和Throws详解

Throw和Throws详解 ​ 1.throw是什么&#xff1f;有什么用&#xff1f; ​ throw是java中关于异常的一种操作&#xff0c;如果在try{}catch{}中使用了throw&#xff0c;就代表自己书写的这个方法&#xff0c;可以自己 处理异常了&#xff0c;就是抛出的一个动作&#xff0c;可…

Java异常:throw 和 throws的区别

throws&#xff1a;用来声明一个方法可能抛出和所有异常的信息&#xff0c;表现出现异常的可能性&#xff0c;但并不一定会发生异常。&#xff08;可以理解为为了预防异常的出现&#xff0c;而用throws提前声明一下&#xff09; throw&#xff1a;指抛出的一个具体的异常类型&…

Throws和Throw的区别?

在初学Java异常时&#xff0c;总是被throws和throw搞晕&#xff0c;今天来理一下它们之间的关系。 1、throws 方法名后面跟上 throws Exception 证明这个方法里的语句可能会发生异常&#xff0c;注意是可能&#xff01;在别处如果调用这个方法时&#xff0c;就必须也抛出异常…

再探java基础——throw与throws

再探java基础——throw与throws 以前虽然知道一些异常的处理&#xff0c;也用过一些&#xff0c;但是对throw和throws区别还是有不太清楚。今天用实例测试一下。 异常处理机制 异常处理是对可能出现的异常进行处理&#xff0c;以防止程序遇到异常时被卡死&#xff0c;处于一…

try catch 和throw以及throws的使用

转载&#xff1a;https://www.cnblogs.com/zhangdaicong/p/6127984.html try-catch和throw,throws的区别 java里的异常多种多样&#xff0c;这是一种非常有用的机制&#xff0c;它能帮助我们处理那些我们未知的错误&#xff0c;在java里&#xff0c;关于异常的有throw throws…

Java异常之throw,throws和Throwable

Java异常处理中有throw开头的三兄弟&#xff0c;分别是throw,throws以及Throwable&#xff0c;那么他们之间到底怎么区分呢&#xff0c;且听我慢慢道来。 Throwable Throwable是一个类&#xff0c;该类被异常类Exception以及错误类Error继承&#xff0c;其主要结构如下&#…

Java throws 使用

在开发中&#xff0c;如果去调用别人写的方法时&#xff0c;是否能知道别人写的方法是否会发生异常&#xff1f;这是很难判断的。针对这种情况&#xff0c;Java总允许在方法的后面使用throws关键字对外声明该方法有可能发生异常&#xff0c;这样调用者在调用方法时&#xff0c;…

【JavaSE】throws 异常处理

文章目录 1. 基本介绍2. 快速入门案例3. 注意事项和使用细节 1. 基本介绍 如果一个方法(中的语句执行时)可能生成某种异常&#xff0c;但是并不能确定如何处理这种异常&#xff0c;则此方法应显示地声明抛出异常&#xff0c;表明该方法将不对这些异常进行处理&#xff0c;而由…

throws异常

在程序开发过程中&#xff0c;程序员会尽量避免错误的发生&#xff0c;但是总会发生一些不可预测的事情&#xff0c;例如除法运算时除数为0 、内存不足、栈溢出等&#xff0c;这些就是异常&#xff0c;java语言提供了异常的处理机制&#xff0c;处理一些不可预期的事情。 使用t…

Elasticsearch之利用bulk提高写入性能(含源码分析)

什么是bulk操作 bulk是批量的意思&#xff0c;也就是把原来单个的操作打包好&#xff0c;通过批量的api提交到ES集群。下面是个示例&#xff1a; 单个操作&#xff1a; PUT my-index-000001/_doc/1 {"timestamp": "2099-11-15T13:12:00","message&…

.NET5必备工具——EF大数据批量处理----Bulk系列

之前做项目的时候&#xff0c;如果在大批量操作数据时,性能不好.因为在框架中使用了EntityFramework&#xff0c;于是就搜索到某著名插件,Z系列。 1.安装 然后在类里面添加引用之后,使用DbContext就可以直接点出来。 2.博客园有人做过对比试验 我们直接拿数据说话吧. EF传统…

初识ElasticSearch(5) -批量操作之bulk | 条件查询 | 其它查询

1. bulk&#xff1a;1.1. bulk语法&#xff1a;1.2. bulk行为-增删改&#xff1a; 2. bulk-index批量插入&#xff1a;3. bulk-update批量修改&#xff1a;4. bulk-delete批量删除&#xff1a;5. _update_by_query条件更新&#xff1a;6. _delete_by_query条件删除&#xff1a;…

mysql bulkupdate_Bulk Upsert for MySQL PostgreSQL

什么是 Upsert "UPSERT" is a DBMS feature that allows a DML statements author to atomically either insert a row, or on the basis of the row already existing, UPDATE that existing row instead, while safely giving little to no further thought to con…

JPA 2.1: Bulk Update and Delete

为什么80%的码农都做不了架构师&#xff1f;>>> JPA 2.1: Bulk Update and Delete In the JPA 2.0 and early version, if you want to execute a bulk updating query, you have to use update or delete clause in JPQL directly. JPA 2.1 introduce new Criteri…