gpt4 book ai didi

validation - 使用 redux-form 和 Fetch API 进行服务器验证

转载 作者:行者123 更新时间:2023-12-03 21:37:08 24 4
gpt4 key购买 nike

如何使用 redux-form 进行服务器端验证和获取 API?
文档中提供了“Submit Validation”演示,其中说推荐的服务器端验证方法是从 onSubmit 函数返回一个 promise 。但是我应该把这个 promise 放在哪里呢?
据我了解 onSubmit 功能应该是我的行动。

<form onSubmit={this.props.addWidget}>...

this.props.addWidget 实际上是我的操作,如下所示。
import fetch from 'isomorphic-fetch';
...
function fetchAddWidget(widget, workspace) {
return dispatch => {
dispatch(requestAddWidget(widget, workspace));
return fetch.post(`/service/workspace/${workspace}/widget`, widget)
.then(parseJSON)
.then(json => {
dispatch(successAddWidget(json, workspace));
DataManager.handleSubscribes(json);
})
.catch(error => popupErrorMessages(error));
}
}

export function addWidget(data, workspace) {
return (dispatch, getState) => {
return dispatch(fetchAddWidget(data, workspace));
}
}

如您所见,我使用 fetch API。我预计 fetch 会返回 promise ,redux-form 会捕获它,但这不起作用。如何使它与 example 的 promise 一起工作?

同样从演示中我无法理解 this.props.handleSubmit 函数中应该提供什么。 Demo不解释这部分,至于我。

最佳答案

这是我基于 http://erikras.github.io/redux-form/#/examples/submit-validation 的示例使用 fetch 的看法.

  • ...but where should I place that promise?
  • ...what should be provided in this.props.handleSubmit?


详细信息在下面的评论中;抱歉,代码块需要一些滚动才能阅读:/
components/submitValidation.js
import React, { Component, PropTypes } from 'react';
import { reduxForm } from 'redux-form';
import { myHandleSubmit, show as showResults } from '../redux/modules/submission';

class SubmitValidationForm extends Component {
// the following three props are all provided by the reduxForm() wrapper / decorator
static propTypes = {
// the field names we passed in the wrapper;
// each field is now an object with properties:
// value, error, touched, dirty, etc
// and methods onFocus, onBlur, etc
fields: PropTypes.object.isRequired,

// handleSubmit is _how_ to handle submission:
// eg, preventDefault, validate, etc
// not _what_ constitutes or follows success or fail.. that's up to us

// I must pass a submit function to this form, but I can either:

// a) import or define a function in this component (see above), then:
// `<form onSubmit={ this.props.handleSubmit(myHandleSubmit) }>`, or

// b) pass that function to this component as
// `<SubmitValidationForm onSubmit={ myHandleSubmit } etc />`, then
// `<form onSubmit={this.props.handleSubmit}>`
handleSubmit: PropTypes.func.isRequired,

// redux-form listens for `reject({_error: 'my error'})`, we receive `this.props.error`
error: PropTypes.string
};

render() {
const { fields: { username, password }, error, handleSubmit } = this.props;

return (
<form onSubmit={ handleSubmit(myHandleSubmit) }>

<input type="text" {...username} />
{
// this can be read as "if touched and error, then render div"
username.touched && username.error && <div className="form-error">{ username.error }</div>
}

<input type="password" {...password} />
{ password.touched && password.error && <div className="form-error">{ password.error }</div> }

{
// this is the generic error, passed through as { _error: 'something wrong' }
error && <div className="text-center text-danger">{ error }</div>
}

// not sure why in the example @erikras uses
// `onClick={ handleSubmit }` here.. I suspect a typo.
// because I'm using `type="submit"` this button will trigger onSubmit
<button type="submit">Log In</button>
</form>
);
}
}

// this is the Higher Order Component I've been referring to
// as the wrapper, and it may also be written as a @decorator
export default reduxForm({
form: 'submitValidation',
fields: ['username', 'password'] // we send only field names here
})(SubmitValidationForm);
../redux/modules/submission.js
// (assume appropriate imports)

function postToApi(values) {
return fetch( API_ENDPOINT, {
credentials: 'include',
mode: 'cors',
method: 'post',
body: JSON.stringify({values}),
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': CSRF_TOKEN
}
}).then( response => Promise.all([ response, response.json()] ));
}

export const myHandleSubmit = (values, dispatch) => {
dispatch(startLoading());

return new Promise((resolve, reject) => {
// postToApi is a wrapper around fetch
postToApi(values)
.then(([ response, json ]) => {
dispatch(stopLoading());

// your statuses may be different, I only care about 202 and 400
if (response.status === 202) {
dispatch(showResults(values));
resolve();
}
else if (response.status === 400) {
// here I expect that the server will return the shape:
// {
// username: 'User does not exist',
// password: 'Wrong password',
// _error: 'Login failed!'
// }
reject(json.errors);
}
else {
// we're not sure what happened, but handle it:
// our Error will get passed straight to `.catch()`
throw(new Error('Something went horribly wrong!'));
}
})
.catch( error => {
// Otherwise unhandled server error
dispatch(stopLoading());
reject({ _error: error });
});
});
};

如果我遗漏了什么/被误解等,请发表评论,我会修改:)

关于validation - 使用 redux-form 和 Fetch API 进行服务器验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34142678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com