1 回答

TA贡献1936条经验 获得超7个赞
保持useObservable钩子隔离,并创建一个可观察值(记忆到位置 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>
);
};
或者,我进一步建议将状态的所有权更改为useObservable:
const useObservable = (observable) => {
const [value, setValue] = useState();
useEffect(() => {
let subscription = observable.subscribe((result) => {
setValue(result);
});
return () => subscription.unsubscribe();
}, [observable]);
return value;
};
这样你就不需要外部状态设置器,它总是在钩子内处理。您还可以使用setStatewithinuseObservable来捕获可观察对象的错误和完成事件。
添加回答
举报