- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解如何使用React Hooks请求数据并渲染由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
在日常的开发中,从服务器端异步获取数据并渲染是相当高频的操作。在以往使用React Class组件的时候,这种操作我们已经很熟悉了,即在Class组件的componentDidMount中通过ajax来获取数据并setState,触发组件更新.
随着Hook的到来,我们可以在一些场景中使用Hook的写法来替代Class的写法。但是Hook中没有setState、componentDidMount等函数,又如何做到从服务器端异步获取数据并渲染呢?本文将会介绍如何使用React的新特性Hook来编写组件并获取数据渲染.
数据渲染 。
先来看一个数据渲染的简单demo 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import React, { useState } from
'react'
;
function
App() {
const [data, setData] = useState({ products: [{
productId:
'123'
,
productName:
'macbook'
}] });
return
(
<ul>
{data.products.map(i => (
<li key={i.productId}>
{i.productName}
</li>
))}
</ul>
);
}
export
default
App;
|
在demo中,通过useState创建了一个叫data的内部state,该state中有一个产品列表数据保存产品数据。App组件通过data中的products来渲染产品列表数据到页面中.
但现在是写死的一个数据,如果我们期望从服务器端获取数据并渲染,那么就需要在组件渲染完成时fetch服务端数据,然后通过setData去改变state触发渲染。我们接下来准备用axios来获取数据.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import React, { useState, useEffect } from
'react'
;
import axios from
'axios'
;
function
App() {
const [data, setData] = useState({ products: [{
productId:
'123'
,
productName:
'macbook'
}] });
useEffect(async () => {
const result = await axios(
'https://c.com/api/products?date=today'
,
);
setData(result.data);
});
return
(
<ul>
{data.products.map(i => (
<li key={i.productId}>
{i.productName}
</li>
))}
</ul>
);
}
export
default
App;
|
代码中使用到的useEffect就是hook的其中一种,叫effect hook。useEffect会在每次组件渲染的时候触发,我们使用它来获取数据并更新state。但是上面的代码是有缺陷的,你发现了吗?
没错,只要你运行一下,你就会发现程序进入了一个死循环。因为useEffect不仅在组件didMounts的时候被触发了,还在didUpdate的时候被触发了。在useEffect中获取数据后,通过setDate改变state,触发组件渲染更新,从而又进入到了useEffect中,无限循环下去。这并不是我们想要的结果。我们最初想要的,只是希望在didMounts的时候获取一次数据而已。所以,这种情况下,我们必须要给useEffect方法的第二个参数传入一个空[],以使得useEffect中的逻辑只在组件didMounts的时候被执行.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import React, { useState, useEffect } from
'react'
;
import axios from
'axios'
;
function
App() {
const [data, setData] = useState({ products: [{
productId:
'123'
,
productName:
'macbook'
}] });
useEffect(async () => {
const result = await axios(
'https://c.com/api/products?date=today'
,
);
setData(result.data);
},[]);
//重点
return
(
<ul>
{data.products.map(i => (
<li key={i.productId}>
{i.productName}
</li>
))}
</ul>
);
}
export
default
App;
|
虽然看起来这个错误比较低级,但确实比较多人在新上手hook时常常犯的问题.
当然,useEffect第二个参数,也可以传入值。当如果有值的时候,那useEffect会在这些值更新的时候触发。如果只是个空数组,则只会在didMounts的时候触发.
另外,执行这段代码,你会看到控制台警告,Promises and useEffect(async () => ...) are not supported, but you can call an async function inside an effect.。所以如果要使用async,需要修改下写法.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import React, { useState, useEffect } from
'react'
;
import axios from
'axios'
;
function
App() {
const [data, setData] = useState({ products: [{
productId:
'123'
,
productName:
'macbook'
}] });
useEffect(() => {
const fetchData = async()=>{
const result = await axios(
'https://c.com/api/products?date=today'
,
);
setData(result.data);
}
fetchData();
},[]);
return
(
<ul>
{data.products.map(i => (
<li key={i.productId}>
{i.productName}
</li>
))}
</ul>
);
}
export
default
App;
|
体验优化 。
一般的应用在某些请求过程的交互设计上,会加上loading来缓解用户焦虑。那在Hook的写法中,如何实现呢?下面将会介绍.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import React, { useState, useEffect } from
'react'
;
import axios from
'axios'
;
function
App() {
const [data, setData] = useState({ products: [{
productId:
'123'
,
productName:
'macbook'
}] });
const [isLoading, setIsLoading] = useState(
false
);
useEffect(() => {
const fetchData = async()=>{
setIsLoading(
true
);
const result = await axios(
'https://c.com/api/products?date=today'
,
);
setData(result.data);
setIsLoading(
false
);
}
fetchData();
},[]);
return
(
{isLoading ? (
<div>Loading ...</div>
) : (
<ul>
{data.products.map(i => (
<li key={i.productId}>
{i.productName}
</li>
))}
</ul>
)};
}
export
default
App;
|
这里通过加入一个叫isLoading的state来实现。我们在fetch的开始和结束去改变isLoading的值,来控制return返回的组件内容,从而在请求前显示Loading组件,在请求后显示产品列表.
错误处理 。
请求的过程经常会由于各种原因失败,比如网络、服务器错误等等。所以错误处理必不可少的.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import React, { useState, useEffect } from
'react'
;
import axios from
'axios'
;
function
App() {
const [data, setData] = useState({ products: [{
productId:
'123'
,
productName:
'macbook'
}] });
const [isLoading, setIsLoading] = useState(
false
);
const [isError, setIsError] = useState(
false
);
useEffect(() => {
const fetchData = async()=>{
setIsError(
false
);
setIsLoading(
true
);
try
{
const result = await axios(
'https://c.com/api/products?date=today'
,
);
setData(result.data);
}
catch
(e){
setIsError(
true
);
}
setIsLoading(
false
);
}
fetchData();
},[]);
return
(
<div>
{isError && <div>出错了...</div>}
{isLoading ? (
<div>Loading ...</div>
) : (
<ul>
{data.products.map(i => (
<li key={i.productId}>
{i.productName}
</li>
))}
</ul>
)};
</div>
}
export
default
App;
|
当请求出错时,isError会被设置为true,触发渲染时,错误提示组件就会被渲染出来。这里的处理比较简单,在真实场景中,你可以在错误处理时加入更复杂的逻辑。isError会在每次hook运行的时候被重置.
最后 。
读到这你已经基本学会了如何使用React Hooks获取数据并渲染组件了.
到此这篇关于如何使用React Hooks请求数据并渲染的文章就介绍到这了,更多相关React Hooks请求数据并渲染内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://juejin.im/post/6884772230170050574 。
最后此篇关于详解如何使用React Hooks请求数据并渲染的文章就讲到这里了,如果你想了解更多关于详解如何使用React Hooks请求数据并渲染的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我创建了一个简单的钩子(Hook),我安装了它 SetWindowsHookEx(WH_CBT, addr, dll, 0); 完成后,我卸载 UnhookWindowsHookEx(0); 然后我可
我正在使用 React Hooks,当我用 mobx 的观察者包装我的组件时,我收到了这个错误。可能是什么问题?是否可以将 mobx 与 React Hooks 一起使用? import classn
我知道这个问题已经被回答过很多次了。我只是找不到解决我的问题的答案,让我相信,我要么是愚蠢的,要么是我的问题没有被解决,因为它比我更愚蠢。除此之外,这是我的问题: 我正在尝试创建一个功能组件,它从 r
我正在使用 React Navigation 的 useNavigation 钩子(Hook): 在 MyComponent.js 中: import { useNavigation } from "
我想在 gitlab 中使用预提交钩子(Hook)。我做的一切都像文档中一样:https://docs.gitlab.com/ce/administration/custom_hooks.html 在
我最近在和一些人谈论我正在编写的程序时听到了“hook”这个词。尽管我从对话中推断出钩子(Hook)是一种函数,但我不确定这个术语到底意味着什么。我搜索了定义,但找不到好的答案。有人可以让我了解这个术
我正在寻找一个在页面创建或页面更改后调用的钩子(Hook),例如“在导航中隐藏页面”、“停用页面”或“移动/删除页面“ 有人知道吗? 谢谢! 最佳答案 这些 Hook 位于 t3lib/class.t
我正在使用钩子(Hook)将新方法添加到 CalEventLocalServiceImpl 中... 我的代码是.. public class MyCalendarLocalServiceImpl e
编译器将所有 SCSS 文件编译为 STANDALONE(无 Rails)项目中的 CSS 后,我需要一个 Compass Hook 。 除了编辑“compiler.rb”(这不是好的解决方案,因为
我“.get”一个请求并像这样处理响应: resp = requests.get('url') resp = resp.text .. # do stuff with resp 阅读包的文档后,我看到
我们想在外部数据库中存储一些关于提交的元信息。在克隆或 checkout 期间,应引用此数据库,我们将元信息复制到克隆的存储库中的文件中。需要数据库而不是仅仅使用文件是为了索引和搜索等...... 我
我有一个 react 钩子(Hook)useDbReadTable,用于从接受tablename和query初始数据的数据库读取数据。它返回一个对象,除了数据库中的数据之外,还包含 isLoading
在下面的代码中,当我调用 _toggleSearch 时,我同时更新 2 个钩子(Hook)。 toggleSearchIsVisible 是一个简单的 bool 值,但是,setActiveFilt
问题 我想在可由用户添加的表单中实现输入字段的键/值对。 参见 animated gif on dynamic fields . 此外,我想在用户提交表单并再次显示页面时显示保存的数据。 参见 ani
当状态处于 Hook 状态时,它可能会变得陈旧并泄漏内存: function App() { const [greeting, setGreeting] = useState("hello");
const shouldHide = useHideOnScroll(); return shouldHide ? null : something useHideOnScroll 行为应该返回更新后
我正在使用 React-native,在其中,我有一个名为 useUser 的自定义 Hook,它使用 Auth.getUserInfro 方法从 AWS Amplify 获取用户信息,并且然后获取返
我正在添加一个 gitolite 更新 Hook 作为 VREF,并且想知道是否有办法将它应用于除 gitolite-admin 之外的所有存储库。 有一个更简单的方法而不是列出我想要应用 Hook
如何使用带有 react-apollo-hooks 的 2 个 graphql 查询,其中第二个查询取决于从第一个查询中检索到的参数? 我尝试使用如下所示的 2 个查询: const [o, setO
我是 hooks 的新手,到目前为止印象还不错,但是,如果我尝试在函数内部使用 hooks,它似乎会提示(无效的 hook 调用。Hooks can only be called inside o
我是一名优秀的程序员,十分优秀!