React Native开发速记

news2024/11/26 23:49:25

文章目录

    • 引子
    • React Native适用场景
    • React基础
      • JSX
    • 组件的定义
    • 基础API
    • Flex弹性布局
      • 例子: Flex布局实现多行多列
    • 常用UI组件
    • 几个核心钩子函数
      • useState用法
      • useEffect典型用法
    • 和原生模块交互
      • 调用原生模块方法
    • 调试
    • 其它工具
    • UI框架
    • 参考资源

引子

软件开发,移动优先;移动开发,RN优先。为什么?RN的性能胜任大部分应用场景,开发效率奇高(前提当然是熟悉web和javascript),热更新,快速见效,出活快,画一个界面三言两语,比原生简洁多了。Flutter? Xamarin? NativeScript? Ionic? Cordova? 我还是选RN。有人担心RN不流行了,会被替代,大可不必,哪种技术能长命百岁?一个产品有三五年的周期就算长寿了。RN短期内死不了。新的JS引擎 Hermes也极大地改进了性能。

关键词:JSX、Flex布局、UI组件

React Native适用场景

大部分应用都可以采用RN,新闻资讯类自不必说,电商类,教育类,视频播放类,也不在话下。CPU密集型?游戏类?这个我没有尝试过。但就像Java和C++/C的关系一样,80~90%都可以由Java搞掂,剩下的C来搞掂。你能吃下90%的业务部分,你还担心什么?

在这里插入图片描述

React基础

JSX

JSX 是 React 的核心组成部分,它使用 XML 标记的方式去直接声明界面。JSX貌似丑陋,和JS代码耦合,但其背后的哲学是每个HTML都是由有生命的片段组合而成,有了对片段的良好编程,就能由简到繁,积小成大,去构建更庞大的应用。

组件的定义

组件有两种写法:类组件和函数式组件。
类的写法:

class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

函数写法:

function Welcome(props) { 
  const data = [
    { id: 1, name: "John Doe" },
    { id: 2, name: "Victor Wayne" },
    { id: 3, name: "Jane Doe" },
  ];
  return (
  	<View>
	  	<Text>Hello, {props.name}</Text>
	    <View className="users">
	      {data.map((user) => (
	        <Text className="user">{user}</Text>
	      ))}
	    </View>
    </View>
  );
}

函数组件就是可以返回一个ReactElement的函数。

基础API

在这里插入图片描述

在这里插入图片描述
ReactNode是一个联合类型:

type ReactNode =
  | ReactChild
  | ReactFragment
  | ReactPortal
  | boolean
  | null
  | undefined;
type ReactText = string | number;
type ReactChild = ReactElement | ReactText;

Flex弹性布局

定理采用Flex加上嵌套能实现任意布局

  • react 宽度基于pt为单位, 可以通过Dimensions 来获取宽高,PixelRatio 获取密度。

  • 基于flex的布局

    • view默认宽度为100%
    • 水平居中用alignItems, 垂直居中用justifyContent
    • 基于flex能够实现现有的网格系统需求,且网格能够各种嵌套无bug
  • 图片布局

    • 通过Image.resizeMode来适配图片布局,包括contain, cover, stretch
    • 默认不设置模式等于cover模式
    • contain模式自适应宽高,给出高度值即可
    • cover铺满容器,但是会做截取
    • stretch铺满容器,拉伸
  • 定位

    • 定位相对于父元素,父元素不用设置position也行
    • padding 设置在Text元素上的时候会存在bug。所有padding变成了marginBottom
  • 文本元素

    • 文字必须放在Text元素里边
    • Text元素可以相互嵌套,且存在样式继承关系
    • numberOfLines 需要放在最外层的Text元素上,且虽然截取了文字但是还是会占用空间

例子: Flex布局实现多行多列

容器: flex-wrap: wrap; 允许折行
元素有三种方式:

  • flex: 1 0 33.3%;
  • flex-basis: 33.3%;
  • width: 33.3%;

常用UI组件

View是最核心、最常用的UI组件。
VirtualizedList是FlatList和SectionList的底层实现。FlatList和SectionList都依赖一个数组,每个元素是个字典,SectionList的字典必须有data、title、key。

  • 不要在ScrollView里使用FlatList
 <View style={{flex: 1}} >
    <ScollView style={{flexGrow: 1}} 
     nestedScrollEnabled={true}>
        <View>
            <SafeAreaView>
                <ScrollView horizontal 
                style={{width: '100%', height: 'your_height'}}>
                  {data.map((item, index) => (
                    <View key={index}>
                      // Your component
                    </View>
                  ))}
                </ScrollView> -- Horizontal Scroll --
            </SafeAreaView>
        </View>        
    </ScrollView>
</View>

几个核心钩子函数

Hooks 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。Hooks 是一种在函数式组件中使用有状态函数的方法。Hooks不支持在class中使用,比如在class中使用useState和useEffect都是不允许的。

  • useEffect()函数:作用就是指定一个副效应函数,组件每渲染一次,该函数就自动执行一次。组件首次在网页 DOM 加载后,副效应函数也会执行。它的第二个参数,使用一个数组指定副效应函数的依赖项,只有依赖项发生变化,才会重新渲染。
  • useState()函数:用于为函数组件引入状态。
  • useContext():用于在组件之间共享状态。
  • useReducer():React 本身不提供状态管理功能,通常需要使用外部库。这方面最常用的库是 Redux。Redux 的核心概念是,组件发出 action 与状态管理器通信。状态管理器收到 action 以后,使用 Reducer 函数算出新的状态,Reducer 函数的形式是(state, action) => newState。
Hook函数说明
useState[<取值>, <设值>] = useState(<初始值>)
useEffect在组件加载和监听的对象值发生变化时调用
useContext
useLayoutEffect
useReducer
useCallback
useMemo
useRef返回一个mutable ref对象,用.current获得其值
useTransition
useDeferredValue
useId

useState用法

  • useState的更新是异步的,数据不会立即刷新的。其背后是队列实现的。
  • 仅顶层调用,不能在循环,条件,嵌套函数等中调用useState()。

useEffect典型用法

const [data, setData] = useState()
useEffect(() => {
  // declare the async data fetching function
  const fetchData = async () => {
    // get the data from the api
    const data = await fetch(`https://yourapi.com?param=${param}`);
    // convert the data to json
    const json = await response.json();
    // set state with the result
    setData(json);
  }

  // call the function
  fetchData()
    // make sure to catch any error
    .catch(console.error);;
}, [param])

再举一个例子:

import { useState, useEffect } from 'react';

const HackerNewsStories = () => {
  const [stories, setStories] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchStories = async () => {
      try {
        const data = await (await fetch('https://hn.algolia.com/api/v1/search_by_date?tags=front_page&hitsPerPage=20')).json();
        setStories(
          data.hits.sort((story, nextStory) => (story.points < nextStory.points ? 1 : -1))
        );
        setError(null);
      } catch (err) {
        setError(err.message);
        setStories(null);
      } finally {
        setLoading(false);
      }
    };
    fetchStories();
  }, []);

  return (
    <div className="wrapper">
      <h2>Latest HN Stories</h2>
      {loading && <div>HackerNews frontpage stories loading...</div>}
      {error && <div>{`Problem fetching the HackeNews Stories - ${error}`}</div>}
      <div className="stories-wrapper">
        {stories &&
          stories.map(({ objectID, url, title, author, points }) => (
            title && url &&
            <div className='stories-list' key={objectID}>
              <h3><a href={url} target="_blank" rel="noreferrer">{title}</a> - By <b>{author}</b> ({points} points)</h3>
            </div>                        
          ))}
      </div>
    </div>
  );
};

export default HackerNewsStories;

和原生模块交互

在使用 React 做开发时有两种写法:
类组件
函数组件 + Hook (用的这种)
React 组件之间共享数据的方案:
使用 React 自带的 Context + Reducer 功能 (用的这种)
优点:无须引入其他的包
缺点:只能向子组件及子孙组件中共享数据
使用 Redux 实际组件之间的共享
优点:数据全都放到 Redux 中管理,无论什么层级都直接使用
缺点:需要单独安装,数据状态由它统一管理,很多代码写法不太一样
RN 中的布局
View 组件默认是相对定位的(可以直接使用 left 、top 相对于原来的位置定位)
View 组件的绝对定位都是相对于父组件定位的(因为父组件都是相对定位,所以默认都是子绝父相)
没有浮动,只能 flex
父组件一定要设置高度或者 flex:1 ,否则高度为0页面空白

调用原生模块方法

要实现一个自己的ReactPackage和ReactModule,在ReactModule中暴露js方法。

调试

调试方面强烈推荐使用 React Native Debugger,一个基于 React Native 官方调试方式、包含 React Inspector / Redux DevTools 独立应用:

  • 基于官方的 Remote Debugger 且提供了更为丰富的功能
  • 包含 react-devtools-core 的 React Inspector
  • 包含 Redux DevTools, 且与 redux-devtools-extension 保持 API 一致

其它工具

  • Watchman, Watchman 在更改时观察文件和记录,然后触发相应的操作,并由 React Native 在内部使用

UI框架

  • react-native-elements
  • Ant Design Mobile RN

参考资源

  • https://github.com/jondot/awesome-react-native
  • https://github.com/reactnativecn/react-native-guide
  • Expo官网
  • https://taro.zone/
  • https://nervjs.github.io/taro-docs/docs/GETTING-STARTED
  • 下载 Genymotion免费版
  • 多终端开发
  • https://oblador.github.io/react-native-vector-icons/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/587184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

webAJAX概述.

1.1什么是AJAX. Ajax即AsynchronousJavascript And XML&#xff1a;异步数据回调。 使用Ajax技术网页应用能够快速地将更新呈现在用户界面上&#xff0c;不需要重载&#xff08;刷新&#xff09;整个页面【只刷新局部】&#xff0c;这使得程序能够更快地回应用户的操作。、 1…

使用Node. js输出到命令行

目录 1、使用控制台模块的基本输出 2、清除控制台 3、计数元素 4、复位计数 5、打印堆栈跟踪 6、计算花费的时间 7、stdout和stderr 8、为输出着色 9、创建进度条 1、使用控制台模块的基本输出 Node.js提供了一个console模块&#xff0c;它提供了大量非常有用的与命令…

Qt Quick系列(4)—定位元素

&#x1f680;作者&#xff1a;CAccept &#x1f382;专栏&#xff1a;Qt Quick 文章目录 前言相对布局代码示例示例一示例二示例三示例四示例五示例六 简单"布局器"ColumnRowGridFlow 结语 前言 在Qt Quick中&#xff0c;可以使用以下方式来定位元素&#xff1a;…

需要建立强大的网络响应框架

由于头条新闻充斥着网络攻击&#xff0c;因此企业制定网络响应框架变得前所未有的重要。当今的网络安全形势继续快速发展&#xff0c;黑客行动主义、民族国家支持的网络攻击、勒索软件和其他攻击策略变得更加危险、复杂&#xff0c;组织的防御成本也越来越高。随着企业进行数字…

华为OD机试真题B卷 Java 实现【名字的漂亮度】,附详细解题思路

一、题目描述 给出一个字符串&#xff0c;该字符串仅由小写字母组成&#xff0c;定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。 每个字母都有一个“漂亮度”&#xff0c;范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。 给出多个…

Ex-ChatGPT本地部署+Azure OpenAI接口配置+docker部署服务

Ex-ChatGPT项目分为 Ex-ChatGPT 和 WebChatGPTEnhance 两部分&#xff0c;Ex-ChatGPT启动后是个web服务&#xff0c;通过访问ip端口体验&#xff1b; WebChatGPTEnhance可编译生成一个浏览器插件&#xff0c;Chrome或者Microsoft edge浏览器可以安装该插件&#xff0c;点击该插…

Golang中文件目录操作的实现

目录 文件 文件目录 文件目录操作 读取文件 一、方法一 (file.Read()) 二、方法二 (bufio读取文件) 三、方法三 (ioutil 读取方法) 写入文件 一、方法一 二、方法二 三、方法三 (ioutil写入文件) 复制文件 一、方法一 二、方法二 文件 Golang中&#xff0c;文件是…

python异常处理速通

一.异常处理认识 1.基础认识 开发人员在编写程序时&#xff0c;难免会遇到错误&#xff0c;有的是编写人员疏忽造成的语法错误&#xff0c;有的是程序内部隐含逻辑问题造成的数据错误&#xff0c;还有的是程序运行时与系统的规则冲突造成的系统错误&#xff0c;等等。总的来说…

什么是肖特基二极管

普通二极管是由N型半导体和P型半导体接触制成&#xff0c;交界面形成PN结。 肖特基二极管是由N型半导体和金属接触制成&#xff0c;交界面形成肖特基结。 肖特基结的形成主要是因为N型半导体中的电子更容易逸出进入到金属&#xff0c;从而在接触面N型半导体失去电子形成正离子区…

python:绘制GAM非线性回归散点图和拟合曲线

作者&#xff1a;CSDN _养乐多_ 本文将介绍使用python语言绘制广义线性模型&#xff08;Generalized Additive Model&#xff0c;GAM&#xff09;非线性回归散点图和拟合曲线。并记录了计算RMSE、ubRMSE、R2、Bias的代码。 文章目录 一、GAM非线性回归详解二、代码三、计算RM…

docker 镜像/容器的打包、导出、导入

目录 一、将变动过的容器打包生成新的镜像 二、对镜像进行导出导入 1、将镜像导出为一个镜像img文件 2、将img镜像文件导入&#xff0c;复制出一个完全一样镜像 三、对容器进行导入导出 1、将容器导出为一个镜像tar文件 2、将镜像tar文件导入&#xff0c;生成一个新镜像…

Linux本地搭建GitLab服务器 - 内网穿透远程访问

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 转载自cpolar极点云文章&#xff1a;Linux搭建GitLab私有仓库&#xff0c;并内网穿透实…

vite构建的项目如何修改element Plus的主题样式

安装element plus 安装icon pnpm install element-plus pnpm install element-plus/icons-vue main.ts配置 icon的使用https://element-plus.gitee.io/zh-CN/component/icon.html#%E7%BB%93%E5%90%88-el-icon-%E4%BD%BF%E7%94%A8 import { createApp } from vue import ./sty…

【工具】vscode的常用插件之git插件

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

计算机视觉cv模型最新进展速看:

华为诺亚实验室等研究者提出动态分辨率网络 DRNet 深度卷积神经网络通畅采用精细的设计&#xff0c;有着大量的可学习参数&#xff0c;在视觉任务上实现很高精 确度要求。为了降低将网络部署在移动端成本较高的问题&#xff0c;近来发掘在预定义架构上的冗余 已经取得了巨大的…

Midjourney AI绘画中文教程详解(完整版)模型、命令、参数与各种高级用法

我有一种预感&#xff0c;您一下子看不完这篇内容&#xff0c;您得【收藏】一下&#xff0c;以便下次接着看~~ Midjourney AI绘画中文教程&#xff0c;Midjourney是一款2022年3月面世的AI绘画工具&#xff0c;创始人是David Holz。 只要输入想到的文字&#xff0c;就能通过人…

数据库sqlserver-----触发器的插入,更新和删除

在学习触发器之前&#xff0c;先弄清DDL,DML,DQL,DCL的区别: http://t.csdn.cn/Le3wA 触发器就是当执行某个事件的时候触发另一个事件的执行&#xff0c;根据事件的触发时间可分为 before和after Before与After区别&#xff1a;before&#xff1a;(insert、update)可以对new…

数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)

目录 题目描述 输入示例 输出示例 解题思路 解题方法&#xff08;C语言&#xff09; 解析 题目描述 有序的二叉树遍历可以用堆栈以非递归的方式实现。 例如&#xff1a; 假设遍历一个节点数为6的二叉树&#xff08;节点数据分别为1到6&#xff09;时&#xff0c; 堆…

immersive-translate 安装,个人觉得一款超级好用的浏览器翻译插件

immersive-translate 安装&#xff0c;个人觉得一款超级好用的浏览器翻译插件 immersive-translate 是什么Github 地址主要特性立即安装使用 immersive-translate immersive-translate 是什么 Immersive Dual Web Page Translation Extension - 沉浸式双语网页翻译扩展。 Git…

MSP432学习笔记5——外部中断

所用单片机型号&#xff1a;MSP432P401r 今日继续我的MSP432电赛速通之路。 外部中断是个很有用的配置 STM32几乎每个I/O口都能配置复用为外部中断 但MSP432并不是这样。 我经过查阅数据手册发现支持中断的引脚为&#xff1a; P1^0~ P1^7 P3^0~ P3^7 P5^0~ P5^…