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

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

如何將回調函數參數傳遞給父React組件?

如何將回調函數參數傳遞給父React組件?

鳳凰求蠱 2023-07-14 16:40:15
只是想知道將 letterSelected 傳遞到 useLazyQuery fetchMovies 查詢中的最佳方法,這樣我就不必使用“A”的靜態變量。我希望有一種方法可以將它直接傳遞到 fetchMovies 中。useLazyQuery 是一個 apollo 查詢。const BrowseMovies = () => {const [fetchMovies, { data, loading}] = useLazyQuery(BROWSE_MOVIES_BY_LETTER, {    variables: {        firstLetter: "A"    }})return (    <div className="browserWrapper">        <h2>Browse Movies</h2>        <AlphabetSelect             pushLetterToParent={fetchMovies}        />        {            data && !loading &&            data.browseMovies.map((movie: any) => {                return (                    <div className="browseRow">                        <a className="movieTitle">                            {movie.name}                        </a>                    </div>                )            })        }    </div>)}export default BrowseMoviesconst AlphabetSelect = ({pushLetterToParent}: any) => {const letters = ['A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','#']const [selectedLetter, setSelectedLetter] = useState("A")const onLetterSelect = (letter: string) => {    setSelectedLetter(letter.toUpperCase())    pushLetterToParent(letter.toUpperCase())}return (    <div className="alphabetSelect">        {            letters.map((letter: string) => {                return(                    <div                         className={selectedLetter === letter ? 'letterSelectActive' : 'letterSelect'}                         onClick={() => onLetterSelect(letter)}                    >                        {letter}                    </div>                )            })        }    </div>)}export default AlphabetSelect
查看完整描述

1 回答

?
慕的地10843

TA貢獻1785條經驗 獲得超8個贊

這似乎是通過Lifting State Up解決的問題。useLazyQuery接受 gql 查詢和選項并返回一個函數以稍后執行查詢。聽起來您希望子組件更新variables配置參數。

瀏覽電影

  1. 移動firstLetter狀態BrowseMovies組件

  2. 從狀態更新查詢參數/選項/配置

  3. 添加useEffect狀態更新時觸發獲取

  4. firstLetter狀態和setFirstLetter狀態更新器傳遞給子組件

const BrowseMovies = () => {

? const [firstLetter, setFirstLetter] = useState('');


? const [fetchMovies, { data, loading}] = useLazyQuery(

? ? BROWSE_MOVIES_BY_LETTER,

? ? { variables: { firstLetter } } // <-- pass firstLetter state

? );


? useEffect(() => {

? ? if (firstLetter) {

? ? ? fetchMovies(); // <-- invoke fetch on state update

? ? }

? }, [firstLetter]);


? return (

? ? <div className="browserWrapper">

? ? ? <h2>Browse Movies</h2>

? ? ? <AlphabetSelect?

? ? ? ? pushLetterToParent={setFirstLetter} // <-- pass state updater

? ? ? ? selectedLetter={firstLetter} // <-- pass state

? ? ? />

? ? ? {

? ? ? ? data && !loading &&

? ? ? ? ? data.browseMovies.map((movie: any, index: number) => {

? ? ? ? ? ? return (

? ? ? ? ? ? ? <div key={index} className="browseRow">

? ? ? ? ? ? ? ? <a className="movieTitle">

? ? ? ? ? ? ? ? ? {movie.name}

? ? ? ? ? ? ? ? </a>

? ? ? ? ? ? ? </div>

? ? ? ? ? ? )

? ? ? ? ? })

? ? ? }

? ? </div>

? )

}

字母選擇


將pushLetterToParent回調附加到 的處理div程序onClick


?const AlphabetSelect = ({ pushLetterToParent, selectedLetter }: any) => {


? ?const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ#';


? ?return (

? ? ?<div className="alphabetSelect">

? ? ? ?{

? ? ? ? ?letters.split('').map((letter: string) => {

? ? ? ? ? ?return(

? ? ? ? ? ? ?<div

? ? ? ? ? ? ? ?key={letter}

? ? ? ? ? ? ? ?className={selectedLetter === letter ? 'letterSelectActive' : 'letterSelect'}?

? ? ? ? ? ? ? ?onClick={() => pushLetterToParent(letter.toUpperCase())}

? ? ? ? ? ? ?>

? ? ? ? ? ? ? ?{letter}

? ? ? ? ? ? ?</div>

? ? ? ? ? ?)

? ? ? ? ?})

? ? ? ?}

? ? ?</div>

? ?)

?}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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