<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
現在我們比較熟悉的是使用 functional component 和 hooks 來處理 react 邏輯。熟悉 Angular 的使用者可能比較熟悉通過 RxJS 來處理非同步和資料狀態。那麼我們看一下 React 中使用 RxJS 會不會有什麼優勢呢?
有一個 component,顯示 input 中輸入的資料。邏輯也很簡單:
export function ShowInput(props: { data: string; }): JSX.Element { return <>{props.data}</>; }
也就是第一種情況,component 的狀態是通過,props 傳遞進來的。
這當然沒有問題,當資料變化的時候重新渲染即可。假設我們每一次輸入就會觸發一次 api call,然後把 api 返回的內容顯示在介面上。這裡就需要處理兩個問題:
熟悉 RxJS 的話,會知道,這是一個非常簡單的資料流的問題,如果我們把 props 的資料看作是一個資料流的話,就可以非常簡單的解決了。
const apiRespons$ = data$.pipe( debounceTime(500), switchMap(data => getApiResponse(data)), ); // Mock API call function getApiResponse(data: string) { return of(data + ' data from api').pipe(delay(1000)); }
那麼,問題就來了,如何將 props data 轉換成 stream, 又如何將處理完的 stream 轉換成 component state 呢。
這裡就需要引入一個庫: rxjs-hooks
用法一: 將 stream 轉換為 componet state.
比如我們已經得到了 apiResponse$,如何在 component 中顯示的呢?
const apiRespons$ = data$.pipe( debounceTime(500), switchMap(data => getApiResponse(data)), ); const apiResponse = useObservable(() => apiRespons$);
那麼如何結合 props 的變化使用呢?
用法二: 將 props 轉換為 stream useObservable 還可以輸入兩個引數:
完整的程式碼會變成這樣:
export function ShowInput(props: { data: string; }): JSX.Element { const apiResponse = useObservable((_, input$) => input$.pipe( debounceTime(500), switchMap(([data]) => getApiResponse(data)), ), '', [props.data]); return <>{apiResponse}</>; }
當然,也有可能,資料的變化時當前 component 的,不是 props 傳進來的。也就是說這個 input 可能會是在當前 component 中。
當然,我們簡單的把 input 放在當前的 componnet 中,把監聽內容從 props 換成 state. 也比較簡單。
const [data, setData] = useState<string>(); const apiResponse = useObservable((_, input$) => input$.pipe( debounceTime(500), switchMap(([inputData]) => getApiResponse(inputData || '')), ), '', [data]);
那麼,有沒有更簡單一點的方法呢?
就涉及到用法三:將 event 函數的呼叫自動轉換為 stream
const [onInputChange, apiResponse] = useEventCallback((data$: Observable<string>) => data$.pipe( debounceTime(500), switchMap((data) => getApiResponse(data || '')), ), '');
這就將 useState 和 useObservable 合為一體。第一個引數時 event 函數,第二個引數時 state。
當然,如果有使用 redux observable 的話,就可以很好的跟 rxjs-hooks 合為一體。
對於 component 層的區域性狀態,邏輯共用:
react angular | / hooks component store | / js rxjs store
對於 redux 狀態共用
react angular | / redux observable
以上就是React 中使用 RxJS 優化資料流的處理方案的詳細內容,更多關於React RxJS 優化資料流的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45