日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

一個巧妙設(shè)計,解鎖 React19 初始化接口優(yōu)秀實(shí)踐,徹底摒棄 useEffect

來源: 責(zé)編: 時間:2024-06-12 17:32:48 213觀看
導(dǎo)讀在以往的開發(fā)思路中,初始化接口需要借助 useEffect。和最初的 class 語法相比,借助 useEffect 實(shí)現(xiàn)接口請求是一次代碼簡潔度的大幅度提升。function Messages() { var [data, setData] = useState() useEffect(() =>

hEz28資訊網(wǎng)——每日最新資訊28at.com

在以往的開發(fā)思路中,初始化接口需要借助 useEffect。和最初的 class 語法相比,借助 useEffect 實(shí)現(xiàn)接口請求是一次代碼簡潔度的大幅度提升。hEz28資訊網(wǎng)——每日最新資訊28at.com

function Messages() {  var [data, setData] = useState()  useEffect(() => {    api().then(res => {      setData(res.data)    })  }, [])  ...}

在 React 19 中,由于 use() hook 的出現(xiàn),讓我們有機(jī)會不借助 useEffect 就可以簡單實(shí)現(xiàn)初始化。代碼簡潔度將會進(jìn)一步提升。我們來回顧一下如何做。hEz28資訊網(wǎng)——每日最新資訊28at.com

先定義好一個 api 請求的函數(shù)。此時我們要重新注意 getMessage 執(zhí)行,返回的是一個 promise。hEz28資訊網(wǎng)——每日最新資訊28at.com

const getMessage = async () => {  const res = await fetch('https://api.chucknorris.io/jokes/random')  return res.json()}

有了這個 api 之后,我們可以直接在父組件中調(diào)用該方法。hEz28資訊網(wǎng)——每日最新資訊28at.com

var promise = getMessage()

由于 getMessage 執(zhí)行返回的依然是一個 promise,因此我們可以將這個 promise 傳遞給子組件。在子組件中使用 use 讀取 promise 中的值。hEz28資訊網(wǎng)——每日最新資訊28at.com

// 被 Suspense 包裹的子組件const res = use(api)

只需要這兩行代碼,就可以非常簡單的在組件中請求接口并初始化頁面了。但是我們在前面的文章中有提到過,一個新的架構(gòu)思路如何不能解決所有問題,那么這個架構(gòu)思路就是不成功的,我們便不能稱之為架構(gòu)思維。hEz28資訊網(wǎng)——每日最新資訊28at.com

在前面的案例中,我們確實(shí)遇到了一些更復(fù)雜的情況,并且采用了一些不太理想的方式來解決。我們來回顧一下。hEz28資訊網(wǎng)——每日最新資訊28at.com

一個常見的需求場景就是,我們不僅要在初始化時請求接口,并且還要在后續(xù)的交互中「點(diǎn)擊更新、重置、下拉刷新等」請求同樣的接口。此時我們剛才非常簡潔的寫法就變得不再適用了。一個交互案例如下圖所示:hEz28資訊網(wǎng)——每日最新資訊28at.com

hEz28資訊網(wǎng)——每日最新資訊28at.com

在前面的案例中,我們巧妙的將 promise 作為狀態(tài)存儲在 state 中,勉強(qiáng)解決了這個問題。hEz28資訊網(wǎng)——每日最新資訊28at.com

var [promise, setPromise] = useState(getMessage())

交互事件觸發(fā)時,只需要執(zhí)行 getMessage() 并用此結(jié)果更新 promise 的值,組件就會重新請求。hEz28資訊網(wǎng)——每日最新資訊28at.com

function __clickHandler() {  setPromise(getMessage())}

這種用法非常高級,因為在我們的固有思維中,state 中存儲的都是可以觸發(fā)更新的狀態(tài)/數(shù)據(jù),而這種用法實(shí)際上是在數(shù)據(jù)外套了一層 promise,我們將數(shù)據(jù)存儲在 promise 中。在保持了代碼簡潔性的同時,沒有新增狀態(tài)并且最終解決了問題。hEz28資訊網(wǎng)——每日最新資訊28at.com

但是,這并不是最理想的解決方案。因為這種寫法,當(dāng)組件由于各種原因需要重新請求時,getMessage() 會冗余執(zhí)行,它的執(zhí)行就會請求接口,因此這種寫法會造成大量的冗余請求。hEz28資訊網(wǎng)——每日最新資訊28at.com

為了解決這個問題,我們在前面一章的案例中,使用了一種并不簡潔的方案,來防止 getMessage() 的冗余執(zhí)行。這個思路的核心是利用 useEffect 的執(zhí)行,來記錄組件已經(jīng)完成初始化,然后在函數(shù)組件后續(xù)的執(zhí)行中,就可以阻止 getMessage 的執(zhí)行。hEz28資訊網(wǎng)——每日最新資訊28at.com

var r = useRef(false)var api = r.current ? null : getMessage()const [promise, setPromise] = useState(api)const [current, setCurrent] = useState(0)useEffect(() => {  r.current = true}, [])

繞來繞去,useEffect 又回來了。很顯然,這違背了我們的初衷。雖然解決了問題,但是看上去非常的別扭。hEz28資訊網(wǎng)——每日最新資訊28at.com

那么有沒有更簡單直接的、符合 React 19 開發(fā)思維的、徹底摒棄 useEffect 的解決方案呢?當(dāng)然有。hEz28資訊網(wǎng)——每日最新資訊28at.com

我們需要巧妙的利用 React 語法的機(jī)制,來達(dá)到目的。hEz28資訊網(wǎng)——每日最新資訊28at.com

我們仔細(xì)觀察一下 getMessage 的封裝。實(shí)際上,當(dāng)我們調(diào)用該方法時,請求就已經(jīng)發(fā)生了。hEz28資訊網(wǎng)——每日最新資訊28at.com

const getMessage = async () => {  const res = await fetch('https://api.chucknorris.io/jokes/random')  return res.json()}

所以,當(dāng)父組件重復(fù)執(zhí)行時,getMessage() 也會重復(fù)執(zhí)行,請求自然也會重復(fù)發(fā)送。因此,一個比較自然的思考,就是想辦法讓 getMessage 只執(zhí)行一次。hEz28資訊網(wǎng)——每日最新資訊28at.com

調(diào)整的方式非常簡單,如下所示hEz28資訊網(wǎng)——每日最新資訊28at.com

+ var [, setPromise] = useState(getMessage)- var [, setPromise] = useState(getMessage())

這里就是我們這篇文章要重點(diǎn)給大家介紹的非常巧妙的地方。我們借助了 useState 的另外一種方式來初始化。來觀察一下官方文檔的案例。hEz28資訊網(wǎng)——每日最新資訊28at.com

hEz28資訊網(wǎng)——每日最新資訊28at.com

const [todos, setTodos] = useState(() => createTodos());

注意看一下這段代碼,他使用一個函數(shù)來初始化 todos,初始化之后,todos 的值,為 createTodos() 的執(zhí)行結(jié)果。這種方式初始化的結(jié)果是,createTodos() 只會在組建首次創(chuàng)建時執(zhí)行一次,后續(xù)組件再 re-render,就不再執(zhí)行了。hEz28資訊網(wǎng)——每日最新資訊28at.com

又由于在函數(shù)式編程中,函數(shù)是一等公民,因此,上面的代碼可以簡化為。hEz28資訊網(wǎng)——每日最新資訊28at.com

const [todos, setTodos] = useState(createTodos);

所以此時,我們使用 useState(getMessage) 則是借用了這種語法思路,將我們的代碼做到極簡的方式給 state 賦值。他等價于。hEz28資訊網(wǎng)——每日最新資訊28at.com

var [] = useState(() => getMessage())// 兩種寫法的運(yùn)行結(jié)果是一致的var [] = useState(getMessage)

交互事件觸發(fā)時代碼可以保持不變。hEz28資訊網(wǎng)——每日最新資訊28at.com

function __clickHandler() {  setPromise(getMessage())}

確實(shí)太帥了,一個非常小的調(diào)整,就解決了問題。hEz28資訊網(wǎng)——每日最新資訊28at.com

而這種小小的巧妙調(diào)整,結(jié)合我們把 promise 存儲在 state 的巧思,幾乎就可以宣告 useEffect 在異步請求的實(shí)現(xiàn)中,可以功成身退了。當(dāng)你理解了這個細(xì)節(jié),你就應(yīng)該能完全感受到 react 19 的強(qiáng)大吸引力了。也因此,我對 React19 無比期待。hEz28資訊網(wǎng)——每日最新資訊28at.com

極簡風(fēng)格的代碼表現(xiàn)如下:hEz28資訊網(wǎng)——每日最新資訊28at.com

hEz28資訊網(wǎng)——每日最新資訊28at.com

不得不說,評論區(qū)里有高人。在上一篇文章中就有人已經(jīng)提到過這種調(diào)整方向。hEz28資訊網(wǎng)——每日最新資訊28at.com

hEz28資訊網(wǎng)——每日最新資訊28at.com

hEz28資訊網(wǎng)——每日最新資訊28at.com

有的時候,我們需要在請求時傳入?yún)?shù),那么寫法簡單調(diào)整如下:hEz28資訊網(wǎng)——每日最新資訊28at.com

var [] = useState(() => getMessage(params))function __clickHandler() {  setPromise(getMessage(params))}...

最后總結(jié)一下,我們注意看下面兩種寫法:hEz28資訊網(wǎng)——每日最新資訊28at.com

// 寫法一:const _api2 = new Promise((resolve) => {  resolve({ value: 29 })})

寫法二:hEz28資訊網(wǎng)——每日最新資訊28at.com

function fetchMessage() {  return new Promise((resolve) => {    setTimeout(resolve, 1000, '***')  })}

當(dāng)我們要直接用 use 從 promise 中獲取數(shù)據(jù)時,必須是寫法一這種方式。當(dāng)我們把 promise 保存在 useState 上時,寫法一與寫法二都可以。hEz28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-93373-0.html一個巧妙設(shè)計,解鎖 React19 初始化接口優(yōu)秀實(shí)踐,徹底摒棄 useEffect

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 提高能效,用Rust寫代碼

下一篇: 前端性能指標(biāo),一網(wǎng)打盡!

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲盗摄视频| 欧美午夜宅男影院在线观看| 欧美亚洲日本国产| 午夜日韩视频| 久久躁狠狠躁夜夜爽| 欧美成人精品h版在线观看| 欧美日本亚洲| 国产精品欧美日韩一区| 狠狠久久亚洲欧美| 亚洲日韩欧美视频一区| 亚洲天堂成人在线视频| 性欧美在线看片a免费观看| 久久青草久久| 欧美日韩国产区一| 国产乱人伦精品一区二区| 精品二区视频| 日韩亚洲欧美在线观看| 性欧美暴力猛交另类hd| 另类亚洲自拍| 欧美体内谢she精2性欧美| 国产日韩精品一区| 亚洲人成久久| 性欧美xxxx大乳国产app| 免费不卡在线观看av| 国产精品国产精品国产专区不蜜| 国内揄拍国内精品久久| 一本色道久久综合一区| 久久久精品国产免大香伊| 欧美日韩国产首页在线观看| 国产在线日韩| 亚洲视频一区在线| 免费美女久久99| 国产精品拍天天在线| 亚洲国产天堂久久国产91| 午夜精品久久久久久久99黑人| 你懂的视频一区二区| 国产喷白浆一区二区三区| 亚洲美女福利视频网站| 久久久人成影片一区二区三区| 欧美三级小说| 亚洲高清网站| 欧美一级视频免费在线观看| 欧美日韩调教| 亚洲国产一成人久久精品| 欧美一区二区在线看| 欧美日韩少妇| 91久久国产综合久久蜜月精品 | 欧美成人一品| 国产性猛交xxxx免费看久久| 一区二区精品| 欧美高清你懂得| 黄色成人免费观看| 午夜一区在线| 国产精品国产成人国产三级| 日韩视频在线一区| 免费成人黄色片| 国内外成人在线视频| 欧美亚洲免费| 国产精品免费aⅴ片在线观看| 亚洲裸体在线观看| 欧美aⅴ一区二区三区视频| 一区二区三区亚洲| 久久精品国产第一区二区三区| 国产精品视频不卡| 亚洲午夜精品网| 欧美三级中文字幕在线观看| 99精品视频免费全部在线| 欧美激情精品久久久六区热门| 在线观看日韩国产| 久久综合婷婷| 亚洲第一福利视频| 免费成人av在线看| 亚洲国产精品热久久| 男女精品网站| 91久久黄色| 欧美精品系列| 一本久道久久综合狠狠爱| 欧美日韩国产不卡在线看| 最新精品在线| 欧美巨乳在线| 99re66热这里只有精品3直播| 欧美精品久久久久久久久老牛影院| 亚洲国产精品成人| 欧美成人综合网站| 亚洲精品一品区二品区三品区| 欧美精品激情blacked18| 日韩视频在线一区二区三区| 欧美日韩国产999| 日韩一二三区视频| 欧美日一区二区三区在线观看国产免| 中国女人久久久| 国产精品久久一卡二卡| 香蕉久久国产| 激情成人综合网| 欧美18av| 一本色道久久综合| 国产精品免费福利| 欧美在线播放| 在线视频观看日韩| 欧美—级高清免费播放| 99视频精品全部免费在线| 欧美视频在线一区| 翔田千里一区二区| 精品成人乱色一区二区| 欧美搞黄网站| 亚洲视频日本| 国产亚洲一区二区三区在线播放| 久久久亚洲国产天美传媒修理工 | 国产精品久久久一区二区| 性欧美videos另类喷潮| 国模精品一区二区三区| 美女任你摸久久| av成人福利| 国产日韩亚洲欧美精品| 免费日韩av片| 亚洲一区二区三区777| 国产亚洲精品自拍| 欧美成人精品不卡视频在线观看| 一区二区三区欧美日韩| 国产亚洲精品久| 欧美成人一区在线| 亚洲一区二区三区在线| 红杏aⅴ成人免费视频| 欧美伦理一区二区| 欧美一区二区三区四区在线观看| 一区二区三区亚洲| 欧美特黄一级| 久久人人爽人人| 正在播放亚洲| 在线成人激情| 国产精品v日韩精品| 久久久欧美一区二区| 一区二区三区视频观看| 国产自产高清不卡| 欧美日韩欧美一区二区| 久久精品一区蜜桃臀影院| 日韩视频免费观看| 国产偷久久久精品专区| 欧美噜噜久久久xxx| 久久不射2019中文字幕| 9色国产精品| 黄色成人在线免费| 欧美午夜宅男影院| 欧美3dxxxxhd| 欧美在线短视频| 一区二区欧美激情| 在线播放日韩欧美| 国产精品美女久久久久久久| 欧美va天堂| 久久电影一区| 亚洲图片欧美一区| 亚洲第一视频网站| 国产日韩欧美视频| 欧美视频一区二区三区四区| 美女黄毛**国产精品啪啪| 午夜精品久久久久久久久久久久| 亚洲欧洲一区| 激情国产一区| 国产精品专区一| 欧美日韩国产专区| 美日韩精品免费| 久久精品女人| 亚洲女性裸体视频| 日韩视频一区二区三区| 一区国产精品| 国产一区二区精品在线观看| 国产精品v亚洲精品v日韩精品| 欧美国产日韩精品| 老司机午夜精品| 久久久伊人欧美| 欧美一区二区私人影院日本| 亚洲综合色婷婷| 一本久道久久久| 亚洲日韩视频| 亚洲国产精品视频一区| 精品91视频| 国产一区在线观看视频| 国产欧美日韩综合一区在线播放 | 91久久精品日日躁夜夜躁欧美 | 国产日本亚洲高清| 国产精品久久久久久久久久免费看| 欧美激情网友自拍| 免费亚洲电影在线| 久久综合国产精品| 久久久www| 久久国产精品99精品国产| 午夜免费日韩视频| 亚洲欧美国产毛片在线| 亚洲婷婷综合久久一本伊一区| 一区二区av在线| 一区二区三区久久| 一本色道久久综合亚洲91| 日韩午夜av电影| 99精品视频网| 一本色道久久综合亚洲精品按摩| 亚洲精品在线视频| 亚洲精选久久| 日韩天堂在线观看| 一本久久青青| 宅男噜噜噜66国产日韩在线观看| av成人免费观看| 国产精品99久久久久久白浆小说| 一本色道久久综合亚洲二区三区| 9l视频自拍蝌蚪9l视频成人|