我正在尝试访问 Redux actionCreators 内的状态;相反,执行了以下操作(在减速器中执行ajax操作)。为什么我需要为此访问状态 - 因为我想使用存储在状态中的 CSRF 令牌来执行 ajax。
有人可以告诉我以下是否被认为是不好的做法/反模式?
export const reducer = (state = {} , action = {}) => {
case DELETE_COMMENT: {
// back-end ops
const formData = new FormData();
formData.append('csrf' , state.csrfToken);
fetch('/delete-comment/' + action.commentId , {
credentials:'include' ,
headers:new Headers({
'X-Requested-With':'XMLHttpRequest'
}) ,
method:'POST' ,
body:formData
})
// return new state
return {
...state ,
comments:state.comments.filter(comment => comment.id !== action.commentId)
};
}
default: {
return state;
}
}
来自 redux 文档:
改变状态的唯一方法是发出一个动作,一个描述发生了什么的对象。不要将 API 调用放入减速器中。减速器只是纯函数,它接受前一个状态和一个操作,并返回下一个状态。请记住返回新的状态对象,而不是改变以前的状态。
行动应该描述变化。因此,操作应该包含新版本状态的数据,或者至少指定需要进行的转换。因此,API 调用应该进入异步操作,以分派操作来更新状态。减速器必须始终是纯净的,并且没有副作用。
查看异步操作了解更多信息。
redux 示例中的异步操作示例:
function fetchPosts(subreddit) {
return (dispatch, getState) => {
// contains the current state object
const state = getState();
// get token
const token = state.some.token;
dispatch(requestPosts(subreddit));
// Perform the API request
return fetch(`https://www.reddit.com/r/${subreddit}.json`)
.then(response => response.json())
// Then dispatch the resulting json/data to the reducer
.then(json => dispatch(receivePosts(subreddit, json)))
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)