【发布时间】:2018-08-10 09:36:57
【问题描述】:
我正在使用 redux thunk 来返回对操作的 API 调用:
export const getActiveCampaigns = () => {
return (dispatch, getState) => {
const bearer = 'Bearer ' + getState().login.bearer
return axios.get(API.path + 'campaign/active/?website_id=' + getState().selectedWebsite.selectedWebsite + '&' + API.beaconAPI_client, { headers: { 'Authorization': bearer } })
.then(function (response) {
dispatch({
type: GET_ACTIVE_CAMPAIGNS,
activeCampaigns: response.data.response
})
})
}
}
这可以成功地返回一个活动列表,我正在使用以下方法将其渲染到另一个组件中:
class ActiveCampaignsDropdown extends Component {
// usual stuff
componentDidMount(){
this.props.dispatch(getActiveCampaigns())
}
// render function displays campaigns using this.props.activeCampaigns
}
const mapStateToProps = (state) => {
return {
activeCampaigns: state.activeCampaigns.activeCampaigns
}
}
但是,请注意getState.selectedWebsite.selectedWebsite 的操作。这是从应用程序中其他地方的操作设置的,用户从下拉列表中选择一个网站。我的减速器看起来像这样:
export default function (state = {}, action) {
switch(action.type){
case SET_SELECTED_WEBSITE:
return {
...state,
selectedWebsite: action.websiteId
}
default:
return state;
}
}
export default function (state = {}, action) {
switch(action.type){
case GET_ACTIVE_CAMPAIGNS:
return {
...state,
activeCampaigns: action.activeCampaigns
}
default:
return state;
}
}
我设置所选网站的操作:
export const setSelectedWebsite = (websiteId) => {
return {
type: SET_SELECTED_WEBSITE,
websiteId
}
}
这与其他减速器相结合,如下所示:
export default combineReducers({
login,
activeWebsites,
activeCampaigns,
selectedWebsite
})
问题
活动广告系列下拉框的内容在页面加载时可以正常工作 - 状态树会更新 - 但当所选网站更改时它不会更新。据我所知:
- 我正在正确调度操作
- 我正在更新状态,而不是改变它
我很失望 Redux 在这种情况下并没有“正常工作”,尽管我可能在只睡了几个小时的情况下忽略了一些愚蠢的事情!任何帮助表示赞赏。
【问题讨论】:
-
你的状态树改变了吗?如果您也可以将正在使用该状态对象的组件发布在其中,那就更好了。
-
请向我们展示您的组件实现以及您连接到商店的部分。
-
通过调用 props.dispatch 和 mapStateToProps 连接。状态树正在发生变化,但仅在页面加载时发生。
-
给我看
GET_ACTIVE_CAMPAIGNSreducer -
@MattSaunders 是的,强制从另一个不负责这样做的组件进行刷新将是糟糕的设计。再次查看您的代码后,我想我知道您的问题是什么。当您切换网站时,您的 ActiveCampaignsDropdown 不知道它。因为它的所有道具都没有改变,所以没有更新。我将编辑我的答案,为您提供完整的解决方案。 PS:直接为组件提供
dispatch函数也被认为是不好的做法。而是使用 mapDispatchToProps 为您的调度调用提供包装函数(请参阅下面的答案)
标签: reactjs redux redux-thunk