Реагировать на собственный, не может обновить во время существующего перехода состояния
У меня есть реагирующий родной компонент. Я получил ошибку:
Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state.
Код:
import....
class Register extends Component {
static navigationOptions = {
header: null,
};
async handleSubmit(values, customerCreate) {
const { email, password, firstName, lastName, phone } = values;
const input = { email, password, firstName, lastName, phone };
const customerCreateRes = await customerCreate({ variables: { input } });
const isCustomerCreated = !!customerCreateRes.data.customerCreate.customer.id;
if (isCustomerCreated) {
const isStoredCrediential = await storeCredential(email, password);
if (isStoredCrediential === true) {
// Store in redux
// Go to another screen
console.log('test');
}
}
}
render() {
return (
<Mutation mutation={CREATE_CUSTOMER_ACCOUNT}>
{
(customerCreate, { error, data }) => {
return (
<MainLayout
title="Create Account"
backButton
currentTab="profile"
navigation={this.props.navigation}
>
{ showError }
{ showSuccess }
<RegistrationForm
onSubmit={async (values) => this.handleSubmit(values, customerCreate)}
initialValues={this.props.initialValues}
/>
</MainLayout>
);
}
}
</Mutation>
);
}
}
const mapStateToProps = (state) => {
return {
....
};
};
export default connect(mapStateToProps)(Register);
CREATE_CUSTOMER_ACCOUNT - это graphql:
import gql from 'graphql-tag';
export const CREATE_CUSTOMER_ACCOUNT = gql`
mutation customerCreate($input: CustomerCreateInput!) {
customerCreate(input: $input) {
userErrors {
field
message
}
customer {
id
}
}
}
`;
Кто использует handleSubmit?
Есть кнопка в форме вызова handleSubmit, при нажатии.
этот синтаксис правильный onPress={handleSubmit}?
const PrimaryButton = ({ label, handleSubmit, disabled }) => {
let buttonStyle = styles.button;
if (!disabled) {
buttonStyle = { ...buttonStyle, ...styles.primaryButton };
}
return (
<Button block primary={!disabled} disabled={disabled} onPress={handleSubmit} style={buttonStyle}>
<Text style={styles.buttonText}>{label}</Text>
</Button>
);
};
экспорт по умолчанию PrimaryButton;
Обновление 1: если я удалю customerCreate
(исходя из graphql) ошибка исчезает. Это означает, что асинхронное ожидание действительно корректно, но мне нужно customerCreate
3 ответа
Если вы пытаетесь добавить аргументы к обработчику в перекомпоновании, убедитесь, что вы правильно определяете свои аргументы в обработчике. Также может случиться так, что вы случайно вызвали метод onSubmit в вашем методе рендеринга, возможно, вы захотите перепроверить onSubmit
в компоненте RegistrationForm. Также вы можете попробовать еще одну вещь, двигаясь async handleSubmit(values, customerCreate) {
в handleSubmit = async(values, customerCreate) =>
; Если это не работает, пожалуйста, сложите RegistrationForm
компонент, а также.
В итоге, если вы не устанавливаете состояние в рендере, этого не произойдет.
Вы проверили с помощью следующего кода?
onSubmit={(values) => this.handleSubmit(values, customerCreate)}
Оказывается, синтаксис ожидания асинхронности правильный. Полный оригинальный код (не размещен здесь) содержит Toast component react-base
, Другой разработчик может сказать мне, чтобы удалить его, и ошибка исчезла. Иногда это трудно отладить.