1. just declare
import React, { useState, useEffect, useMemo } from 'react';
import { interval } from 'rxjs';
export default function App() {
const [state, setState] = useState();
const observable$ = useMemo(() => interval(1000), []);
return (
<div>
<h1>Hello RxJS!</h1>
<p>Observable value: {state}</p>
</div>
);
}
2. subscribe
useEffect(() => {
const subscription = observable$.subscribe(setState);
}, []);
3. unsubscribe before componentDidUnmount
useEffect(() => {
const subscription = observable$.subscribe(setState);
return () => subscription.unsubscribe();
}, [])
4. use useMemo to avoid performance issue
In the code snippet you provided, the observable$
is created every time the App
component renders. However, it's not a good practice to create a new observable on every render because it could lead to performance issues and unnecessary re-rendering of the component.
const observable$ = useMemo(() => interval(1000), []);
In this updated code, the useMemo
hook is used to memoize the observable$
. The observable$
will only be re-computed if any of the dependencies in the dependency array change, which is empty in this case. This ensures that the observable$
is created only once and not on every render.
5. use react-observable
import React from 'react';
import { interval } from 'rxjs';
import { useObservable, useSubscription } from 'react-observable';
export default function App() {
const [state, setState] = useState();
const observable$ = useObservable(() => interval(1000));
useSubscription(observable$, (interval: number) => {
setState(interval);
});
return (
<div>
<h1>Hello RxJS!</h1>
<p>Observable value: {state}</p>
</div>
);
}
you don't need to worry about memoizing the observable$
and managing the subscription or unsubscription. The useObservable
hook takes care of all of that for you, which simplifies the code and ensures better performance.
tip: with pipe operator?
const observable$ = useObservable(() => interval(1000))
.pipe(filter(v => v % 2 === 1));
In this case, every time a component renders, observable$.pipe
part created.
You are creating a new observable derived from the one returned by the useObservable
hook. However, keep in mind that the new observable created by the .pipe
operator will not be automatically memoized.
- use useMemo to memorize new observable
const observable$ = useObservable(() => interval(1000));
const filtered$ = useMemo(
() => observable$.pipe(filter(v => v % 2 === 1)),
[]
);
- use pipe inside useObservable
const observable$ = useObservable(() => {
return interval(1000).pipe(filter(v => v % 2 === 1));
});
2 is better I think
댓글