在redux thunk中的AsyncStorage,动作不调度

时间:2018-04-30 21:46:42

标签: react-native redux

我在收到数据时尝试使用asynchStoragedispatch次操作:

  componentWillMount() {
    AsyncStorage.getItem("loggedIn")
        .then(this.props.dispatch(isLoadingCredentials(true)))
        .then(
            data =>
                data
                    ? this.props
                          .dispatch(setCredentials(JSON.parse(data)))
                          .then(this.props.dispatch(navigate("Month")))
                          .then(
                              this.props.dispatch(
                                  isLoadingCredentials(false)
                              )
                          )
                    : this.props.dispatch(isLoadingCredentials(false))
        );
}

使用redux connect

export default connect(mapStateToProps)(HomeScreen);

我收到错误:

Possible Unhandled Promise Rejection (id: 0):
TypeError: _this2.props.dispatch(...).then is not a function
TypeError: _this2.props.dispatch(...).then is not a function

如何在收到数据时发送动作?

1 个答案:

答案 0 :(得分:0)

尝试定义mapStateToProps并将其作为第二个参数传递给const mapDispatchToProps = dispatch => ({ isLoadingCredentials: (loadingCredentials) => ( dispatch(isLoadingCredentials(loadingCredentials)) ) })

connect

您可以使用bindActionCreators作为Pegase745建议。它是上述的简写。

然后通过connect(mapStateToProps, mapDispatchToProps)(HomeScreen)将其传递给您的组件。

dispatch

然后你会像这样使用你的功能,注意那里没有componentWillMount() { AsyncStorage.getItem("loggedIn") .then(() => this.props.isLoadingCredentials(true)) ... } 属性。

AsyncStorage

您可能希望重构对isLoadingCredentials(true)的来电,因为一旦Promise完成后您就会调用componentWillMount() { this.props.isLoadingCredentials(true); AsyncStorage.getItem("loggedIn") .then((user) => { // You have your User, do as you wish // Add setCredentials and others to mapDispatchToProps }) .catch(() => { this.props.isLoadingCredentials(false); // Error }); }

{{1}}