我有一个react组件,它异步获取一些资源,然后订阅资源更改。
问题是,清理功能不是在关闭此资源:
useEffect(() => {
const onResourceChange = () => {
console.log('resource changed');
};
getSomeResource().then(resource => {
resource.subscribe(onResourceChange);
});
return () => {
resource.unsubscribe(onResourceChange); // Error! resource is undefined
}
}, []);由于不允许在useEffect中使用异步函数,在useEffect的清理功能中取消订阅该资源的最佳方法是什么?
发布于 2019-07-19 15:49:10
我看到这里发生了两个“副作用”。
[])[resource]上发生)所以我
function useResource() {
const [resource, setResource] = useState(undefined)
const onResourceChange = () => console.log('resource changed');
// Get the resource, initially.
useEffect(() => {
getSomeResource(setResource)
}, [])
// When the resource is retrieved (or changed),
// the resource will subscribe and unsubscribe
useEffect(() => {
resource.subscribe(onResourceChange)
return () => resource.unsubscribe(onResourceChange)
}, [resource])
}
// Use it like this
function App() {
useResource()
return <>your elements</>
}如您所见,第一个useEffect只负责获取“资源”,而第二个useEffect负责调用/订阅回调。
并查看每个useEffect中的useEffect列表(前者是空[],而后者依赖于[resource]__)
发布于 2019-07-19 15:34:17
这是一个解决方案,可能是丑陋的那个..。但仍然有一个解决办法:)
useEffect(() => {
const onResourceChange = () => {
console.log('resource changed');
};
let data = {};
getSomeResource().then(resource => {
data.resource = resource;
resource.subscribe(onResourceChange);
});
return () => {
data.resource && data.resource.unsubscribe(onResourceChange); // Error! resource is undefined
};
}, []);https://stackoverflow.com/questions/57115559
复制相似问题