Я только начал реагировать, поэтому, пожалуйста, потерпите меня. Я не знаю точно, что я делаю, я просто выбираю эти вещи, как я go, поэтому я приложу все усилия, чтобы помочь вам пройти через мой умственный процесс при построении этого.
Мои намерения создать компонент регистрации, где бэкэнд возвращает ошибки проверки в случае, если есть какие-либо объекты в форме, имеющие следующую структуру.
{
"username": [
"A user with that username already exists."
],
"email": [
"A user is already registered with this e-mail address."
]
}
Менеджер состояний, который я выбрал для использования, - redux
, так что это возвращается каждый раз, когда отправляется функция register.
Так как она имеет эту структуру, я написал функцию, которая поможет мне разобрать ее и получать только о фактических ошибках (строках).
const walkNestedObject = (obj, fn) => {
const values = Object.values(obj)
values.forEach(val =>
val && typeof val === "object" ? walkNestedObject(val, fn) : fn(val))
}
Теперь я хочу отобразить их в представлении, поэтому я написал другую функцию, которая должна это делать
const writeError = (value) => {
return <Alert message={value} type="error" showIcon />
}
Внизу, в фактическом компоненте, который я называю так :
{(props.error) ? walkNestedObject(props.error, writeError) : null}
К моему удивлению, если я console.log
возвращаемое выше значение в writeError
, оно работает безупречно, печатается каждая отдельная ошибка, но ни одна из них не отображается.
To отладка этого я пробовал несколько вариантов, и ни один из них, похоже, не работал, я даже назвал writeError
функцию в компоненте как
{writeError('test')}
, и она работала по какой-то причине.
На этом этапе я просто предполагаю, что для выполнения этой задачи требуются знания о реакции, о которых я только сейчас знаю.
РЕДАКТИРОВАТЬ: ложный пример можно найти более здесь Кроме того, я попытался использовать первые два ответа и при отображении ошибок я получаю это
Unhandled Rejection (TypeError): props.error.map is not a function
с другими вариантами, он упоминает об обещании, поэтому я включу, как я управляю запросом API
export const authSignup = (username, email, password1, password2) => dispatch => {
dispatch(authStart());
axios.post('http://127.0.0.1:8000/rest-auth/registration/', {
username: username,
email: email,
password1: password1,
password2: password2
})
.then(res => {
const token = res.data.key;
const expirationDate = new Date(new Date().getTime() + 3600 * 1000);
localStorage.setItem('token', token);
localStorage.setItem('expirationDate', expirationDate);
dispatch(authSuccess(token));
dispatch(checkAuthTimeout(3600));
})
.catch(err => {
dispatch(authFail(err.response.data))
})
}