Задать вопрос
@EmKotlety

Как вернуть значение из функции в react?

Нужно вернуть значение message из вызова функции registration чтобы передать его другому компоненту. На основании этого сообщения будет всплывать подсказка как прошел запрос. В самой функции я это сделать не могу так как там компонент подсказки не отобразить. надо реакт функция. А реакт функцию в колбеке формика вызывать нельзя, ругаетсяю...
Вот функция:
export const registration = async (email, login, password, context, message) => {
    
    try{
       
        const response = await axios.post(`http://localhost:5000/api/auth/register`,
    {email, login, password})
    message = response.data.message
    console.log('fromfuncmessage', message)
    // alert(message)
        if(message === 'Пользователь создан'){
            context.handleClose()
           
            
        }
        return message
    }
    
    catch(e){
        alert(e.response.data.message)
        console.log(e)
    }
    
}

Вызывается она здесь:
import React from 'react';
import Avatar from '@material-ui/core/Avatar';
import Button from '@material-ui/core/Button';
import CssBaseline from '@material-ui/core/CssBaseline';
import TextField from '@material-ui/core/TextField';
import FormControlLabel from '@material-ui/core/FormControlLabel';
import Checkbox from '@material-ui/core/Checkbox';
import Link from '@material-ui/core/Link';
import Grid from '@material-ui/core/Grid';
import Box from '@material-ui/core/Box';
import LockOutlinedIcon from '@material-ui/icons/LockOutlined';
import Typography from '@material-ui/core/Typography';
import { makeStyles } from '@material-ui/core/styles';
import Container from '@material-ui/core/Container';
import { useState , useContext} from 'react'
import { Formik } from 'formik'
import * as yup from 'yup'
import { registration } from './actions/user';
import { useDispatch } from 'react-redux';
import {Context} from './App'
const useStyles = makeStyles((theme) => ({
  wrappper: {
    marginTop: theme.spacing(1),
    display: 'flex',
    flexDirection: 'column',
    alignItems: 'center',
    borderRadius: '10px !important'
  },
  avatar: {
    margin: theme.spacing(1),
    backgroundColor: theme.palette.secondary.main,
  },
  form: {
    width: '100%', // Fix IE 11 issue.
    marginTop: theme.spacing(1),
  },
  submit: {
    margin: theme.spacing(3, 0, 2),
  },
  
}));

export default function RegistrForm(props) {
  const message = 'пусто';
  
  const context = useContext(Context)
  console.log('wtf:', context.handleClose)
  const classes = useStyles();
  const dispatch = useDispatch()
  const validationsShema = yup.object().shape({
    login: yup.string().min(2,'too shot')
    .max(15,'Too long').required('Required'),
    email: yup.string().email('Invalid email').required('Required'),
    password: yup.string().min(2,'пароль не надежный')
    .max(15,'Too long').required('Required'),
  })

  return (
    <Container component="main" maxWidth="xs">
      <CssBaseline />
      <div className={classes.wrappper}>
        <Avatar className={classes.avatar}>
          <LockOutlinedIcon />
        </Avatar>
        <Typography component="h1" variant="h5">
          Sign up
        </Typography>
        
            <Formik 
                validateOnBlur
                initialValues={{
                login:"",
                email: "",
                password: ""
                }}
                // validateOnBlur
                validationSchema = {validationsShema}
                onSubmit = {(values) => registration(values.email,values.login, values.password, context,message)}
                
            >
              
        {({ values, errors, touched, handleChange, handleBlur, isValid, handleSubmit, dirty}) => (
        
        <form className={classes.form} noValidate>
          <TextField
            value = {values.login}
            type = {`text`}S
            name = { `login`}
            onChange = {handleChange}
            onBlur = {handleBlur}
            
            variant="outlined"
            margin="normal"
            required
            fullWidth
            id="login"
            label="Login"
            
            autoComplete="login"
            autoFocus
          />
          {touched.email && errors.email ? <div className = "alert">{errors.login}</div>:<div></div>}
          <TextField
            value = {values.email}
            type = {`text`}
            name = { `email`}
            onChange = {handleChange}
            onBlur = {handleBlur}
            
            variant="outlined"
            margin="normal"
            required
            fullWidth
            id="email"
            label="Email Address"
            
            autoComplete="email"
            
          />
          {touched.email && errors.email ? <div className = "alert">{errors.email}</div>:<div></div>}
          <TextField
            value = {values.password}
            type = {`password`}
            id = "password"
            onChange = {handleChange}
            onBlur = {handleBlur}
            variant="outlined"
            margin="normal"
            required
            fullWidth
            label="Password"
            
            autoComplete="current-password"
          />
          {touched.password && errors.password ? <div className = "alert">{errors.password}</div>:<div></div>}
          <FormControlLabel
            control={<Checkbox value="remember" color="primary" />}
            label="Remember me"
          />
          <Button
            disabled={ !isValid  }
            onClick = {(e)=>{
              handleSubmit(e);
            }}
            type = {`submit`}
            name="action"
            fullWidth
            variant="contained"
            color="primary"
            className={classes.submit}
          >
            Sign Up
          </Button>
          <Grid container>
            <Grid item xs>
              <Link href="#" variant="body2">
                Forgot password?
              </Link>
            </Grid>
            <Grid item>
              <Link href="#" variant="body2">
                {"Don't have an account? Sign Up"}
                {console.log('message:', message)}
              </Link>
            </Grid>
          </Grid>
        </form>
        )}
        </Formik>
      </div>
    </Container>
  );
}

пробую создать переменную за фунцией, ее передаю в колбэк, но когда вывожу в консоль ниже то там так и остается "пусто"
  • Вопрос задан
  • 1505 просмотров
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Решения вопроса 1
@ParaBellum577
создайте стейт.
const [message, setMessage] = React.useState('');
Положите туда значение и передавайте его куда угодно) Это ж реакт)
В функции registration там где у вас return message напишите:
setMessage(message);
Готово. Ваше сообщение находится в стейте компонента, передавайте message куда хотите
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽