如何使按钮 link 指向另一个组件?
How can I make a button link to another component?
当我使用 useNavigate 挂钩在我的登录组件中单击按钮时,我试图加载我的注册组件,但是当我在按钮中添加 onClick={navigate('/register', {replace: true})}
时,它使得当我单击登录时 link 在我的导航栏中,它正在加载 /register 而不是我的登录表单。我应该改用 Link 还是我做错了什么?感谢任何帮助,非常感谢!
import React, {useState, useEffect} from 'react';
import {useDispatch, useSelector} from 'react-redux';
import {Link, useNavigate} from 'react-router-dom';
import {Formik, Field, Form, ErrorMessage} from 'formik';
import * as Yup from 'yup';
import {login} from '../../slices/auth';
import {clearMessage} from '../../slices/messages';
const Login = (props) => {
const navigate = useNavigate();
const [loading, setLoading] = useState(false);
const {isLoggedIn} = useSelector((state) => state.auth);
const {message} = useSelector((state) => state.message);
const dispatch = useDispatch();
useEffect(() => {
dispatch(clearMessage());
}, [dispatch]);
const initialValues = {
username: '',
password: '',
};
const validationSchema = Yup.object().shape({
username: Yup.string().required('Please enter your Username'),
password: Yup.string().required('Please enter your Password'),
});
const handleLogin = (formValue) => {
const {username, password} = formValue;
setLoading(true);
dispatch(login({username, password}))
.unwrap()
.then(() => {
navigate('/profile', {replace: true});
})
.catch(() => {
setLoading(false);
});
};
if (isLoggedIn) {
return <Link to='/profile' />;
}
return (
<div className='login'>
<div className='form-container'>
<h1 id='welcome-plate'>Welcome, please Login</h1>
<div className='button-box'>
<div id='btn'>
<button type='button' className='toggle-btn' id='login-option'>
Login
</button>
<button
type='button'
className='toggle-btn'
id='register-option'
onClick={navigate('/register', {replace: true})}
>
Register
</button>
</div>
</div>
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={handleLogin}
>
<Form>
<div className='login-group'>
<Field
name='username'
type='text'
className='form-control'
placeholder='User ID'
/>
<ErrorMessage
name='username'
component='div'
id='username-error'
/>
</div>
<div className='login-group'>
<Field
name='password'
type='password'
className='form-control'
placeholder='Enter Password'
/>
<ErrorMessage
name='password'
component='div'
id='password-error'
/>
</div>
<div className='login-group'>
<button type='submit' className='login-btn' disabled={loading}>
{loading && (
<span className='spinner-border spinner-border-sm'></span>
)}
<span>Login</span>
</button>
</div>
</Form>
</Formik>
</div>
{message && (
<div className='form-group' id='alert'>
<div className='alert alert-danger' role='alert'>
{message}
</div>
</div>
)}
</div>
);
};
export default Login;
onClick={navigate('/register', { replace: true })}
这会立即调用 navigate
函数。您想要将回调函数传递给 onClick
处理程序, 然后 调用 navigate
以发出命令式重定向。
onClick={() => navigate('/register', { replace: true })}
当我使用 useNavigate 挂钩在我的登录组件中单击按钮时,我试图加载我的注册组件,但是当我在按钮中添加 onClick={navigate('/register', {replace: true})}
时,它使得当我单击登录时 link 在我的导航栏中,它正在加载 /register 而不是我的登录表单。我应该改用 Link 还是我做错了什么?感谢任何帮助,非常感谢!
import React, {useState, useEffect} from 'react';
import {useDispatch, useSelector} from 'react-redux';
import {Link, useNavigate} from 'react-router-dom';
import {Formik, Field, Form, ErrorMessage} from 'formik';
import * as Yup from 'yup';
import {login} from '../../slices/auth';
import {clearMessage} from '../../slices/messages';
const Login = (props) => {
const navigate = useNavigate();
const [loading, setLoading] = useState(false);
const {isLoggedIn} = useSelector((state) => state.auth);
const {message} = useSelector((state) => state.message);
const dispatch = useDispatch();
useEffect(() => {
dispatch(clearMessage());
}, [dispatch]);
const initialValues = {
username: '',
password: '',
};
const validationSchema = Yup.object().shape({
username: Yup.string().required('Please enter your Username'),
password: Yup.string().required('Please enter your Password'),
});
const handleLogin = (formValue) => {
const {username, password} = formValue;
setLoading(true);
dispatch(login({username, password}))
.unwrap()
.then(() => {
navigate('/profile', {replace: true});
})
.catch(() => {
setLoading(false);
});
};
if (isLoggedIn) {
return <Link to='/profile' />;
}
return (
<div className='login'>
<div className='form-container'>
<h1 id='welcome-plate'>Welcome, please Login</h1>
<div className='button-box'>
<div id='btn'>
<button type='button' className='toggle-btn' id='login-option'>
Login
</button>
<button
type='button'
className='toggle-btn'
id='register-option'
onClick={navigate('/register', {replace: true})}
>
Register
</button>
</div>
</div>
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={handleLogin}
>
<Form>
<div className='login-group'>
<Field
name='username'
type='text'
className='form-control'
placeholder='User ID'
/>
<ErrorMessage
name='username'
component='div'
id='username-error'
/>
</div>
<div className='login-group'>
<Field
name='password'
type='password'
className='form-control'
placeholder='Enter Password'
/>
<ErrorMessage
name='password'
component='div'
id='password-error'
/>
</div>
<div className='login-group'>
<button type='submit' className='login-btn' disabled={loading}>
{loading && (
<span className='spinner-border spinner-border-sm'></span>
)}
<span>Login</span>
</button>
</div>
</Form>
</Formik>
</div>
{message && (
<div className='form-group' id='alert'>
<div className='alert alert-danger' role='alert'>
{message}
</div>
</div>
)}
</div>
);
};
export default Login;
onClick={navigate('/register', { replace: true })}
这会立即调用 navigate
函数。您想要将回调函数传递给 onClick
处理程序, 然后 调用 navigate
以发出命令式重定向。
onClick={() => navigate('/register', { replace: true })}