【发布时间】:2019-01-14 08:30:00
【问题描述】:
我是 React-Redux 的新手。正在开发一个应用程序。问题是我在异步执行 Redux actionCreator 时遇到了一些问题,可能是这样。
下面是我的组件。比如说,我想从 componentDidMount() 或从 onclick 事件侦听器调用 actionCreator。
class Dashboard extends PureComponent {
componentDidMount() {
this.props.getProductsAndPackages();
let something = [];
something = this.props.products;
}
....................................
}
或者,this.props.getProductsAndPackages(); 函数可以是一个 onClick 事件处理程序,它做同样的事情,上下文是相同的。在先解释我的代码后,我会问我的问题。
在我的仪表板容器的下侧:
Dashboard.propTypes = {
getProductsAndPackages: PropTypes.func.isRequired,
products: PropTypes.array.isRequired,
.......................
};
const mapStateToProps = (state) => {
return {
.....................
products: state.products.products,
...................
};
};
const mapDispatchToProps = (dispatch) => {
return {
getProductsAndPackages: () => dispatch(getProductsAndPackagesActionCreator()),
};
};
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Dashboard));
我的 actionCreator 是这样的:
export const getProductsAndPackagesActionCreator = () => {
return (dispatch) => {
dispatch(productsIsLoading(true));
let url = 'xyz';
if(!!localStorage.getItem('_token')) {
const local_token = localStorage.getItem('_token');
const fullToken = 'Bearer '.concat(local_token);
axios.get(url, {headers: {Authorization: fullToken}})
.then(response => {
dispatch(productsIsLoading(false));
if (response.data.statusCode === 200) {
dispatch(productsFetched(true));
dispatch(products(response.data.data));
} else {
dispatch(productsFetched(false));
dispatch(productsErrors(response.data.message));
}
})
.catch(error => {
});
} else {
axios.get(url)
.then(response => {
dispatch(productsIsLoading(false));
if (response.data.statusCode === 200) {
dispatch(productsFetched(true));
dispatch(products(response.data.data));
} else {
dispatch(productsFetched(false));
dispatch(productsErrors(response.data.message));
}
})
.catch(error => {
console.log(error);
dispatch(productsIsLoading(false));
dispatch(productsErrors(error.message));
});
}
};
};
现在,我希望我的 getProductsAndPackagesActionCreator() 返回一个 Promise 或任何允许我的 something 变量获取从服务器返回的实际数据的东西。现在,当我得到实际数据时,something=this.props.products 行已经被执行,我取回了为products 设置的 initialValue。
我知道,每当我收到填充的 products 时,组件都会重新渲染,但这无助于我的决策。
顺便说一句,我正在使用redux-thunk。
我现在该怎么办?抱歉发了这么长的帖子。
【问题讨论】:
-
您好,您可以将您的回复数据传递给您的操作
payload,然后更新您的商店。完成此操作后,您将不再需要任何cont something,因为它将在您的组件中以props的形式从mapStateToProps获得 -
我已经完成了。如您所见,我只是将
this.props.products值分配给something。然而问题是,当 axios 调用结束时,something=this.props.products已经被执行了。并且something被分配了主要从我的减速器设置的initialState值。我想确保,我的something变量仅分配有从 axios get 请求接收到的填充数组。 -
顺便说一句:可能你有错误:
dispatch(productsIsLoading(false));应该在 finally 块中,因为并不总是调用 catch。 -
最初我在 catch 块中有该代码。但为了简洁起见,我省略了它。
-
第一个问题是:你到底为什么要这个?您正在使用 React 和 Redux,因此请使用选择器的强大功能!只需在您需要时分派操作,然后让选择器将其作为组件的道具传递...然后您的渲染器将完成其余的工作,同时它是异步调用,在您的渲染器中显示一些加载反馈。那是你应该遵循的模式,请解释一下你为什么要打破这种模式。因为问题就在那里……
标签: javascript reactjs redux react-redux redux-thunk