Astro: запуск typescript/javascript в astro из формы React в onSubmit
Я экспериментирую с Astro и пытаюсь создать форму входа на моей странице Astro. Я хочу использовать компоненты MUI в React для своей формы. В то же время, когда форма отправлена, я хочу вызватьAstro.redirect('/some-page')
. Я знаю из документов , что:
Вы можете передать функцию в качестве реквизита компоненту фреймворка, но это работает только во время серверного рендеринга. Если вы попытаетесь использовать функцию в гидратированном компоненте (например, в качестве обработчика событий), возникнет ошибка.
Это связано с тем, что функции не могут быть сериализованы (перенесены с сервера на клиент) с помощью Astro.
Итак, мой вопрос: возможно ли вызвать перенаправление в astro из функции, работающей при отправке реакции?
А если нет, то как я могу перенаправить из компонента реакции?
На всякий случай я включил свой код ниже:
Моя страница Astro выглядит так
<Layout title="Log in">
<main>
<div class="container box">
<LoginFormReact client:only="react"/>
</div>
</main>
А это содержимое LoginFormReact:
import Avatar from '@mui/material/Avatar';
import CssBaseline from '@mui/material/CssBaseline';
import LoginCheckbox from './LoginCheckBox'
import Grid from '@mui/material/Grid';
import Box from '@mui/material/Box';
import Typography from '@mui/material/Typography';
import Container from '@mui/material/Container';
import TextField from '@mui/material/TextField';
import Button from '@mui/material/Button';
import {setUser} from "../../auth/authStore";
export default function LoginFormReact() {
return (
<>
<Container component={"main"} maxWidth={"xs"}>
<CssBaseline/>
<Box
sx={{
marginTop: 8,
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
}}
>
<Avatar sx={{m: 1, bgcolor: 'secondary.main'}}>
</Avatar>
<Typography component="h1" variant="h5">
Sign in
</Typography>
<Box component="form" onSubmit={async (event) => {
event.preventDefault();
//Here I can do all the js stuff i want like storing the user object.
//This is also where I want to call redirect and or call astro
}} noValidate sx={{mt: 1}}>
<TextField
margin="normal"
required
fullWidth
id="email"
label="Email Address"
name="email"
autoComplete="email"
autoFocus
/>
<TextField
margin="normal"
required
fullWidth
name="password"
label="Password"
type="password"
id="password"
autoComplete="current-password"
/>
<LoginCheckbox/>
<Button
type="submit"
fullWidth
variant="contained"
sx={{mt: 3, mb: 2}}
>
Sign In
</Button>
<Grid container>
<Grid item xs>
<a href="#">
Forgot password?
</a>
</Grid>
<Grid item>
<a href="#">
{"Don't have an account? Sign Up"}
</a>
</Grid>
</Grid>
</Box>
</Box>
</Container>
</>
)
}
2 ответа
Если вы просто хотите перенаправить на другую страницу, вы можете использоватьlocation
API.
Однако, скорее всего, вы захотите позвонить в Astro, используяfetch
вызов конечной точки, отправка данных вашей формы:
<Box component="form" onSubmit={async (event) => {
event.preventDefault();
const formData = new FormData(event.target);
const response = await fetch("/api/myEndpoint", {
method: "POST",
body: formData,
});
}} noValidate sx={{mt: 1}}>
Ответ зависит от того, где будет обрабатываться отправка вашей формы. Если вы обрабатываете это в компоненте React, вы можете использоватьlocation.href
илиlocation.replace
. Если вы отправите заявку на страницу, эта страница получит доступ кAstro.redirect
. Имей в виду.astro
страницы предварительно визуализируются, поскольку Astro — генератор статических сайтов. Исключение составляет случай, когда вы используете функцию маршрутов API Astro.