У меня есть 2 компонента с аналогичной логикой, они оба условно отображают сообщение на основе локального состояния из хука useState и двух реквизитов из состояния redux. Однако проблема возникает, когда я нажимаю кнопку ConnectedPasswordChange - я вижу два сообщения, одно от его собственного компонента и одно от ProfileForm. Есть идеи, как от этого избавиться? Это как-то связано с всплыванием событий?
const ConnectedPasswordChange = (): Node => {
const [submitted, setSubmitted] = useState(false);
const isUpdating = useSelector(state => state.user.isUpdating);
const updateError = useSelector(state => state.user.updateError);
const handleSubmit = () => {
const { currentPassword, newPassword } = passwordDetails;
dispatch(passwordUpdateRequested(currentPassword, newPassword));
setSubmitted(true);
setTimeout(() => setSubmitted(false), 5000);
};
return (
<Form onSubmit={handleSubmit}>
<PasswordChange passwordDetails={passwordDetails} onPasswordChange={setPasswordDetails} />
<div style={{ textAlign: "center" }}>
<Form.Button secondary>Button</Form.Button>
</div>
{submitted && !isUpdating && !updateError && <Message positive content="Success" />}
</Form>
);
};
ConnectedPasswordChange используется в компоненте ProfileForm, использующем ту же логику.
const ProfileForm = ({ id, user: initialUser, locations, isUpdating, updateError, onSubmit }: Props): Node => {
const [submitted, setSubmitted] = useState(false);
const handleSubmit = () => {
onSubmit(id);
setSubmitted(true);
setTimeout(() => setSubmitted(false), 5000);
};
return (
<Segment className="my-profile-main-container">
<Title />
<Divider />
<Form onSubmit={handleSubmit}>
<PersonalDetails personalDetails={user} onPersonalDetailsChange={handleDetailsChange} />
<Divider />
<BankDetails bankDetails={user} onBankDetailsChange={handleDetailsChange} />
<div style={{ textAlign: "center" }}>
<Form.Button secondary>Button</Form.Button>
</div>
{submitted && !isUpdating && !updateError && <Message positive content={t("updateSucceeded")} />}
<Divider />
<ConnectedPasswordChange />
</Form>
</Segment>
);
};