第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

React 功能組件中的 RxJS

React 功能組件中的 RxJS

HUWWW 2023-02-24 16:03:29
這個問題的大部分是我正在嘗試創(chuàng)建反應組件,每個組件都有一個基于組件道具的可觀察對象。我有幾個位置,每個位置都有環(huán)境讀數(shù),我想獨立生成 D3 圖以使用 RxJS 管理傳入的數(shù)據(jù)。我在這里有這個概念的工作版本:https://www.lloydrichardsdesign.com/experiment/021我遇到的問題是這個例子,我已經(jīng)硬編碼了組件外部的 firestore observable。但在我的下一個版本中,我想制作一個組件,該組件可以在加載時將 locationId 提供給可觀察對象,然后每個組件管理自己的狀態(tài)。這看起來像:import { Observable } from "rxjs"import { Dispatch, SetStateAction, useEffect, useState } from "react";const useObservable = (observable: Observable<any>, setter: Dispatch<SetStateAction<any>>) => { useEffect(()=>{let subscription = observable.subscribe(result => {    setter(result);});return ()=> subscription.unsubscribe() },[observable, setter])}const LocationItem: React.FC<LocationProps> = ({ location }) => {   const [readings, setReadings] = useState<Array<Reading>>([]);   const dataObservable = collectionData(      db      .collection('mimirReading')      .where('locationId', '==', location.id)      .orderBy('timestamp', 'desc')      .limit(48)  );  useObservable(dataObservable, setReadings);   return(    <ol>     {readings.map(r=><li>{r.timestamp}</li>)}    </ol>   )}問題是,這導致 useObservable 被一遍又一遍地調(diào)用,從不返回任何數(shù)據(jù)。我最終得到一個空讀數(shù)狀態(tài),我的控制臺變得瘋狂。我想,我必須在組件首次安裝時創(chuàng)建 dataObservable,所以在 useEffect 中,但隨后我會收到與在其內(nèi)部調(diào)用 useEffect 相關的錯誤。最后,我嘗試在第一次創(chuàng)建組件時將訂閱拉出并放入 useEffect 中,但是可觀察對象從未收集過任何信息。像這樣:useEffect(() => {    const dataObservable = collectionData(      db        .collection('mimirReading')        .where('locationId', '==', location.id)        .orderBy('timestamp', 'desc')        .limit(48)    ).subscribe((reads) => {      console.log(reads);      setReadings(reads as Array<Reading>);    });    console.log(dataObservable);    return () => dataObservable.unsubscribe();  }, []);我現(xiàn)在有點茫然,不知道該怎么辦。如果有人有任何想法或解決方案,將不勝感激!
查看完整描述

1 回答

?
LEATH

TA貢獻1936條經(jīng)驗 獲得超7個贊

保持useObservable鉤子隔離,并創(chuàng)建一個可觀察值(記憶到位置 id)以傳遞給它:


const useObservable = (observable, setter) => {

  useEffect(() => {

    let subscription = observable.subscribe(result => {

      setter(result);

    });

    return () => subscription.unsubscribe()

    },

    [observable, setter]

  );

};


const LocationItem = ({ location }) => {

  const [readings, setReadings] = useState([]);


  const dataObservable = useMemo(() => {

    return collectionData(

      db

        .collection('mimirReading')

        .where('locationId', '==', location.id)

        .orderBy('timestamp', 'desc')

        .limit(48)

    );

  }, [location.id]);


  useObservable(dataObservable, setReadings);


  return (

    <ol>

      {readings.map((r) => (

        <li>{r.timestamp}</li>

      ))}

    </ol>

  );

};


或者,我進一步建議將狀態(tài)的所有權(quán)更改為useObservable:


const useObservable = (observable) => {

  const [value, setValue] = useState();

  useEffect(() => {

    let subscription = observable.subscribe((result) => {

      setValue(result);

    });

    return () => subscription.unsubscribe();

  }, [observable]);

  return value;

};

這樣你就不需要外部狀態(tài)設置器,它總是在鉤子內(nèi)處理。您還可以使用setStatewithinuseObservable來捕獲可觀察對象的錯誤和完成事件。


查看完整回答
反對 回復 2023-02-24
  • 1 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號