亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 React 中的高階組件中重新加載子組件

從 React 中的高階組件中重新加載子組件

蝴蝶刀刀 2023-10-14 10:04:22
我正在進行一個小項目的最后一步,該項目使用高階組件 (HOC) 來呈現一個簡單的類似 Tinder 的應用程序。內部組件是一個基于類的組件,具有自己的 fetch() 調用,可以為用戶呈現數據和圖片。外部 HOC 是一個功能組件。要讓應用程序正常工作,我所需要做的就是找到一種方法來刷新內部組件并在用戶按下按鈕時觸發 API 調用。我正在嘗試使用useStateHOC 中的鉤子來執行此操作。import React, { useState } from 'react';export default function TinderCard(component) {  return function (props) {    const [isLoading, setIsLoading] = useState(false);    const refresh = () => {      // change state. set isLoading to true and then back to false.      setIsLoading(true);      setIsLoading(false);    };    const C = component;    return (      <div className='card  user-card-container'>        <div className='card-body user-card-inner'>          {isLoading ? <h3>Loading...</h3> : <C />}          <div className='buttons-container'>            <button className='dislike' onClick={() => refresh()}>              <i className='fa fa-times'></i>            </button>            <button className='like' onClick={() => refresh()}>              <i className='fa fa-heart'></i>            </button>          </div>        </div>      </div>    );  };}一切都工作正常,直到我使用 useState 鉤子,它阻止應用程序渲染并顯示一條非常討厭的錯誤消息。這個:  Line 5:39:  React Hook "useState" cannot be called inside a callback. React Hooks must be called in a React function component or a custom React Hook function  react-hooks/rules-of-hooks我的問題是 - (1) 如何useState在 HOC 中使用來在單擊按鈕時更改狀態,以及 (2) 有沒有一種更簡單的方法可以在按下按鈕時重新加載子組件 - 也許不使用狀態?
查看完整描述

2 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

根據文檔https://reactjs.org/docs/hooks-rules.html

  • 從 React 函數組件調用 Hooks

在你的情況下,你的函數不是一個組件,它是一個返回組件的函數

您可以更改代碼以擺脫 HOC 并使用帶有childrenprop的簡單組合

import React, { useState } from 'react';


export default function TinderCard({children}) {

    const [isLoading, setIsLoading] = useState(false);

    const refresh = () => {

      // change state. set isLoading to true and then back to false.

      setIsLoading(true);

      setIsLoading(false);

    };

    

    return (

      <div className='card  user-card-container'>

        <div className='card-body user-card-inner'>

          {isLoading ? <h3>Loading...</h3> : children}

          <div className='buttons-container'>

            <button className='dislike' onClick={() => refresh()}>

              <i className='fa fa-times'></i>

            </button>

            <button className='like' onClick={() => refresh()}>

              <i className='fa fa-heart'></i>

            </button>

          </div>

        </div>

      </div>

    );

  

}

然后像這樣使用它:


<TinderCard>

  <SomeFriend/>

</TinderCard>


查看完整回答
反對 回復 2023-10-14
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

https://codesandbox.io/s/react-hooks-usestate-forked-6pqw7

看起來上面的答案提供了問題的部分解決方案,但我只是想指出您的解決方案中可能存在的另一個問題。您的刷新函數調用 setIsLoading 兩次。這將導致組件重新渲染,但只會發生一次,并且只會在刷新函數完成執行后發生。您的組件永遠不會在狀態變量實際為 true 的情況下呈現。此外,與狀態變量的 useEffect 掛鉤相關的任何效果也不會在刷新時執行。有關如何發生這種情況的示例,請參閱上面的代碼沙箱。


查看完整回答
反對 回復 2023-10-14
  • 2 回答
  • 0 關注
  • 332 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號