在React中导航离开组件时中止请求
Abort request while navigating away from the component in React
我使用react
, redux
和react-router
。我的页面之一是使API请求并显示数据。它工作得很好。我想知道的是,如果API请求尚未完成,并且用户导航到另一个路由,我希望能够中止请求。
我假设我应该在componentWillUnmount
中调度一些操作。只是无法理解它是如何工作的。类似…
componentWillUnmount() {
this.props.dispatch(Actions.abortRequest());
}
我将把xhr
引用存储在动作的某个地方。不确定这是否是正确的方法(我认为不是),有人能指出我在正确的方向吗?
我不认为在行动中存储xhr
是正确的。
动作应该是可序列化的,而XMLHttpRequest绝对不是。
相反,我将使用Redux Thunk从我的操作创建者返回一个自定义对象,并执行如下操作:
function fetchPost(id) {
return dispatch => {
// Assuming you have a helper to make requests:
const xhr = makePostRequest(id);
dispatch({ type: 'FETCH_POST_REQUEST', response, id });
// Assuming you have a helper to attach event handlers:
trackXHR(xhr,
(response) => dispatch({ type: 'FETCH_POST_SUCCESS', response, id }),
(err) => dispatch({ type: 'FETCH_POST_FAILURE', err, id })
);
// Return an object with `abort` function to be used by component
return { abort: () => xhr.abort() };
};
}
现在你可以在你的组件中使用abort
:
componentDidMount() {
this.requests = [];
this.requests.push(
this.props.dispatch(fetchPost(this.props.postId))
);
}
componentWillUnmount() {
this.requests.forEach(request => request.abort());
}
我不认为这种方法有什么不妥。你在store
中持有的是全局应用程序状态;如果你想根据其他动作改变xhr
的行为,那么你需要将该状态存储在某个地方。
我见过很多这样的例子:
{
isFetching: false,
items: [],
lastUpdated: null
};
isFetching
状态然后用于显示加载旋转器或防止多个xhr
请求被发送。我看到你的使用和存储xhr
引用,并能够中止它只是一个扩展。
相关文章:
- React重新渲染但未显示正确的组件
- 不能从angular2中的子组件指定父组件中的数组
- 拨打'父亲'函数形式a'儿童'ReactJS中的组件
- ajax请求的顺序总是不同的
- React组件等待所需道具进行渲染
- Meteor如何接收HTTP请求
- AJAX 请求没有在我的 React 组件中设置 this.state.data
- 当有多个 React.js 组件实例具有数据请求时如何处理缓存
- 如何根据变量值动态请求React组件
- 有Ember.js任何附加组件来路由请求
- 用于显示异步请求状态的GUI组件
- 在Ajax请求后动态附加的HTML中呈现组件
- 在React中导航离开组件时中止请求
- 尝试在React组件中发出Ajax请求并使用响应
- Ajax请求数据在组件之间传递
- 在对另一个组件执行http请求时保持响应性
- React组件在一次或多次点击中获取请求
- vadin -从客户端javascript组件请求布局
- React组件生命周期API请求
- NS_NOINTERFACE:组件没有请求的接口[nsIDOMLocation.reload]