cari

Rumah  >  Soal Jawab  >  teks badan

Memilih Cangkuk React yang sesuai untuk digunakan dengan gambar on Firestore

<p>Saya banyak menggunakan syot kilat Firestore dalam apl React Native saya. Saya juga menggunakan cangkuk React. Kod kelihatan seperti ini: </p> <pre class="brush:php;toolbar:false;">useEffect(() ==> { someFirestoreAPICall().onSnapshot(snapshot => { // Apabila komponen mula dimuatkan, tambah semua data yang dimuatkan ke keadaan. // Apabila data pada Firestore berubah, kami menerima kemas kini dalam panggilan balik ini, // Kemudian kemas kini UI berdasarkan keadaan semasa });; }, []);</pre> <p>Pada mulanya, saya fikir <code>useState</code> ialah cangkuk terbaik untuk menyimpan dan mengemas kini UI. Walau bagaimanapun, mengikut tetapan <code>useEffect</code> saya, yang disertakan dengan tatasusunan kebergantungan kosong, apabila panggilan balik syot kilat dicetuskan dan saya cuba mengubah suai keadaan semasa dengan perubahan baharu, keadaan semasa tidak ditentukan . Saya fikir ini adalah disebabkan oleh penutupan. Saya dapat menyelesaikan masalah dengan menggunakan <code>useRef</code> dan <code>forceUpdate()</code> <pre class="brush:php;toolbar:false;">const dataRef = useRef(initialData); const [, updateState] = React.useState(); const forceUpdate = useCallback(() => updateState({}), []); useEffect(() => { someFirestoreAPICall().onSnapshot(snapshot => { // Jika data syot kilat ditambah dataRef.current.push(newData) forceUpdate() // Jika data syot kilat dikemas kini dataRef.current.find(e => beberapa syarat) = updatedData forceUpdate() });; }, []); kembali( // JSX menggunakan dataRef.current )</pra> <p>Soalan saya ialah, adakah saya menggunakan <code>useRef</code> dengan betul serta <code>forceUpdate</code> yang berbeza daripada <code>useState</code>? Saya rasa ingin mengemas kini cangkuk <code>useRef</code> dan memanggil <code>forceUpdate()</code> Apabila cuba menggunakan <code>useState</code>, saya cuba menambah pembolehubah keadaan pada tatasusunan kebergantungan, tetapi ia menghasilkan gelung tak terhingga. Saya hanya mahu memulakan fungsi syot kilat sekali dan mahu data berstatus dalam komponen dikemas kini dari semasa ke semasa apabila bahagian belakang berubah (dicetuskan dalam panggilan balik onSnapshot). </p>
P粉555682718P粉555682718459 hari yang lalu517

membalas semua(2)saya akan balas

  • P粉806834059

    P粉8068340592023-08-25 12:43:07

    Adalah lebih baik jika anda menggabungkan useEffect dan useState. useEffect bertanggungjawab untuk menetapkan dan melumpuhkan pendengar, dan useState hanya bertanggungjawab untuk data yang anda perlukan.

    const [data, setData] = useState([]);
    
    useEffect(() => { 
           const unsubscribe = someFirestoreAPICall().onSnapshot(snap => {
             const data = snap.docs.map(doc => doc.data())
             this.setData(data)
           });
    
           //记得在卸载组件时取消实时监听器,否则会造成内存泄漏
           return () => unsubscribe()
    }, []);

    Kemudian anda boleh terus merujuk "data" dalam cangkuk useState dalam aplikasi anda.

    balas
    0
  • P粉165522886

    P粉1655228862023-08-25 12:37:51

    Penggunaan mudahKesan berkesan untuk saya, saya tidak perlu mencipta fungsi pembantu atau apa-apa jenis,

    useEffect(() => {
            const colRef = collection(db, "data")
            //real time update
            onSnapshot(colRef, (snapshot) => {
                snapshot.docs.forEach((doc) => {
                    setTestData((prev) => [...prev, doc.data()])
                    // console.log("onsnapshot", doc.data());
                })
            })
        }, [])

    Penggunaan mudahKesan berkesan untuk saya, saya tidak perlu mencipta sebarang fungsi pembantu atau apa-apa seperti itu,

    useEffect(() => {
            const colRef = collection(db, "data")
            //实时更新
            onSnapshot(colRef, (snapshot) => {
                snapshot.docs.forEach((doc) => {
                    setTestData((prev) => [...prev, doc.data()])
                    // console.log("onsnapshot", doc.data());
                })
            })
        }, [])

    balas
    0
  • Batalbalas