cari

Rumah  >  Soal Jawab  >  teks badan

Cangkuk tak segerak dan cangkuk bukan tak segerak untuk mendapatkan data

Saya telah membina cangkuk tersuai:

const useFirestoreCollection = async (collectionName) => {

    const [documents, setDocuments] = useState([]);

    useEffect(() => {
        const fetchData = async () => {
            const querySnapshot = await getDocs(collection(db, collectionName));
            const documentsData = [];
            querySnapshot.forEach((doc) => {
                documentsData.push({
                    id: doc.id,
                    ...doc.data(),
                });
            });
            setDocuments(documentsData);
        };
        fetchData();
    }, []);

    return documents;
};

Saya boleh menggunakannya dalam komponen saya seperti ini:

const [myData, setMyData] = useState([]);

useFirestoreCollection('registeredUsers')
    .then((data) => {
        setMyData(data); // Data Access
    })
    .catch((error) => {
        console.log(error); // Error
    });

Saya juga boleh mengalih keluar async dalam cangkuk tersuai:

const useFirestoreCollection = (collectionName) => { <- ASYNC DELETED
    const [documents, setDocuments] = useState([]);

    useEffect(() => {
        const fetchData = async () => {
            const querySnapshot = await getDocs(collection(db, collectionName));
            const documentsData = [];
            querySnapshot.forEach((doc) => {
                documentsData.push({
                    id: doc.id,
                    ...doc.data(),
                });
            });
            setDocuments(documentsData);
        };
        fetchData();
    }, []);
    return documents;
};

...dan gunakannya dalam komponen saya seperti ini:

const myData = useFirestoreCollection('registeredUsers')

Saya cuba mencari cara terbaik tetapi tidak dapat.

Bilakah anda harus menggunakan kata kunci async dalam cangkuk dan bilakah anda tidak sepatutnya?

P粉041881924P粉041881924277 hari yang lalu327

membalas semua(2)saya akan balas

  • P粉262926195

    P粉2629261952024-02-27 19:04:35

    Saya tidak pernah melihat situasi di mana cangkuk harus tidak segerak. Cangkuk kini mengembalikan janji dan bukannya fungsi keadaan dan setState yang anda mahu komponen itu gunakan. Ini akan menjadi anti-corak utama dan menjadikan kesederhanaan cangkuk sangat rumit.

    Jika anda perlu menggunakan fungsi async/menunggu dalam cangkuk, anda boleh mengisytiharkan fungsi async di dalamnya. Sama seperti yang anda lakukan.

    Kaedah kedua adalah jelas cara yang betul untuk melakukan ini.

    balas
    0
  • P粉369196603

    P粉3691966032024-02-27 00:03:20

    Dalam kes pertama, membuat cangkuk async adalah sia-sia kerana tiada apa-apa asynchronous dalam cangkuk, hanya di dalam useEffect .

    Ini menjadikannya lebih sukar untuk digunakan dan membuat anda mengulangi keadaan.

    balas
    0
  • Batalbalas