使用 axios 和 redux-thunk 以 redux-form 发布请求

Posted

技术标签:

【中文标题】使用 axios 和 redux-thunk 以 redux-form 发布请求【英文标题】:Post request with axios and redux-thunk in a redux-form 【发布时间】:2017-08-30 04:09:00 【问题描述】:

我不知道如何使用 axios 和 redux-thunk 发出发布请求,以便在查询之后调度操作。

这是我的请求模块

export default 
    get: function (action, url) 
        return (dispatch) => 
            axios.get(`$ROOT_URL$url`)
                .then(( data ) => 
                    dispatch(
                        type: action,
                        payload: data
                    );
                );
        ;
    ,

    post: function (action, url, props) 
        return (dispatch) => 
            axios.post(`$ROOT_URL$url`, props)
                .then(( data ) => 
                    return (dispatch) => 
                        dispatch(
                            type: action,
                            payload: data
                        );
                    ;
                );
        ;

    
 

GET 有效。当我调用 post 函数时,它进入了函数,但从不运行返回的函数。

我尝试修改函数的顺序。我最终收到了一个工作发布请求,但从未发送过该操作。

post: function (action, url, props) 
        //POST works but action is not dispatched to reducer
        axios.post(`$ROOT_URL$url`, props)
            .then(( data ) => 
                return (dispatch) => 
                    dispatch(
                        type: action,
                        payload: data
                    );
                ;
            );
    

知道如何实现发送到我的 api 的工作发布请求,然后将响应分派到减速器吗?

谢谢!

更新

经过广泛的测试和反复测试,我认为问题出在 redux-form 上。正如迈克尔所指出的,调度应该有效。我用 get 方法在我的组件中测试了我的调用,但它不起作用。这是我的组件

const form = reduxForm(
    form: 'LoginPage',
    validate
);

const renderField = ( input, label, type, meta:  touched, error  ) => (
    <div className="form-group">
        <label>label</label>
        <div>
            <input ...input placeholder=label type=type className="form-control" />
            touched && ((error && <span>error</span>))
        </div>
    </div>
)

class LoginPage extends Component 
    displayName: 'LoginPage';

    onSubmit(props) 
        login(props.email, props.password);
    

    render() 

        const handleSubmit = this.props;

        return (
            <div className='row'>
                <div className='center-block'>
                    <form onSubmit=handleSubmit(this.onSubmit.bind(this))>
                        <Field name="email" type="email" label='Courriel :' component=renderField />

                        <Field name="password" type="password" label='Mot de passe :' component=renderField />

                        <div className="form-group text-center">
                            <button type="submit" className='btn btn-primary'>Se connecter</button>
                        </div>
                    </form >
                </div>
            </div>
        );
    ;
;

const validate = values => 
    const errors = 
    if (!values.email) 
        errors.email = 'Required'
     else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,4$/i.test(values.email)) 
        errors.email = 'Invalid email address'
    
    if (!values.password) 
        errors.password = 'Required'
     4
    return errors


export default reduxForm(
    form: 'LoginPage',
    validate
)(LoginPage);

post 请求在 onSubmit 方法中。登录方法被调用,但返回值从未被分派。

再次感谢您的宝贵时间和帮助

【问题讨论】:

【参考方案1】:

无法添加评论,但我很高兴你知道了。但是我想警告你,在新版本的 redux-form 上,你必须在连接函数之外装饰你的表单到 redux。我遇到了这个问题,它让我想弄清楚它让我发疯。

更新后连接 redux-form 将是一个两步过程。例如,它看起来像这样。

LoginPage = reduxForm(form: 'LoginPage', validate)(LoginPage)

然后是你的标准连接函数

export default connect(null, actions)(LoginPage)

希望这可以为您省去以后的麻烦

【讨论】:

【参考方案2】:

我发现了我的问题。感谢 Michael 的评论,帮助我找到了另一个方向。

问题是我的表单没有连接到 redux。我最终将连接函数添加到我的导出语句中。

export default connect(null,  login )
    (reduxForm(
        form: 'LoginPage',
        validate
    )(LoginPage));

而且我还必须在 onSubmit 中更改对登录函数的调用

 onSubmit(props) 
        this.props.login(props.email, props.password);
    

【讨论】:

【参考方案3】:

您的函数不应再次“返回(调度)”,因为该操作所做的是返回一个函数。它应该只是

function myFunc(action, url) 
 return function (dispatch) 
   axios.post(`$ROOT_URL$url`, props)
    .then(response => 
      dispatch(
        type: action,
        payload: response.data
      )
  )
  

完整功能编辑。

【讨论】:

谢谢,但这是我最初拥有的,它也不起作用。我在一个网站上看到了发货旁边的退货,所以我试了一下。如果我在 axios.post 之前添加一个 console.log,则在这两种情况下都不会调用它。

以上是关于使用 axios 和 redux-thunk 以 redux-form 发布请求的主要内容,如果未能解决你的问题,请参考以下文章

使用 Redux-Thunk / Axios 从 onUploadProgress 事件调度操作

如何使用“redux-thunk”调用 ajax?

Redux axios 请求取消

使用 Redux Thunk 和 Axios 测试 Action Creator

Redux Thunk操作,axios返回多个值

如何使用 redux-axios-middleware 测试 Redux 异步操作