React JS 调度未定义

React JS Dispatch Not Defined

所以我尝试将信息从登录表单发送到操作,然后如果登录过程成功,则将应用程序状态的 userLogged 属性 设置为 true。

    renderForm() {
        return (
            <Form
                onSubmit={(values) => {
                    // call the login function.
                    // if called with this.props.login, I get the error 
                    // 'cannot read `type` of undefined'
                    login(values.email, values.password);
                }}
                validate={({ email, password }) => {
                    // validation rules
                }}>
                {({submitForm}) => {
                    return (
                        <form onSubmit={submitForm}>
                            // form fields
                        </form>
                    );
                }}
            </Form>
        );
    }

现在,在组件声明之后我有以下内容:

function mapDispatchToProps(dispatch) {
    return bindActionCreators({ login }, dispatch);
}

function mapStateToProps(state) {
    return { userLogged: state.userLogged.userLogged };
}

export default connect(mapStateToProps, mapDispatchToProps)(LoginComponent);

action接收到信息,调用API,但是没有到达reducer,app报'dispatch not defined'错误,即使store,middleware和bindActionCreators已经进口。

export function login(email, password) {
    const request = axios({
        headers: { 
            'content-type': 'application/json'
        },
        method: 'post',
        url: `${ROOT_URL}login/login`,
        params: {
            email,
            password
        }
    })
    .then((data) => dispatch(dispatchLogin(data)));
}

function dispatchLogin(data) {
    return {
        type: 'USER_LOGIN',
        payload: data
    };
}

reducer 应检索操作的类型并操作编辑应用程序的状态。

export default function (state = {}, action) {
    switch (action.type) {
        case 'USER_LOGIN': {
            console.log(action.payload.data);
            state.userLogged = action.payload.data.status;
            return { ...state }
        }
        default: return state;
    }
}

Redux 操作默认是同步的,你必须使用像 redux-thunk 这样的中间件来进行异步操作:https://github.com/gaearon/redux-thunk

示例(未经测试):

export function login(email, password) {
    return async (dispatch, getState) => {
        let data = await axios({
            headers: { 
                'content-type': 'application/json'
            },
            method: 'post',
            url: `${ROOT_URL}login/login`,
            params: {
                email,
                password
            }
        });
        dispatch(dispatchLogin(data));
    };
}