iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >React中Native项目框架搭建的示例分析
  • 489
分享到

React中Native项目框架搭建的示例分析

2023-06-15 06:06:22 489人浏览 泡泡鱼
摘要

这篇文章主要介绍了React中Native项目框架搭建的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。React Native 是Facebook于2015年4月开源

这篇文章主要介绍了React中Native项目框架搭建的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

React Native 是Facebook于2015年4月开源的跨平台移动应用开发框架, 短短的一两年的发展就已经有很多家公司支持并采用此框架来搭建公司的移动端的应用,
React Native使你能够在javascript和React的基础上获得完全一致的开发体验,构建世界一流的原生APP。

项目框架与项目结构

1. 项目中使用的技术栈

react native、react hook、typescript、immer、tslint、jest等.

都是比较常见的,就不多做介绍了

2. 数据处理使用的是react hook中的useContext+useReducer

思想与redux是一致的,用起来相对比较简单,适合不太复杂的业务场景.

const HomeContext = createContext<IContext>({  state: defaultState,  dispatch: () => {}});const ContextProvider = ({ urlQuery, pageCode }: IProps) => {  const initState = getInitState(urlQuery, pageCode);  const [state, dispatch]: [IHomeState, IDispatch] = useReducer(homeReducer, initState);  return (    <HomeContext.Provider value={{ state, dispatch }}>      <HomeContainer />    </HomeContext.Provider>  );};
const HomeContainer = () => {const { dispatch, state } = useContext(HomeContext);...

3. 项目的结构如下

|-page1    |-handler   // 处理逻辑的纯函数,需进行UT覆盖    |-container // 整合数据、行为与组件    |-component // 纯UI组件,展示内容与用户交互,不处理业务逻辑    |-store     // 数据结构不能超过3层,可使用外部引用、冗余字段的方式降低层级    |-reducer   // 使用immer返回新的数据(immutable data)    |-...|-page2|-...

项目中的规范

1. Page

整个项目做为一个多页应用,最基本的拆分单元是page.

每一个page有相应的store,并非整个项目使用一个store,这样做的原因如下:

  • 各个页面的逻辑相对独立

  • 各个页面都可作为项目入口

  • 结合RN页面生命周期进行数据处理(避免数据初始化、缓存等一系列问题)

各个页面中与外部相关的操作,都在Page组件中定义

  • 页面跳转逻辑

  • 回退之后要处理的事件

  • 需要操作哪些storage中的数据

  • 需要请求哪些服务等等

Page组件的主要作用

以其自身业务模块为基础,把可以抽象出来的外部依赖、外部交互都集中到此组件的代码中.

方便开发人员在进行各个页面间逻辑编写、问题排查时,可根据具体页面+数据源,准确定位到具体的代码.

2. reducer

在以往的项目中,reducer中可能会涉及部分数据处理、用户行为、日志埋点、页面跳转等等代码逻辑.

因为在开发人员写代码的过程中,发现reducer作为某个处理逻辑的终点(更新了state之后,此次事件即为结束),很适合去做这些事情.

随着项目的维护,需求的迭代,reducer的体积不断的增大.

因为缺乏条理,代码量又庞大,再想去对代码进行调整,只会困难重重.

让你去维护这样的一个项目,可想而知,将会是多么的痛苦.

为此,对reducer中的代码进行了一些减法:

  • reducer中只对state的数据进行修改

  • 使用immer的produce产生immutable data

  • 冗余单独字段的修改,进行整合,枚举出页面行为对应的action

reducer的主要作用

以可枚举的形式,汇总出页面中所有操作数据的场景.

在其本身适用于react框架的特性之外,赋予一定的业务逻辑阅读属性,在不依赖UI组件的情况下,可大致阅读出页面中的所有数据处理逻辑.

// 避免dispatch时进行两次,且定义过多单字段的更新case// 整合此逻辑后,与页面上的行为相关联,利于理解、阅读case EFHListAction.updateSpecifyQueryMessage:    return produce(state, (draft: IFHListState) => {        draft.specifyQueryMessage = payload as string;        draft.showSpecifyQueryMessage = true;    });    case EFHListAction.updateShowSpecifyQueryMessage:    return produce(state, (draft: IFHListState) => {        draft.showSpecifyQueryMessage = payload as boolean;    });

3. handler

这里先引入一个纯函数的概念:

一个函数的返回结果只依赖于它的参数,并且在执行过程里面没有副作用,我们就把这个函数叫做纯函数.

把尽可能多的逻辑抽象为纯函数,然后放入handler中:

  • 涵盖较多的业务逻辑

  • 只能是纯函数

  • 必须进行UT覆盖

handler的主要作用

负责数据源到store、container到component、dispatch到reducer等等场景下的逻辑处理.

作为各类场景下,逻辑处理函数的存放地,整个文件不涉及页面流程上的关联关系,每个函数只要满足其输入与输出的使用场景,即可复用,多用于container文件中.

export function getFilterAndSortResult(  flightList: IFlightInfo[],  filterList: IFilterItem[],  filterShare: boolean,  filterOnlyDirect: boolean,  sortType: EFlightSortType) {  if (!isValidArray(flightList)) {    return [];  }  const sortFn = getSortFn(sortType);  const result = flightList.filter(v => doFilter(v, filterList, filterShare, 1, filterOnlyDirect)).sort(sortFn);  return result;}
describe(getFilterAndSortResult.name, () => {  test('getFilterAndSortResult', () => {    expect(getFilterAndSortResult(flightList, filterList, false, EFlightSortType.PriceAsc)).toEqual(filterSortResult);  });});

4. Container

由上面的项目结构图可以看出,每个Page都有base Container,作为数据处理的中心.

在此base Container之下,会根据不同模块,定义出各个子Container:

  • 生命周期处理(初始化时要进行的一些异步操作)

  • 为渲染组件Components提供数据源

  • 定义页面中的行为函数

Container的主要作用

整个项目中,各种数据、UI、用户行为的汇合点,要尽可能的把相关的模块抽离出来,避免造成代码量过大,难以维护的情况.

Container的定义应以页面展示的模块进行抽象.如Head Contianer、Content Container、Footer Container等较为常见的划分方式.

一些页面中相对独立的模块,也应该产出其对应的Container,来内聚相关逻辑,如赠送优惠券模块、用户反馈模块等.

特别注意的是行为函数

  • 多个Container中公用的行为,可直接放入base Container中

  • 在上文架构图中的action事例(setAction)为另外一种行为复用,根据具体的场景进行应用

利于代码阅读,A模块的浮层展示逻辑,B模块使用时
模块产生的先后顺序,先有A模块再有B模块需要使用A的方法

  • 定义数据埋点、用户行为埋点

  • 页面跳转方法的调用(Page-->base Container-->子Container)

  • 其他副作用的行为

const OWFlightListContainer = () => {    // 通过Context获取数据    const { state, dispatch } = useContext(OWFlightListContext);    ...    // 初次加载时进行超时的倒计时    useOnce(overTimeCountDown);    ...        // 用户点击排序    const onPressSort = (lastSortType: EFlightSortType, isTimeSort: boolean) => {        // 引用了handler中的getNextSortType函数        const sortType = getNextSortType(lastSortType, isTimeSort);        dispatch({ type: EOWFlightListAction.updateSortType, payload: sortType });                // 埋点操作        logSort(state, sortType);    };        // 渲染展示组件    return <.../>;}

小结

由easy to code到easy to read
在整个项目中,定义了很多规范,是想在功能的实现之上,更利于项目人员的维护.

  • Page组件中包含页面相关的外部依赖

  • reducer枚举出所有对页面数据操作的事件

  • handler中集合了业务逻辑的处理,以纯函数的实现及UT的覆盖,确保项目质量

  • Container中的行为函数,定义出所有与用户操作相关的事件,并记录埋点数据

  • Componet中避免出现业务逻辑的处理,只进行UI展示,减少UI自动化case,增加UT的case

规范的定义是比较容易的,想要维护好一个项目,更多的是依靠团队的成员,在达成共识的前提下,持之以恒的坚持了

分享几个实用的函数

根据对象路径取值

export function getVal(target: any, path: string, defaultValue: any = undefined) {  let ret = target;  let key: string | undefined = '';  const pathList = path.split('.');  do {    key = pathList.shift();    if (ret && key !== undefined && typeof ret === 'object' && key in ret) {      ret = ret[key];    } else {      ret = undefined;    }  } while (pathList.length && ret !== undefined);  return ret === undefined || ret === null ? defaultValue : ret;}// DEMOconst errorCode = getVal(result, 'rstlist.0.type', 0);

读取根据配置信息

// 在与外部对接时,经常会定义一些固定结构,可扩展性的数据列表// 为了适应此类契约,便于更好的阅读与维护,总结出了以下函数export const GLOBAL_NOTE_CONFIG = {  2: 'refund',  3: 'sortType',  4: 'featureSwitch'};export function getNoteValue<T>(  noteList: Array<T> | undefined | null,  config: { [_: string]: string },  keyName: string = 'type') {  const ret: { [_: string]: T | Array<T> } = {};  if (!isValidArray(noteList!)) {    return ret;  }  //@ts-ignore  noteList.forEach((note: any) => {    const typeStr: string = (('' + note[keyName]) as unknown) as string;    if (!(typeStr in config)) {      return;    }    if (note === undefined || note === null) {      return;    }    const key = config[typeStr];    // 有多个值时,改为数组类型    if (ret[key] === undefined) {      ret[key] = note;    } else if (Array.isArray(ret[key])) {      (ret[key] as T[]).push(note);    } else {      const first = ret[key];      ret[key] = [first, note];    }  });  return ret;}// DEMO// 适用于外部定义的一些可扩展note节点列表的取值逻辑const { sortType, featureSwitch } = getNoteValue(list, GLOBAL_NOTE_CONFIG, 'ntype');


 

多条件数组排序

export function getSort<T>(fn: (a: T, b: T) => boolean): (a: T, b: T) => 1 | -1 | 0 {  return (a: T, b: T): 1 | -1 | 0 => {    let ret = 0;    if (fn.call(null, a, b)) {      ret = -1;    } else if (fn.call(null, b, a)) {      ret = 1;    }    return ret as 0;  };}export function getMultipleSort<T>(arr: Array<(a: T, b: T) => 1 | -1 | 0>) {  return (a: T, b: T) => {    let tmp;    let i = 0;    do {      tmp = arr[i++](a, b);    } while (tmp === 0 && i < arr.length);    return tmp;  };}// DEMOconst ageSort = getSort(function(a, b) {  return a.age < b.age;});const nameSort = getSort(function(a, b) {  return a.name < b.name;});const sexSort = getSort(function(a, b) {  return a.sex && !b.sex;});//判断条件先后顺序可调整const arr = [nameSort, ageSort, sexSort];const ret = data.sort(getMultipleSort(arr));

感谢你能够认真阅读完这篇文章,希望小编分享的“React中Native项目框架搭建的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: React中Native项目框架搭建的示例分析

本文链接: https://www.lsjlt.com/news/278405.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • React中Native项目框架搭建的示例分析
    这篇文章主要介绍了React中Native项目框架搭建的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。React Native 是Facebook于2015年4月开源...
    99+
    2023-06-15
  • React Native项目框架搭建的一些心得体会
    React Native 是Facebook于2015年4月开源的跨平台移动应用开发框架, 短短的一两年的发展就已经有很多家公司支持并采用此框架来搭建公司的移动端的应用, React...
    99+
    2024-04-02
  • Android原生项目集成React Native的示例分析
    小编给大家分享一下Android原生项目集成React Native的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!开发环境准备首先按照开发环境搭建教程来安装React Native在安卓平台上所需的一切依赖软件(...
    99+
    2023-05-30
    android react native
  • Spring Native项目的示例分析
    小编给大家分享一下Spring Native项目的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!关于Spring NativeSpring官方博客于202...
    99+
    2023-06-15
  • spring boot activity 项目搭建的示例分析
    这篇文章将为大家详细讲解有关spring boot activity 项目搭建的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。spring boot activity 项目搭建初始化...
    99+
    2023-06-19
  • react-native之ART绘图的示例分析
    小编给大家分享一下react-native之ART绘图的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!背景在移动应用的开...
    99+
    2024-04-02
  • springboot-curd基于mybatis项目搭建的示例分析
    springboot-curd基于mybatis项目搭建的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。项目结构:pom.xml文件:   ...
    99+
    2023-06-28
  • React项目迁移Webpack Babel7的示例分析
    这篇文章主要介绍React项目迁移Webpack Babel7的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!这里简单说下 React 项目的一些配置;首先我们新建项目 re...
    99+
    2024-04-02
  • React-Native左右联动List的示例分析
    这篇文章将为大家详细讲解有关React-Native左右联动List的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一:左右联动List,在工作中很常见。今天分享...
    99+
    2024-04-02
  • html中框架的示例分析
    小编给大家分享一下html中框架的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 框架是什么?框架就是在一个窗口可以显...
    99+
    2024-04-02
  • React Native图片查看组件的示例分析
    这篇文章将为大家详细讲解有关React Native图片查看组件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。React Native 图片查看组件:react...
    99+
    2024-04-02
  • 响应式React Native Echarts组件的示例分析
    小编给大家分享一下响应式React Native Echarts组件的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言...
    99+
    2024-04-02
  • react native原生模块桥接的示例分析
    这篇文章主要介绍react native原生模块桥接的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android创建原生模块包通过继承 ReactPackage 为你的原生...
    99+
    2024-04-02
  • react前端项目打包优化的示例分析
    小编给大家分享一下react前端项目打包优化的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!分析通过控制台判断加载资源时间还有资源大小通过开发者工具可以看到白屏的主要原因在于bun...
    99+
    2024-04-02
  • Flask框架的示例分析
    这篇文章主要介绍Flask框架的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!对于python中的框架来说,虽然有一些大型的框架可以供我们挑选,但有时候我们处理数据用不到那么难的框架,这样反而会增加处理数据的...
    99+
    2023-06-14
  • SpringMVC框架的示例分析
    小编给大家分享一下SpringMVC框架的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简介SpringMVC采用模型(Model)-视图(View)-控...
    99+
    2023-06-02
  • php中laravel框架的示例分析
    这篇文章主要介绍了php中laravel框架的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。laravel的安装首先安装laravel之前要安装composer,如果...
    99+
    2023-06-15
  • SSM框架的示例分析
    这篇文章主要为大家展示了“SSM框架的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SSM框架的示例分析”这篇文章吧。SSM图示流程:Spring核心:Java反射Mybatis:动态代...
    99+
    2023-06-15
  • vite项目构建优化的示例分析
    这篇文章主要介绍了vite项目构建优化的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vite项目构建优化路由动态导入 经过rollup的构建,动态导入的文件将会生成...
    99+
    2023-06-20
  • Python框架Django的环境及项目搭建
    本篇内容介绍了“Python框架Django的环境及项目搭建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!特点我们先来了解下 Django ...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作