我的编程空间,编程开发者的网络收藏夹
学习永远不晚

在React中怎么处理数据流

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

在React中怎么处理数据流

这篇“在React中怎么处理数据流”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“在React中怎么处理数据流”文章吧。

背景

相信大家在项目开发中,在页面较复杂的情况下,往往会遇到一个问题,就是在页面组件之间通信会非常困难。

比如说一个商品列表和一个已添加商品列表:

假如这两个列表是独立的两个组件,它们会共享一个数据 “被选中的商品”,在商品列表选中一个商品,会影响已添加商品列表,在已添加列表中删除一个商品,同样会影响商品列表的选中状态。

它们两个是兄弟组件,在没有数据流框架的帮助下,在组件内数据有变化的时候,只能通过父组件传输数据,往往会有 onSelectedDataChange 这种函数出现,在这种情况下,还尚且能忍受,如果组件嵌套较深的话,那痛苦可以想象一下,所以才有解决数据流的各种框架的出现。

本质分析

我们知道 React 是 MVC 里的 V,并且是数据驱动视图的,简单来说,就是数据 => 视图,视图是基于数据的渲染结果:

V = f(M)

数据有更新的时候,在进入渲染之前,会先生成 Virtual DOM,前后进行对比,有变化才进行真正的渲染。

V + ΔV = f(M + ΔM)

数据驱动视图变化有两种方式,一种是 setState,改变页面的 state,一种是触发 props 的变化。

我们知道数据是不会自己改变,那么肯定是有“外力”去推动,往往是远程请求数据回来或者是 UI 上的交互行为,我们统称这些行为叫 action:

ΔM = perform(action)

每一个 action 都会去改变数据,那么视图得到的数据(state)就是所有 action 叠加起来的变更,

state = actions.reduce(reducer, initState)

所以真实的场景会出现如下或更复杂的情况:

问题就出在,更新数据比较麻烦,混乱,每次要更新数据,都要一层层传递,在页面交互复杂的情况下,无法对数据进行管控。

有没有一种方式,有个集中的地方去管理数据,集中处理数据的接收,修改和分发?答案显然是有的,数据流框架就是做这个事情,熟悉 Redux 的话,就知道其实上面讲的就是 Redux 的核心理念,它和 React 的数据驱动原理是相匹配的。

数据流框架

Redux

数据流框架目前占主要地位的还是 Redux,它提供一个全局 Store 处理应用数据的接收,修改和分发。

它的原理比较简单,View 里面有任何交互行为需要改变数据,首先要发一个 action,这个 action 被 Store 接收并交给对应的 reducer 处理,处理完后把更新后的数据传递给 View。Redux 不依赖于任何框架,它只是定义一种方式控制数据的流转,可以应用于任何场景。

虽然定义了一套数据流转的方式,但真正使用上会有不少问题,我个人总结主要是两个问题:

定义过于繁琐,文件多,容易造成思维跳跃。

异步流的处理没有优雅的方案。

我们来看看写一个数据请求的例子,这是非常典型的案例:

actions.js

export const FETCH_DATA_START = 'FETCH_DATA_START';

export const FETCH_DATA_SUCCESS = 'FETCH_DATA_SUCCESS';

export const FETCH_DATA_ERROR = 'FETCH_DATA_ERROR';

export function fetchData() {

  return dispatch => {

    dispatch(fetchDataStart());

    axios.get('xxx').then((data) => {

      dispatch(fetchDataSuccess(data));

    }).catch((error) => {

      dispatch(fetchDataError(error));

    });

  };

}

export function fetchDataStart() {

  return {

    type: FETCH_DATA_START,

  }

}

...FETCH_DATA_SUCCESS

...FETCH_DATA_ERROR

reducer.js

import { FETCH_DATA_START, FETCH_DATA_SUCCESS, FETCH_DATA_ERROR  } from 'actions.js';

export default (state = { data: null }, action) => {

  switch (action.type) {

    case FETCH_DATA_START:

      ...

    case FETCH_DATA_SUCCESS:

      ...

    case FETCH_DATA_ERROR:

      ...

    default: 

      return state

  }

}

view.js

import { createStore, applyMiddleware } from 'redux';

import thunk from 'redux-thunk';

import reducer from 'reducer.js';

import { fetchData } from 'actions.js';

const store = createStore(reducer, applyMiddleware(thunk));

store.dispatch(fetchData());

第一个问题,发一个请求,因为需要托管请求的所有状态,所以需要定义很多的 action,这时很容易会绕晕,就算有人尝试把这些状态再封装抽象,也会充斥着一堆模板代码。有人会挑战说,虽然一开始是比较麻烦,繁琐,但对项目可维护性,扩展性都比较友好,我不太认同这样的说法,目前还算简单,真正业务逻辑复杂的情况下,会显得更恶心,效率低且阅读体验差,相信大家也写过或看过这样的代码,后面自己看回来,需要在 actions 文件搜索一下 action 的名称,reducer 文件查询一下,绕一圈才慢慢看懂。

第二个问题,按照官方推荐使用 redux-thunk 实现异步 action 的方法,只要在 action 里返回一个函数即可,这对有强迫症的人来说,简直受不了,actions 文件显得它很不纯,本来它只是来定义 action,却竟然要夹杂着数据请求,甚至 UI 上的交互。

以上就是关于“在React中怎么处理数据流”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

在React中怎么处理数据流

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

下载Word文档

猜你喜欢

React 中使用 RxJS 优化数据流的处理方案

这篇文章主要为大家介绍了React 中使用 RxJS 优化数据流的处理方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-17

python流化数据怎么处理

要处理Python中的流数据,可以使用以下方法之一:使用标准输入/输出流:可以使用sys.stdin和sys.stdout来处理输入和输出流。例如,可以使用sys.stdin.readline()读取一行输入,使用print()函数将数据输
python流化数据怎么处理
2024-02-29

怎么在JavaScript中处理JSON数据

这篇文章主要介绍“怎么在JavaScript中处理JSON数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么在JavaScript中处理JSON数据”文章能帮助大家解决问题。一、什么是JSONJ
2023-07-06

Beam怎么处理无界数据流

Beam是一个分布式并行数据处理框架,可以处理无界数据流。在Beam中,无界数据流通常通过读取数据源并实时处理来实现。以下是如何处理无界数据流的一般步骤:创建一个Pipeline对象:首先,您需要创建一个Pipeline对象来定义数据处理
Beam怎么处理无界数据流
2024-03-15

怎么在React中处理错误边界组件

这期内容当中小编将会给大家带来有关怎么在React中处理错误边界组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。React中的未捕获的 JS 错误会导致整个应用的崩溃,和整个组件树的卸载。从 React
2023-06-14

Kafka在大数据处理和实时流处理中有什么应用场景

Kafka 在大数据处理和实时流处理中有以下应用场景:数据集成:Kafka 可以用作数据集成平台,将多个数据源的数据集成到一个统一的平台中进行处理和分析。实时数据传输:Kafka 提供了高性能和低延迟的消息传输机制,可用于实时数据传输和处理
Kafka在大数据处理和实时流处理中有什么应用场景
2024-03-14

C++技术中的大数据处理:如何采用流处理技术处理大数据流?

流处理技术用于大数据处理流处理是一种即时处理数据流的技术。在 c++++ 中,apache kafka 可用于流处理。流处理提供实时数据处理、可伸缩性和容错性。本例使用 apache kafka 从 kafka 主题读取数据并计算平均值。C
C++技术中的大数据处理:如何采用流处理技术处理大数据流?
2024-05-11

怎么在python中实现数据预处理

这篇文章将为大家详细讲解有关怎么在python中实现数据预处理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注
2023-06-14

怎么在java中使用数据流

本篇文章为大家展示了怎么在java中使用数据流,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论
2023-06-14

NoSQL怎么支持实时数据流处理

NoSQL数据库通常通过以下几种方式来支持实时数据流处理:支持持久化数据:NoSQL数据库通常支持大规模数据的存储和管理,能够持久化保存实时数据流,并提供高性能的读写操作。支持分布式架构:NoSQL数据库通常采用分布式架构,能够水平扩展,
NoSQL怎么支持实时数据流处理
2024-05-07

ApacheBeam中的数据处理流程是怎样的

Apache Beam 是一个分布式数据处理框架,它可以处理批处理和流处理任务。数据处理流程通常包括以下步骤:创建一个 Pipeline 对象:Pipeline 是数据处理流程的核心概念,它表示一个数据处理任务的整体流程。定义数据源:通过调
ApacheBeam中的数据处理流程是怎样的
2024-03-06

Beam中怎么实现数据的批处理和流处理混合模式

在Beam中实现数据的批处理和流处理混合模式可以通过使用Beam的UnboundedSource和BoundedSource接口来实现。这两个接口分别用于定义无界数据流和有界数据集的数据源。在混合模式下,我们可以将无界数据流作为输入,然后
Beam中怎么实现数据的批处理和流处理混合模式
2024-03-15

怎么在python中使用 Faust流处理库

怎么在python中使用 Faust流处理库?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录