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 ответа

Если вы просто хотите перенаправить на другую страницу, вы можете использоватьlocationAPI.

Однако, скорее всего, вы захотите позвонить в 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.

Другие вопросы по тегам