reactjs - Argumen dari tipe '() =>() => Promise' tidak dapat ditetapkan ke parameter dari tipe 'EffectCallback'
Kode saya adalah:
useEffect(() => {
document.querySelector('body').style['background-color'] = 'rgba(173, 232, 244,0.2)';
window.$crisp.push(['do', 'chat:hide']);
return async () => {
window.$crisp.push(['do', 'chat:show']);
document.querySelector('body').style['background-color'] = '#ffffff';
if (router.query.id) {
const resDoc = await firebase.firestore().doc(`documents/${router.query.id}`).get();
if (resDoc.exists) {
await clearDocPrediction(router.query.id);
}
}
};
}, []);
Sekarang alasan saya kembali adalah karena saya percaya bahwa itu melakukan pembersihan fungsi saat dibongkar, jadi saya perlu mempertahankannya. Ini adalah semacam kesalahan build yang saya tidak begitu yakin bagaimana cara menyelesaikannya. Bantuan apa pun akan sangat dihargai.
Jawaban #1
Fungsi callback dari Effect seharusnya mengembalikan void, misalnya:
useEffect(() => { // callback; it returns void
console.log("Hi")
}, [])
Atau
Seharusnya mengembalikan sebuah fungsi "cleanup" dengan tipe () => void, misalnya:
useEffect(() => {
console.log("Hi")
return () => { // cleanup function of type : () => void
console.log("Cleanup")
}
}, [])
Anda mendapatkan kesalahan karena fungsi pembersihan dalam kode Anda bukan bertipe () => void, tetapi bertipe () => Promise<void>, misalnya:
Argumen dari tipe '() =>() => Promise' tidak dapat ditugaskan ke parameter dari tipe 'EffectCallback'. Tipe '() => Promise' tidak dapat ditugaskan ke tipe 'void | Destructor'.
useEffect(() => {
console.log("Hi")
return async () => { // WRONG
console.log("Cleanup")
}
}, [])
Oleh karena itu, inilah cara Anda dapat merestrukturisasi fungsi "cleanup" Anda untuk memperbaikinya:
return () => { // Remove async from here
const clear = async () => { // Create a new async function: clear
// write your cleanup code here
};
clear() // Call the clear() function
};
Jawaban #2
Callback useEffect seharusnya memiliki tipe kembalian void. Jadi Anda tidak bisa mengembalikan Promise:
useEffect(() => {
document.querySelector('body').style['background-color'] = 'rgba(173, 232, 244,0.2)';
window.$crisp.push(['do', 'chat:hide']);
window.$crisp.push(['do', 'chat:show']);
document.querySelector('body').style['background-color'] = '#ffffff';
if (router.query.id) {
firebase.firestore()
.doc(`documents/${router.query.id}`)
.get()
.then((resDoc) => {
if (resDoc.exists) {
clearDocPrediction(router.query.id);
}
});
}
}, []);
