網(wǎng)站首頁 編程語言 正文
前言
react16.8推出hooks更好的支持函數(shù)組件,使用函數(shù)組件更容易進(jìn)行代碼的復(fù)用,拓展性更強(qiáng)。
useState
useState類似于class組件的state功能,用于更新視圖
import React, { Component, useState } from 'react';
export default function Hello() {
const [count, setCount] = useState(0); //設(shè)置默認(rèn)值為0
return <div>
{count}
<button onClick={()=>setCount(count + 1)}>增加</button>
</div>
}
//useState還可以使用函數(shù)進(jìn)行賦值
const [count, setCount] = useState(()=>0); //設(shè)置默認(rèn)值為0
useEffect
useEffect接受兩個(gè)參數(shù),第一個(gè)參數(shù)是要執(zhí)行的回調(diào)函數(shù),第二個(gè)參數(shù)是依賴的參數(shù),如下面的例子里只有當(dāng)count發(fā)生變化的時(shí)候才會(huì)打印count,當(dāng)?shù)诙€(gè)參數(shù)為空數(shù)組的時(shí)候,組件在渲染完成后會(huì)執(zhí)行一次,第二個(gè)參數(shù)不傳遞的時(shí)候每次渲染都會(huì)執(zhí)行
export default function Hello() {
const [count, setCount] = useState(() => 0); //設(shè)置默認(rèn)值為0
// useEffect
useEffect(() => {
}, [count])
return <div>
{count}
<button onClick={() => setCount(count + 1)}>增加</button>
</div>
}
帶有返回值的useEffect用于清除執(zhí)行過程中的副作用
useEffect(()=>{
const timer = setInterval(() => {
console.log(count);
}, 1000);
window.addEventListener('resize',handleResize);
return function(){
clearInterval(timer);
window.removeEventListener('resize',handleResize);
}
}, [count])
如果每次執(zhí)行useEffect都定義一個(gè)定時(shí)器,那定時(shí)器會(huì)越來越多,通過在返回函數(shù)中清除定時(shí)器取消這個(gè)副作用。useEffect返回函數(shù)的執(zhí)行時(shí)機(jī)是下一次useEffect執(zhí)行之前。
利用這一點(diǎn)可以實(shí)現(xiàn)防抖和節(jié)流函數(shù)
獲取數(shù)據(jù)
下面是在函數(shù)組件中獲取數(shù)據(jù)最基本的方式:
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function App() {
const [data, setData] = useState({ hits: [] });
useEffect(async () => {
const result = await axios(
'https://hn.algolia.com/api/v1/search?query=redux',
);
setData(result.data);
});
return (
<ul>
{data.hits.map(item => (
<li key={item.objectID}>
<a href={item.url}>{item.title}</a>
</li>
))}
</ul>
);
}
export default App;
useEffect 的 hook 用于從 API 中獲取從后端請(qǐng)求回來的數(shù)據(jù),并使用 state hook 的更新函數(shù)在組件的本地狀態(tài)中設(shè)置數(shù)據(jù)。prmomise 解析發(fā)生在異步/等待中。
但是,當(dāng)你運(yùn)行應(yīng)用程序時(shí),你會(huì)發(fā)現(xiàn)效果掛鉤在組件裝載時(shí)運(yùn)行,但在組件更新時(shí)也會(huì)運(yùn)行,這樣它就會(huì)一次又一次地獲取數(shù)據(jù)。這是一個(gè)錯(cuò)誤,需要避免。我們只想在組件掛載時(shí)獲取數(shù)據(jù)。這就是為什么你可以提供一個(gè)空數(shù)組作為 effect hook 的第二個(gè)參數(shù),以避免在組件更新時(shí)激活它:
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function App() {
const [data, setData] = useState({ hits: [] });
useEffect(async () => {
const result = await axios(
'https://hn.algolia.com/api/v1/search?query=redux',
);
setData(result.data);
}, []);
return (
<ul>
{data.hits.map(item => (
<li key={item.objectID}>
<a href={item.url}>{item.title}</a>
</li>
))}
</ul>
);
}
export default App;
第二個(gè)參數(shù)可用于定義鉤子所依賴的所有變量(在此數(shù)組中分配)。如果其中一個(gè)變量發(fā)生更改,則掛載將再次運(yùn)行。如果包含變量的數(shù)組為空,則在更新組件時(shí)根本不會(huì)運(yùn)行鉤子,因?yàn)樗槐乇O(jiān)視任何變量。
還有最后一個(gè)問題。在代碼中,我們使用 async/await 從第三方 API 獲取數(shù)據(jù)。而我們知道 async函數(shù)返回一個(gè) AsyncFunction 對(duì)象。但是,effect hook 應(yīng)不返回任何內(nèi)容或清理函數(shù)。這就是為什么不允許直接在 effect hook 中使用異步的原因。讓我們通過調(diào)用effect 內(nèi)的異步函數(shù)來實(shí)現(xiàn)它的解決方法:
import React, { useState, useEffect } from 'react';
import axios from 'axios';
function App() {
const [data, setData] = useState({ hits: [] });
useEffect(() => {
const fetchData = async () => {
const result = await axios(
'https://hn.algolia.com/api/v1/search?query=redux',
);
setData(result.data);
};
fetchData();
}, []);
return (
<ul>
{data.hits.map(item => (
<li key={item.objectID}>
<a href={item.url}>{item.title}</a>
</li>
))}
</ul>
);
}
export default App;
這就是使用 React 鉤子獲取數(shù)據(jù)。
原文鏈接:https://blog.csdn.net/qq_49900295/article/details/126987803
相關(guān)推薦
- 2022-09-17 python?df遍歷的N種方式(小結(jié))_python
- 2022-07-22 Idea操作普通項(xiàng)目變?yōu)閙aven項(xiàng)目
- 2023-03-16 Python?import導(dǎo)入上級(jí)目錄文件的方法_python
- 2022-06-16 C#使用符號(hào)表實(shí)現(xiàn)查找算法_C#教程
- 2023-01-12 Android?RecyclerChart其它圖表繪制示例詳解_Android
- 2022-06-06 max-width: 100%和width:100%的區(qū)別
- 2022-08-19 React中Props的使用
- 2022-05-04 Django點(diǎn)贊的實(shí)現(xiàn)示例_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支