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

當前位置:首頁 > 科技  > 軟件

喔!React19 中的 Hook 可以寫在 If 條件判斷中了。Use 實踐:點擊按鈕更新數據

來源: 責編: 時間:2024-06-06 17:41:31 242觀看
導讀接下來,我們將會以大量的實踐案例來展開 React 19 新 hook 的運用。本文模擬的實踐案例為點擊按鈕更新數據。這在開發中是一個非常常見的場景。案例完成之后的最終演示效果圖如下:我們直接用 React 19 新的開發方式來完

b9128資訊網——每日最新資訊28at.com

接下來,我們將會以大量的實踐案例來展開 React 19 新 hook 的運用。b9128資訊網——每日最新資訊28at.com

本文模擬的實踐案例為點擊按鈕更新數據。這在開發中是一個非常常見的場景。b9128資訊網——每日最新資訊28at.com

案例完成之后的最終演示效果圖如下:b9128資訊網——每日最新資訊28at.com

b9128資訊網——每日最新資訊28at.com

我們直接用 React 19 新的開發方式來完成這個需求。b9128資訊網——每日最新資訊28at.com

一、基礎實現

首先創建一個方法用于請求數據。b9128資訊網——每日最新資訊28at.com

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

這里一個非常關鍵的地方就在于,當我們要更新的數據時,我們不再需要設計一個 loading 狀態去記錄數據是否正在發生請求行為,因為 Suspense 幫助我們解決了 Loading 組件的顯示問題。b9128資訊網——每日最新資訊28at.com

與此同時,use() 又幫助我們解決了數據獲取的問題。那么問題就來了,這個就是,好像我們也不需要設計一個狀態去存儲數據。那么應該怎么辦呢?b9128資訊網——每日最新資訊28at.com

這里有一個非常巧妙的方式,就是把創建的 promise 作為狀態值來觸發組件的重新執行。每次點擊,我們都需要創建新的 promiseb9128資訊網——每日最新資訊28at.com

代碼如下:b9128資訊網——每日最新資訊28at.com

// 記住這個初始值const [api, setApi] = useState(null)

這個時候,當我們點擊事件執行時,則只需要執行如下代碼去觸發組件的更新。b9128資訊網——每日最新資訊28at.com

function __clickToGetMessage() {  // 每次點擊,都會創建新的 promise  setApi(getApi())}

getApi() 執行,新的請求會發生。他的執行結果,又返回了一個新的 promise。b9128資訊網——每日最新資訊28at.com

因此,點擊之后會創建的新 promise 值,api 此時就會作為狀態更改觸發組件的更新。b9128資訊網——每日最新資訊28at.com

完整代碼如下:b9128資訊網——每日最新資訊28at.com

export default function Index() {  const [api, setApi] = useState(null)  function __clickToGetMessage() {    setApi(getApi())  }  return (    <div>      <div id='tips'>點擊按鈕獲取一條新的數據</div>      <button onClick={__clickToGetMessage}>獲取數據</button>      <div className="content">        <Suspense fallback={<div>loading...</div>}>          <Item api={api} />        </Suspense>      </div>    </div>  )}const Item = (props) => {  if (!props.api) {    return <div>nothing</div>  }  const joke = use(props.api)  return (    <div className='a_value'>{joke.value}</div>  )}

案例寫完之后。我們基本上就能夠實現最開始截圖中的交互效果了。但是現別急,還沒有完。我們還需要進一步分析一下這個案例。b9128資訊網——每日最新資訊28at.com

二、案例分析

這里我們需要注意觀察兩個事情。b9128資訊網——每日最新資訊28at.com

一個是觀察當前組件更新,更上層的父組件是否發生了變化。我們可以在 App 組件中執行一次打印。b9128資訊網——每日最新資訊28at.com

此時可以發現,當我們重新請求時,當前組件更新,但是上層組件并不會重新執行。b9128資訊網——每日最新資訊28at.com

我們可以出得結論:更簡潔的狀態設計,有利于命中 React 默認的性能優化規則。b9128資訊網——每日最新資訊28at.com

具體的規則請在 React 知命境合集中查看。b9128資訊網——每日最新資訊28at.com

更簡潔的狀態設計,也是 React 19 所倡導的開發思路。b9128資訊網——每日最新資訊28at.com

另外一個事情,是我們要特別特別注意觀察子組件 Item 的實現。b9128資訊網——每日最新資訊28at.com

首先因為我們初始化時,給 api 賦予的默認值是 null。b9128資訊網——每日最新資訊28at.com

// 記住這個初始值const [api, setApi] = useState(null)

之后,我們就將 api 傳給了子組件 Item。b9128資訊網——每日最新資訊28at.com

<Item api={api} />

然后在 Item 組件的內部實現中,因為我們直接把 api 傳給了 use,那么此時直接執行肯定會報錯。b9128資訊網——每日最新資訊28at.com

const joke = use(props.api)

要注意的是,我們剛才說,使用 Suspense 會捕獲子組件的異常,但是不是捕獲所有異常,它只能識別 promise 的異常。因此,這里的報錯會直接影響到整個頁面。b9128資訊網——每日最新資訊28at.com

所以,為了處理好初始化時傳入 api 值為 null,我在內部實現代碼邏輯中,使用了 if 判斷該條件,然后執行了一次 return。我試圖讓 use(null) 得不到執行的時機。b9128資訊網——每日最新資訊28at.com

const Item = (props) => {  if (!props.api) {    console.log('初始化時,api == null')    return <div>nothing</div>  }  const joke = use(props.api)  return (    <div className='a_value'>{joke.value}</div>  )}

那么,我的意圖是否能成功呢?b9128資訊網——每日最新資訊28at.com

我們在 return 后面插入一個 console.log 來觀察代碼的執行情況,代碼如下:b9128資訊網——每日最新資訊28at.com

const Item = (props) => {  if (!props.api) {    console.log('初始化時,api == null')    return <div>nothing</div>  }    console.log('初始化時這里是否執行');  const joke = use(props.api)  return (    <div className='a_value'>{joke.value}</div>  )}

演示效果如下圖所示:b9128資訊網——每日最新資訊28at.com

b9128資訊網——每日最新資訊28at.com

我們發現,當我反復刷新頁面,讓初始化流程執行時,return 后面的代碼并不會執行。b9128資訊網——每日最新資訊28at.com

再然后,我們新增一點內容,比如在 return 后面使用一個 useEffect。b9128資訊網——每日最新資訊28at.com

const Item = (props) => {  if (!props.api) {    console.log('初始化時,api == null')    return <div>nothing</div>  }  useEffect(() => {    console.log('xxx')  }, [])  console.log('初始化時這里是否執行')  const joke = use(props.api)  return (    <div className='a_value'>{joke.value}</div>  )}

然后演示再看看。我們發現 effect 也不會執行。然后我們還可以搞點好玩的。b9128資訊網——每日最新資訊28at.com

Item 代碼改造如下:b9128資訊網——每日最新資訊28at.com

const Item = (props) => {  if (!props.api) {    const [count, setCount] = useState(0)    console.log('初始化時,api == null')    return <div onClick={() => setCount(count + 1)}>nothing, {count}</div>  }  console.log('初始化時這里是否執行')  const joke = use(props.api)  return (    <div className='a_value'>{joke.value}</div>  )}

注意看,我們在 if 條件判斷中,單獨創建了一個 useState,并在對應的元素上添加了一個讓 count 遞增的交互。b9128資訊網——每日最新資訊28at.com

這段在之前版本的開發中一定會觸發語法錯誤提示的代碼。b9128資訊網——每日最新資訊28at.com

最終也是能勉強運行,但是代碼會瘋狂報錯。b9128資訊網——每日最新資訊28at.com

b9128資訊網——每日最新資訊28at.com

然后,我繼續一個騷操作,我在 if 中條件判斷中,使用 useEffect,代碼如下:b9128資訊網——每日最新資訊28at.com

const Item = (props) => {  if (!props.api) {    useEffect(() => {      console.log('useEffect 在 if 中執行')    }, [])    return <div>nothing</div>  }  console.log('初始化時這里是否執行')  const joke = use(props.api)  return (    <div className='a_value'>{joke.value}</div>  )}

也能正常執行。觀察一下演示效果:b9128資訊網——每日最新資訊28at.com

b9128資訊網——每日最新資訊28at.com

結論:b9128資訊網——每日最新資訊28at.com

很明顯,react 19 的 hook 在底層發生了一些優化更新,我們可以不用非得把所有的 hook 都放在函數組件的最前面去執行了。b9128資訊網——每日最新資訊28at.com

在 React 19 中,我們可以把 hook 放到 return 之后,也可以放到條件判斷中去執行。b9128資訊網——每日最新資訊28at.com

但是,我們一定要注意的是,并非表示我們可以隨便亂寫。當條件互斥時,狀態之間如果存在不合理的耦合關系,依然不能正常執行。我們列舉兩個案例來觀察這個事情。b9128資訊網——每日最新資訊28at.com

第一個案例,我們依然在 if 中執行一個 useEffect,但是不同的是,我把在 if 之外的狀態 counter 作為依賴項傳入。b9128資訊網——每日最新資訊28at.com

代碼如下。b9128資訊網——每日最新資訊28at.com

const Item = (props) => {  const [counter, setCounter] = useState(0)  if (!props.api) {    useEffect(() => {      console.log('useEffect 在 if 中執行')    }, [counter])    return <div>nothing</div>  }  console.log('初始化時這里是否執行')  const joke = use(props.api)  return (    <div className='a_value' onClick={() => setCounter(counter + 1)}>{joke.value}</div>  )}

此時一個很明顯的問題就是,if 內部在 UI 邏輯上本和外部是互斥的關系,但是我們在狀態邏輯上卻相互關聯。因此這個之后,代碼執行就會報錯,明確的告訴你這種寫法不合理。b9128資訊網——每日最新資訊28at.com

b9128資訊網——每日最新資訊28at.com

非常的方便省事。b9128資訊網——每日最新資訊28at.com

當然這樣寫會造成冗余的接口請求執行。因此我們可以稍作調整就可以了。b9128資訊網——每日最新資訊28at.com

這里需要根據需求調整,案例只做演示。b9128資訊網——每日最新資訊28at.com

const _initApi = getApi()function Index() {  const [api, setApi] = useState(_initApi)  ...}

OK,今天的案例就介紹到這里,后續的章節我們還會繼續更多的實戰案例的分析。b9128資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-92464-0.html喔!React19 中的 Hook 可以寫在 If 條件判斷中了。Use 實踐:點擊按鈕更新數據

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

上一篇: 解密Tenacity:Python中最強大的重試庫

下一篇: 關于 Python 數據分析的 15 個 NumPy 應用

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美午夜视频在线| 欧美激情二区三区| 先锋影音久久久| 久久aⅴ国产紧身牛仔裤| 美女精品在线| 欧美三级在线| 国产欧美一区视频| 亚洲国产导航| 亚洲精品视频一区| 亚洲欧美日韩一区二区| 另类天堂视频在线观看| 欧美日韩国产一区二区三区地区| 国产精品国码视频| 一区二区三区自拍| 中国亚洲黄色| 久久久噜噜噜久久中文字免| 欧美日本久久| 国产日韩欧美在线播放不卡| 亚洲欧洲综合另类| 午夜亚洲视频| 欧美激情一区二区三区成人 | 欧美久久久久久久| 国产精品一区二区久久国产| 亚洲第一精品夜夜躁人人爽| 亚洲午夜精品视频| 美脚丝袜一区二区三区在线观看 | 欧美成人嫩草网站| 国产精品网站一区| 最新日韩在线视频| 欧美一区二区三区在线看| 蜜桃伊人久久| 国产三级精品在线不卡| 亚洲欧洲日夜超级视频| 欧美影视一区| 欧美视频中文字幕| 亚洲国产三级| 久久精品国产69国产精品亚洲| 欧美精品国产| 雨宫琴音一区二区在线| 亚洲欧美一区二区在线观看| 欧美国产在线观看| 国内偷自视频区视频综合| 亚洲少妇最新在线视频| 美女久久网站| 国产一区亚洲| 午夜亚洲福利在线老司机| 欧美精品日韩一区| 在线看片日韩| 久久岛国电影| 国产区亚洲区欧美区| 亚洲午夜激情网页| 欧美日本在线| 亚洲人成人一区二区在线观看 | 久久久噜噜噜久久久| 国产精品免费一区二区三区在线观看 | 国产精品久久久久久久久久免费| 亚洲高清激情| 久久精品二区三区| 国产欧美日韩另类视频免费观看| 日韩一级免费观看| 欧美成人精品影院| 伊人久久亚洲热| 久久精品视频在线| 国产日韩一区| 午夜在线视频观看日韩17c| 欧美午夜不卡在线观看免费 | 国产欧美日韩不卡| 亚洲一区三区视频在线观看| 欧美日韩一二区| 日韩视频一区二区| 欧美激情一区二区三区高清视频 | 国产中文一区二区| 欧美一区三区三区高中清蜜桃| 国产精品啊v在线| 亚洲视频www| 欧美日韩色综合| 一本色道久久88综合亚洲精品ⅰ| 欧美精品成人| 一本一道久久综合狠狠老精东影业 | 亚洲欧洲日韩综合二区| 免费成人高清| 亚洲国产精品一区二区第一页| 玖玖玖国产精品| 亚洲电影视频在线| 女生裸体视频一区二区三区| 亚洲国产成人一区| 欧美成人影音| 亚洲免费观看高清在线观看| 欧美日韩国产成人在线| 亚洲精品一区二区三区四区高清| 亚洲人在线视频| 欧美肥婆在线| 日韩一二三在线视频播| 欧美三级视频在线| 亚洲伊人观看| 国产欧美日韩视频在线观看| 欧美综合国产| 在线日韩中文| 欧美国产日产韩国视频| 日韩视频不卡| 国产精品乱码人人做人人爱| 欧美一级片在线播放| 激情久久一区| 欧美高清在线视频观看不卡| 亚洲精品欧洲| 国产精品久久久久久久久婷婷 | 国产欧美一区二区三区久久 | 亚洲破处大片| 欧美日韩在线播放| 亚洲一区免费在线观看| 国产日韩欧美另类| 久久伊人免费视频| 日韩亚洲欧美成人一区| 国产精品久久久久久亚洲调教| 亚洲综合导航| 精品91久久久久| 欧美经典一区二区三区| 国产精品99久久久久久久vr| 国产视频一区二区三区在线观看| 久久最新视频| 中文在线资源观看网站视频免费不卡| 国产精品一区二区黑丝| 久久在线免费视频| 一本色道久久综合亚洲精品婷婷 | 久久先锋资源| 一区二区三区精品| 国产一区二区丝袜高跟鞋图片 | 国产精品xxxav免费视频| 久久av老司机精品网站导航| 亚洲国产专区| 国产精品视频你懂的| 久久综合给合久久狠狠色| 99视频精品在线| 国产欧美一区二区精品性 | 激情成人在线视频| 欧美日韩国产综合视频在线观看中文 | 巨乳诱惑日韩免费av| 在线综合亚洲欧美在线视频| 国内精品视频在线播放| 欧美日韩免费观看中文| 久久国产欧美精品| 亚洲美女在线看| 国产日韩欧美一区二区三区在线观看 | 国产日韩欧美一区二区三区在线观看| 欧美成人精品1314www| 午夜一级在线看亚洲| 亚洲国产欧美国产综合一区| 国产精品欧美日韩久久| 美女91精品| 午夜视频一区二区| 亚洲精品小视频| 黑人中文字幕一区二区三区| 欧美日韩一区二区高清| 久久久久久久久久久久久女国产乱| 99在线|亚洲一区二区| 一区免费观看| 国产欧美一区二区精品婷婷| 欧美日本精品| 久久亚洲图片| 久久超碰97人人做人人爱| 99视频精品免费观看| 伊人久久大香线| 国产乱理伦片在线观看夜一区| 欧美韩国日本综合| 久久九九免费| 午夜精品国产| 一二三四社区欧美黄| 亚洲国产日韩一区| 国模 一区 二区 三区| 国产精品区一区| 欧美日韩国产小视频| 美女主播视频一区| 久久gogo国模裸体人体| 亚洲素人一区二区| 99re这里只有精品6| 一区二区三区中文在线观看| 国产亚洲成人一区| 国产精品入口日韩视频大尺度| 欧美精品久久一区二区| 美女性感视频久久久| 久久精品色图| 午夜日韩视频| 午夜精彩视频在线观看不卡| 一区二区三区.www| 亚洲精品资源美女情侣酒店| 亚洲高清久久网| 禁断一区二区三区在线| 国产主播精品在线| 国产视频一区三区| 国产精品亚洲综合| 国产精品久久久久久亚洲毛片| 欧美日韩伊人| 国产精品va| 久久久久久久久久久成人| 欧美一区二视频| 性一交一乱一区二区洋洋av| 亚洲在线成人| 亚洲欧美国产日韩天堂区| 亚洲综合成人婷婷小说| 亚洲自拍偷拍福利| 午夜精品久久久久久久久久久| 亚洲影院免费观看| 亚洲综合三区| 欧美亚洲日本网站|