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

React useEffect, что не так?

В компоненте EditProfile, в useEffect вызываю функцию getUserProfile, а ниже получаю данные и подставляю в форму... если вызывать через setTimeout = 1 сек, то всё срабатывает, но если без setTimeout, то срабатывает ошибка, так как profile я получаю пустой...
Что может быть не так?

P.S. Есть родительский компонент где я сначала получаю данные пользователя, а потом в дочернем получаю данные профиля этого пользователя. В родительском есть метод getUser который так же вызывается в useEffect. Есть подозрение что сначала срабатывает getUserProfile, а уже потом getUser (оба метода посылают асинхронный запрос на сервер). Как пофиксить?

const App = ({ loadUser }) => {
  useEffect(() => {
    loadUser();
  });
  return (
      <Switch>
        <PrivateRoute exact path="/dashboard" component={Dashboard} />
        <PrivateRoute exact path="/create-profile" component={CreateProfile} />
        <PrivateRoute exact path="/edit-profile" component={EditProfile} />
      </Switch>
  );
};

App.propTypes = {
  loadUser: Proptypes.func.isRequired
};

export default connect(null, { loadUser })(App);


const EditProfile = ({
  profile: {loading, profile},
  createProfile,
  getUserProfile,
  history
}) => {
  const [formData, setFormData] = useState({
    key1: "",
    key2: "",
    key3: ""
  });
  useEffect(() => {
    // getUserProfile();
    setTimeout(() => {
        getUserProfile();
      }, 1000);
    setFormData({
      key1: loading || !profile.key1? "" : profile.key1,
      key2: loading || !profile.key2 ? "" : profile.key2,
      key3: loading || !profile.key3 ? "" : profile.key3,
    });
  }, [loading, getCurrentProfile]);


  const {
key1,
key2,
key3
  } = formData;

  const onChange = e =>
    setFormData({ ...formData, [e.target.name]: e.target.value });

  const onSubmit = e => {
    e.preventDefault();
    createProfile(formData, history, true);
  };

  return (
    <Fragment>
{* ФОРМА*}
    </Fragment>
  );
};

EditProfile.propTypes = {
  createProfile: Proptypes.func.isRequired,
  getUserProfile: Proptypes.func.isRequired,
  profile: Proptypes.object.isRequired
};

const mapStateToProps = state => ({
  profile: state.profile
});

export default connect(mapStateToProps, { createProfile, getUserProfile})(
  withRouter(EditProfile)
);
  • Вопрос задан
  • 100 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
@abberati
frontend-разработчик
Вы показали очень много стандартного кода, который у всех одинаковый и из него не вытащить полезную информацию. Однако вы не показали, ни что такое getUserProfile, ни что такое loadUser, поэтому увы, никаких ответов не дождётесь(
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽