Memilih Cangkuk React yang sesuai untuk digunakan dengan gambar on Firestore
P粉555682718
P粉555682718 2023-08-24 13:48:51
0
2
457
<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粉555682718
P粉555682718

membalas semua(2)
P粉806834059

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.

P粉165522886

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());
            })
        })
    }, [])
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!