第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

使用 useEffect() 管理功能組件的狀態(tài)

使用 useEffect() 管理功能組件的狀態(tài)

江戶川亂折騰 2022-06-16 15:40:24
假設我有一個 App.jsx:應用程序.jsxconst App = () => {    return (        <React.Fragment>            <NavBar />            <BooksList />            <TextEditor />        </React.Fragment>    )}export default App;和是 2BooksList個TextEditor功能組件。在一個組件中,我能夠將編輯器的內容保存到數(shù)據(jù)庫中:編輯器.jsxconst TextEditor = () => {    return(        <*editor related stuff*>    )}const SaveContent = ({ value, icon }) => {    return (        <SaveButton            onMouseDown={async () => {                console.log(JSON.stringify(value));                const response = await fetch('/add_book', {                    method: 'POST',                    headers: {                        'Content-Type': 'application/json'                    },                    body: JSON.stringify(value)                })                if (response.ok) {                    console.log('response okay')                }            }}        >            <Icon icon={icon}></Icon>        </SaveButton>    )}這成功寫入我的數(shù)據(jù)庫。我想讓 BookList 組件在我保存/刪除項目時自動更新數(shù)據(jù)庫的內容。這是我目前擁有的 BookList 組件:BooksList.jsxconst BooksList = () => {    const [books, setBooks] = useState([]);    useEffect(() => {        fetch('/get_books')        .then(response =>             response.json()        .then(data => {            setBooks(data)        })        );    }, [])    return (        <*list of saved editors*>    )}所以在加載時,如果數(shù)據(jù)庫是空的,它什么也不顯示。當我保存到數(shù)據(jù)庫時,它什么也沒顯示,然后當我刷新頁面時,它顯示我想要取回的數(shù)據(jù)。我希望能夠保存數(shù)據(jù)并自動看到上述組件刷新和更新。我是 React 和 JS 的新手,所以任何指針都會很棒。我認為可能需要重寫以使用基于類的組件來更輕松地管理狀態(tài)?但我不確定。我的基本理解是,這useEffect()是基于類的安裝方法的功能等價物。這讓我相信這是可以做到的。但是,我讀過有狀態(tài)組件應該使用基于類的組件。
查看完整描述

3 回答

?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

有幾種不同的方法可以做到這一點,這完全取決于您的組件的結構。底線是,當您成功 POST 到數(shù)據(jù)庫時,您需要觸發(fā)您的 GET 請求。一個快速而骯臟的解決方案是將 GET 請求移到一個單獨的函數(shù)中,并在 useEffect 中調用它,并將函數(shù)作為道具傳遞下去。像這樣的東西:


編輯器.jsx


const SaveContent = ({ value, icon, refreshBooksList }) => {

    const addBook = useCallback(async () => {

        const response = await fetch('/add_book', {

            method: 'POST',

            headers: {

                'Content-Type': 'application/json'

            },


            body: JSON.stringify(value)


        })


        if (response.ok) {

            console.log('response okay')

            refreshBooksList()

        }

    }, [value, refreshBooksList])


    return (

        <SaveButton

            onMouseDown={addBook}

        >

            <Icon icon={icon}></Icon>

        </SaveButton>

    )

}

BooksList.jsx


const BooksList = () => {

    const [books, setBooks] = useState([]);


    const getBooksList = useCallback(async () => {

        await fetch('/get_books')

            .then(response => 

                response.json()

            .then(data => {

                setBooks(data)

            })

        );

    }, [setBooks])


    useEffect(() => {

        getBooksList()

    }, [])


    return (

        <*list of saved editors*>

    )

}

如果這兩個組件不是父/子,那么您需要將getBooks函數(shù)向上移動到共享父級。


根據(jù) API 返回的內容,您可以完全刪除額外的 GET 請求并簡單地更新狀態(tài)。如果是這種情況,您可以考慮使用 React Context 來避免傳遞道具。


查看完整回答
反對 回復 2022-06-16
?
元芳怎么了

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

如果 Editor 和 BookList 不在同一個 Parent 組件內,可以使用事件在 Editor 和 BookList 之間進行通信。Editor 可以發(fā)送事件,BookList 可以監(jiān)聽這些事件。

書單

document.body.addEventListener('updateBookList', onUpdateBookList, false);

編輯

const myEvent = new CustomEvent('updateBookList');
document.body.dispatchEvent(myEvent);


查看完整回答
反對 回復 2022-06-16
?
郎朗坤

TA貢獻1921條經驗 獲得超9個贊

如果您的 Editor 和 BookList 組件在同一個父組件內,那么您可以在 Parent 組件內使用狀態(tài)。父級將回調傳遞給編輯器。編輯器將使用此回調通知 Parent 有一本新書。Parent 將增加狀態(tài)并將該狀態(tài)作為道具傳遞給 BookList。然后 BookList 會檢查 useEffect 中的 props 是否發(fā)生了變化,并重新加載書籍列表。


這是一個最小的代碼示例:


const Parent = () => {

  const [x, setX] = React.useState(0);

  const onNewBook = () => {

    setX(state => state+1);

  }

  return (

    <>

      <BookList x={X} />

      <Editor onNewBook={onNewBook} />

    </>

  )

}


const Editor = (props) => {

  onSave = () => {

    // Save the editor to the DB

    props.onNewBook();

  }

}


const BookList= (props) => {

  React.useEffect(() => {

    // Reload the list from DB

  }, [props.X])

}


查看完整回答
反對 回復 2022-06-16
  • 3 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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