Javascript React表单提交正在触发重新呈现(尽管e.preventDefault)
我只是重新构造了我的授权表单组件,将状态处理逻辑拉入一个定制钩子中,以便它可以在其他地方重用。在此之前,提交表单不会触发重新呈现(例如,如果存在验证错误),但现在会触发。为了澄清,页面实际上并没有重新加载/刷新(因此我认为这不是来自默认的表单提交行为),但是背景图像(来自更高级别的容器组件)会重新呈现 AuthForm.jsJavascript React表单提交正在触发重新呈现(尽管e.preventDefault),javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我只是重新构造了我的授权表单组件,将状态处理逻辑拉入一个定制钩子中,以便它可以在其他地方重用。在此之前,提交表单不会触发重新呈现(例如,如果存在验证错误),但现在会触发。为了澄清,页面实际上并没有重新加载/刷新(因此我认为这不是来自默认的表单提交行为),但是背景图像(来自更高级别的容器组件)会重新呈现 AuthForm.js const AuthForm = ({ buttonText, formType, onAuth, history, ...props }) => { cons
const AuthForm = ({ buttonText, formType, onAuth, history, ...props }) => {
const submitData = () => {
onAuth(formType, values, history);
}
const {
values,
errors,
handleChange,
handleSubmit,
} = useForm(submitData, validate);
return (
<Form onSubmit={handleSubmit}>
<FlexContainer flexDirection="column" justify="space-between" >
<FlexContainer flexDirection="column" >
<TextInput
id="email"
name="email"
onChange={handleChange}
value={values.email || ''}
placeholder="Email"
onFocus={(e) => e.target.placeholder = ""}
onBlur={(e) => e.target.placeholder = "Email"}
/>
{errors.email && <ErrorMessage>{errors.email}</ErrorMessage>}
<TextInput
id="password"
name="password"
onChange={handleChange}
type="password"
value={values.password || ''}
placeholder="Password"
onFocus={(e) => e.target.placeholder = ""}
onBlur={(e) => e.target.placeholder = "Password"}
/>
{errors.password && <ErrorMessage>{errors.password}</ErrorMessage>}
</FlexContainer>
<FlexContainer flexDirection='column' >
<Button type="submit" buttonText={buttonText} buttonSize="large"/>
</FlexContainer>
</FlexContainer>
</Form>
)
};
...
function validate(values) {
let errors = {};
if (!values.email) {
errors.email = 'Email address is required';
} else if (!/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/.test(values.email)) {
errors.email = 'Email address is invalid';
}
if (!values.password) {
errors.password = 'Password is required';
} else if (values.password.length < 8) {
errors.password = 'Password must be 8 or more characters';
}
return errors;
};
export default AuthForm;
考虑到大多数代码都是相同的(只是重新定位到一个钩子),我不知道为什么它会导致在树的更高位置重新渲染
AuthForm由AuthContainer呈现,AuthContainer由AuthPage呈现。AuthPage是渲染背景图像的位置
AuthPage.js
const Background = styled.div`
background-image: url('myimage.jpg');
background-repeat: no-repeat;
background-size: cover;
min-height: 90vh;
`
const AuthPage = (props) => (
<Background>
<FlexContainer justify="space-evenly" padding="100px 40px 0 40px" wrap="nowrap">
<AuthContainer {...props}/>
<AsideContainer {...props} />
</FlexContainer>
</Background>
)
export default AuthPage;
const Background=styled.div`
背景图片:url('myimage.jpg');
背景重复:无重复;
背景尺寸:封面;
最小高度:90vh;
`
const AuthPage=(道具)=>(
)
导出默认AuthPage;
AuthPage是什么样子的?将AuthPage添加到原始邮件中,您说的是AuthPage
表单提交时重新提交?背景图像闪烁并重新加载,所以我假设这就是发生的事情。我想知道它是否与onAuth函数有关,因为它使用的是类似于历史对象的东西。AuthPage是什么样子的?将AuthPage添加到原始Post中,而您说的是在表单提交时重新加载?背景图像会闪烁并重新加载,所以我假设这就是正在发生的事情。我想知道它是否与onAuth的onAuth
函数有关,因为它取的是看起来像历史对象的东西。
const Background = styled.div`
background-image: url('myimage.jpg');
background-repeat: no-repeat;
background-size: cover;
min-height: 90vh;
`
const AuthPage = (props) => (
<Background>
<FlexContainer justify="space-evenly" padding="100px 40px 0 40px" wrap="nowrap">
<AuthContainer {...props}/>
<AsideContainer {...props} />
</FlexContainer>
</Background>
)
export default AuthPage;