Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在 React 应用中获取数据

在 React 应用中获取数据

作者头像
前端达人
发布于 2018-10-18 06:51:42
发布于 2018-10-18 06:51:42
8.4K00
代码可运行
举报
文章被收录于专栏:前端达人前端达人
运行总次数:0
代码可运行

可以说 React 是构建 web 应用最流行的库。然而,它并不是全能的 web 框架。它只关注 MVC 中的 view 模块。

React 整个生态系统可以解决其它问题。这篇教程中,你将会学到如何在 React web 应用中获取数据并显示。这很重要。 在整个 React 组件中有几个地方都可以获取远程数据。何时获取数据是另外一个问题。你还需要考虑用何种技术获取数据、数据存储在哪里。

在教程结束后,你会清楚的知道 React 中该如何获取数据,不同方法的利弊和如何在 React 应用中使用这些技术。

开始

让我们用 create-react-app 创建一个 React 应用的框架:

> create-react-app react-data-fetcher

我们会得到一个精致的结构目录。如果,你不熟悉 create-react-app,可以先看看 README 文件。

创建简单的服务

我创建了一个简单的 quotes 服务。这篇教程的重点不是它,它可以提供远程 API 用来演示如何在 React 中获取数据。 为了满足你们的好奇心,它是一个基于 hug 框架 (http://www.hug.rest/)Python 3 的应用,用 Redis 做持久化存储。

API 非常简单。/quotes 是一个简单接口。通过一个 GET 请求返回所有的 quotes,并且你可以通过 POST 请求新增一条记录。

完整的代码可以在 GitHub (https://github.com/the-gigi/quote-service)查看。

App 预览

这个 React 应用 Demo 可以和 quote 服务通信、显示所有的 quote 并可以添加新的记录。

这是截图:

App 的结构非常简单。我用 create-react-app 创建了一个基础框架并在 src 目录中添加两个组件:QuoteList 和 AddQuoteForm。以下是详细的目录结构(不包含 node_moudules):

显示 Quotes

QuoteList 函数组件以无序列表的形式展示所有的 quotes。它需要传入一组数据字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React from 'react'
const QuoteList = ({quotes}) =>
    quotes.map(quote => <li key={quote}>{quote}</li>)
export default QuoteList

通过 Fetch 获取远程数据

Fetch 是基于 promise 的 API,它会返回一个对象。为了得到实际的 JSON 数据,你需要对响应对象执行 json() 方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fetchQuotes = () => {
    this.setState({...this.state, isFetching: true})
    fetch(QUOTE_SERVICE_URL)
        .then(response => response.json())
        .then(result => this.setState({quotes: result,
            isFetching: false}))
        .catch(e => console.log(e));}
}

何时何地执行获取数据的代码

当然 React 都是组件。重点是何时何地才去加载获取远程数据呢! 如果你能很好的组织代码,你应该会有很多的通用组件和一些特定的组件。React 和 JavaScript 通常非常灵活,你可以在任何地方注入业务逻辑。

因为我希望数据一直是最新的,所以,会以轮询的方式通过 REST API 获取远程数据。 但是,初始化数据也非常重要。React 组件的生命周期方法允许你在特定的时间执行你需要的业务逻辑。 componentDidMount()方法会在组件可访问的时候执行,此时就可以改变组件的 state。这时候获取远程数据是非常合适的。

看起来就像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
componentDidMount() {
    this.fetchQuotes()
}

如果,你想缩短页面的第一次可见的时间,你可以考虑在 componentWillMount() 方法中初始化异步数据,但是,这有可能会在组件未装载前完成数据请求。我不推荐这么操作。

数据更新频率

在 componentDidMount() 方法中初始化数据是很合理的,但是,我需要经常更新数据。基于 REST API,只有通过轮询的方式解决。Quote 服务器非常简单,而且始终都会返回所有的 quotes。

大多数可扩展服务都会提供方法检查 HTTP 中的 if-modify-since 和 eTag 判断数据是否有更新。我们的应用中只是在 componentDidMount() 方法中启动一个 5s 的定时器更新数据,然后,在 componentWillUnmount() 方法清除定时器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
componentDidMount() {
    this.fetchQuotes()
    this.timer = setInterval(() => this.fetchQuotes(), 5000);
}
componentWillUnmount() {
    this.timer = null;
} 

轮询的时间间隔由应用决定。如果,你需要实时更新,并后台有性能要求,可以考虑用 WebSockets 代替 REST。

加载数据延迟的处理

有时候加载数据会花费很长时间。在这种下,显示一个进度条或者一个醒目的动画让用户知道程序正在处理,这对用户体验有很大的帮助。 当用户在初始化数据的时候(比如:点击搜索按钮)这很重要。

在演示 app 中,当请求时数据时我简单的显示一条提示信息:“请求数据中...”。在 App 组件的 render() 方法中,通过检查state.isFetching 的值来决定是否显示提示信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
render() {
    const title = 'Quotes for ya!'
    let now = new Date()
    return (
        <div className='App'>
            <h2 className='App-title'>{title}</h2>
            <p>{this.state.isFetching ? 'Fetching quotes...' : ''}</p>
            <QuoteList quotes={this.state.quotes} />
            <AddQuoteForm quote_service_url={QUOTE_SERVICE_URL}/>
        </div>
    );
}

fetchQuotes() 方法在初始化开始的时候会把 state.isFetching 的值更新为 true,当有响应返回的时候就切换回 false:

fetchQuotes = () => {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    this.setState({...this.state, isFetching: true})
    fetch(QUOTE_SERVICE_URL)
        .then(response => response.json())
        .then(result => this.setState({quotes: result,
            isFetching: false}))
        .catch(e => console.log(e));
}

错误的处理

在这里我对错误的处理非常有限只是捕获错误并输出到控制台。在你的应用中,你可以执行一些重试逻辑、提示用户或者显示一些预设的内容。

Fetch API vs. Axios

Fetch API 是有缺陷的。处理响应的时候必须额外的经过 JSON 处理。它也不会捕获所有的错误。 例如,404 将会做为一个正常的响应返回。你必须主动检查响应的状态码并处理捕获的网络异常。

因此你必须在两个地方处理错误。但是,你可以使用 axios.js 解决这些问题,在添加额外代价的情况下使用更简洁的代码。使用 axios 的代码看起来就像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fetchQuotes = () => {
    this.setState({...this.state, isFetching: true})
    axios.get(QUOTE_SERVICE_URL)
        .then(response => this.setState({quotes: response.data,

            isFetching: false}))
        .catch(e => console.log(e);

}

这看起来差别并不大,但是这非常有帮助。使用 axios 添加新的记录代码也非常简洁。以下是 fetch 的版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
handleSubmitWithFetch = event => {
    let data = new FormData()
    data.append('quote', this.state.quote)
    fetch(this.props.quote_service_url,
        {method: 'POST', body: data})
        .then(response => response.json())
        .catch(e => console.log(e));
    event.preventDefault();

}

这是 axios 的版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
handleSubmit = event => {
    axios.post(this.props.quote_service_url,
        {'quote': this.state.quote})
        .then(r => console.log(r))
        .catch(e => console.log(e));    
     event.preventDefault();
}

在这篇教程中,你学到了如何在 React 组件中异步加载数据。我们也提到了相关的生命周期方法、轮询、进度条和错误的处理。

我们也了解到两个基于 promise 的库:fetch API 和 axios.js。现在,你可以构建自己的 React 应用了。

在最近几年中,React 越来越流行。事实上,市场有很多可以供购买、审查、部署的项目。 如果,你查找更多的 React 资源,不要迟疑请看这里

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
react: 怎么优雅使用获取数据
note: 如果你想了解最新的 react hooks 来获取处理数据的方法:https://www.robinwieruch.de/react-hooks-fetch-data/
西南_张家辉
2021/02/02
1.6K0
03-React网络通信(Axios, PubSubJs, Fetch)
在src下新建setupProxy.js, 记得删除package.json中的proxy
彼岸舞
2022/08/24
7830
03-React网络通信(Axios, PubSubJs, Fetch)
【React】归纳篇(八)在React中发送Ajax请求-axios | fetch | 练习-写一个搜索请求
你可能会想问为什么不用fetch()原生函数呢?因为考虑到对老版本浏览器的支持情况。 其次,fetch()不使用XmlHttpRequest对象发生ajax请求。
前端修罗场
2023/10/07
6510
【React】归纳篇(八)在React中发送Ajax请求-axios | fetch | 练习-写一个搜索请求
React 中获取数据的 3 种方法:哪种最好?
在执行 I/O 操作(例如数据提取)时,要先发送网络请求,然后等待响应,接着将响应数据保存到组件的状态,最后进行渲染。
前端小智@大迁世界
2019/11/08
3.6K0
前端模块化开发--React框架(二):脚手架&&网络请求框架
GitHub地址 一、React脚手架 1、react脚手架说明 1)xxx脚手架: 用来帮助程序员快速创建一个基于xxx库的模板项目Code - a.包含了所有需要的配置 - b.指定好了所有的依赖 - c.可以直接安装/编译/运行一个简单效果 2)react提供了一个用于创建react项目的脚手架库: create-react-app 3)项目的整体技术架构为: react + webpack + es6 + eslint 4)使用脚手架开发的项目的特点: 模块化, 组件化, 工程化 2、使用命令
MiChong
2020/09/24
3K0
React基础(9)-React中发送Ajax请求以及Mock数据
把这段商品列表的json代码命名为goodlist.json,放到根目录public的api文件夹内
itclanCoder
2020/10/16
2.2K0
React Native控件之ListView
概述 ListView作为核心组件之一,主要用于高效地显示一个可以垂直滚动的变化的数据列表。经过自定义组装,我们还可以用它实现九宫格等页面效果。 在React Native中,使用ListView组件至少需要两个属性:DataSource和renderRow。DataSource是需要渲染界面的数据源,renderRow是根据数据源的元素返回的可渲染的组件,即ListView的一行。 在React Native中,最基本的使用方式就是创建一个ListView.DataSource数据源,然后给它传递
xiangzhihong
2018/02/06
1.6K0
React Native控件之ListView
react --- React中state和props分别是什么?
组件从概念上看就是一个函数,可以接受一个参数作为输入值,这个参数就是props,所以可以把props理解为从外部传入组件内部的数据。由于React是单向数据流,所以props基本上也就是从服父级组件向子组件传递的数据。
小蔚
2019/08/27
8060
React通过jsonp来请求接口获取数据渲染数据
Fetch-jsonp https://github.com/camsong/fetch-jsonp
王小婷
2019/11/10
3K0
React组件生命周期详解
在React应用开发中,理解组件的生命周期是非常重要的,它不仅帮助我们更好地管理组件的状态和属性,还能提高应用的性能。本文将从基础概念入手,逐步深入探讨React组件生命周期的不同阶段,并通过代码示例来展示常见的问题与解决方法。
Jimaks
2024/09/04
2940
React---消息订阅发布机制
2) PubSub.subscribe('delete', function(data){ }); //订阅
半指温柔乐
2021/04/26
7720
React-Hook实现数据获取管理和滚动获取
本来是想要暴露出的handlerSetUrl 通过改变url进行下一页的获取,但是老是出现错误。
我已经洗完澡了
2019/10/14
2.2K0
React学习笔记(三)—— 组件高级
下面了的代码,我们用到了数组函数的map方法来实现数组的每一个值变成它的2倍,同时返回一个新数组,最后打印出了这个数组:
张果
2023/03/11
8.3K0
React学习笔记(三)—— 组件高级
React Fetch请求
基于promise的ajax请求 https://developer.mozilla.org/zh-CN/docs/Web/API/Fetch_API
治电小白菜
2020/08/25
2.7K0
React Fetch请求
JavaScript测试教程–part 4:模拟 API 调用和模拟 React 组件交互[每日前端夜话0xEA]
今天,我们进一步测试 React 组件。它涉及模拟组件交互和模拟 API 调用。你将学到两种方法,开始吧!
疯狂的技术宅
2019/11/25
3.7K0
JavaScript测试教程–part 4:模拟 API 调用和模拟 React 组件交互[每日前端夜话0xEA]
component和render在react router中的应用
在react router项目中,有这样的一个需求,首先展示用户名列表,点击某个用户名后,根据用户名在后台取得用户具体信息在详情页进行展示。
大神带我来搬砖
2019/04/17
1.8K0
建站四部曲之前端显示篇(React+上线)
本系列分为四篇: 建站四部曲之后端接口篇(SpringBoot+上线) 建站四部曲之Python数据爬虫篇(selenium) 建站四部曲之前端显示篇(React+上线) 建站四部曲之移动端篇(Android) ---- 零、前言 本系列为了总结一下手上的知识,致敬我的2018 本篇的重点在于:用前两篇的数据使用React搭建一个简单网站 本篇总结的技术点: React的组件封装、React实现简单的懒加载、React中的网络请求、搜索功能 React中form表单与接口的对接、路由react-
张风捷特烈
2018/12/26
3.4K0
React---发送Ajax请求
const {a} = obj; //传统解构赋值
半指温柔乐
2021/04/25
2K0
React入门看这篇就够了
React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。做出来以后,发现这套东西很好用,就在2013年5月开源了。
random_wang
2019/09/11
4.6K0
React 入门学习(九)-- 消息订阅发布
在昨天写的 Github 案例中,我们采用的是 axios 发送请求来获取数据,同时我们需要将数据从 Search 中传入给 App,再由 App 组件再将数据传递给 List 组件,这个过程会显得多此一举。同时我们要将 state 状态存放在 App 组件当中,但是这些 state 状态都是在 List 组件中使用的,在 Search 组件中做的,只是更新这些数据,那这样也会显得很没有必要,我们完全可以将 state 状态存放在 List 组件中,但是这样我们又会遇到技术难题,兄弟组件间的数据通信。那这里我们就学习一下如何利用消息订阅发布来解决兄弟组件间的通信
小丞同学
2021/09/26
5180
相关推荐
react: 怎么优雅使用获取数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验