Skip to content

Instantly share code, notes, and snippets.

@anaisbetts
Last active January 20, 2019 04:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anaisbetts/b73f26574e4739fe07eb260c17e1c227 to your computer and use it in GitHub Desktop.
Save anaisbetts/b73f26574e4739fe07eb260c17e1c227 to your computer and use it in GitHub Desktop.
always use function parameters
function Example() {
// Crap, we just made a Firebase query for each render instead of
// what we wanted, a query set up on mount, and cleaned up on unmount
const query = useQuery(db.collections('lots-of-stuff').limit(10000));
return <ul>query.docs.map(x => (<li>{x}</li>));
}
export function useQuery(query: /*Firebase */Query) {
return useObservable<QuerySnapshot>(() =>
concat(
query.get(),
queryUpdates(q).pipe(filter(x => x && x.docChanges().length > 0))
)
);
}
export function useQueryMoreBetter(query: () => Query) {
const [q] = useState(query);
return useObservable<QuerySnapshot>(() =>
concat(
q.get(),
queryUpdates(q).pipe(filter(x => x && x.docChanges().length > 0))
)
);
}
export function useObservable<T>(
target: () => Observable<T>,
initial?: T
): T | undefined {
const [ret, setter] = useState(initial);
const [obs] = useState(target());
useEffect(
() => {
const sub = obs.subscribe(setter);
return sub.unsubscribe.bind(sub);
},
[obs]
);
return ret;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment