(编辑:jimmy 日期: 2024/12/24 浏览:2)
前言
在日常的开发中,从服务器端异步获取数据并渲染是相当高频的操作。在以往使用React Class组件的时候,这种操作我们已经很熟悉了,即在Class组件的componentDidMount中通过ajax来获取数据并setState,触发组件更新。
随着Hook的到来,我们可以在一些场景中使用Hook的写法来替代Class的写法。但是Hook中没有setState、componentDidMount等函数,又如何做到从服务器端异步获取数据并渲染呢?本文将会介绍如何使用React的新特性Hook来编写组件并获取数据渲染。
数据渲染
先来看一个数据渲染的简单demo
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来获取数据。
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"htmlcode">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"htmlcode">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"color: #ff0000">体验优化
一般的应用在某些请求过程的交互设计上,会加上loading来缓解用户焦虑。那在Hook的写法中,如何实现呢?下面将会介绍。
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"color: #ff0000">错误处理
请求的过程经常会由于各种原因失败,比如网络、服务器错误等等。所以错误处理必不可少的。
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"color: #ff0000">最后
读到这你已经基本学会了如何使用React Hooks获取数据并渲染组件了。
上一篇:axios封装与传参示例详解下一篇:js中复选框的取值及赋值示例详解荣耀猎人回归!七大亮点看懂不只是轻薄本,更是游戏本的MagicBook Pro 16.
人们对于笔记本电脑有一个固有印象:要么轻薄但性能一般,要么性能强劲但笨重臃肿。然而,今年荣耀新推出的MagicBook Pro 16刷新了人们的认知——发布会上,荣耀宣布猎人游戏本正式回归,称其继承了荣耀 HUNTER 基因,并自信地为其打出“轻薄本,更是游戏本”的口号。
众所周知,寻求轻薄本的用户普遍更看重便携性、外观造型、静谧性和打字办公等用机体验,而寻求游戏本的用户则普遍更看重硬件配置、性能释放等硬核指标。把两个看似难以相干的产品融合到一起,我们不禁对它产生了强烈的好奇:作为代表荣耀猎人游戏本的跨界新物种,它究竟做了哪些平衡以兼顾不同人群的各类需求呢?