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 來避免傳遞道具。

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);

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])
}
添加回答
舉報