React Не выполняет повторную визуализацию после изменения состояния?

если React повторно отображает компонент после каждого изменения состояния, почему он не работает с этим кодом, когда я отправляю newUser в handleFormSubmit()? Я вижу, что он обновляется на консоли реагирования, и он отправляется в базу данных, но я вижу его в DOM только после того, как я действительно перезагружаю страницу, не должен реагировать на обновление компонента, когда я изменяю состояние и отправляю форму?

import React, { Component } from 'react';
import './App.css';

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      users: [],
      newUser: {
        name: '',
        email: '',
        country: '',
        img: ''
      }
    };

    this.handleFormSubmit = this.handleFormSubmit.bind(this);
    this.handleInput = this.handleInput.bind(this);
  }

  fetchData() {
    fetch('http://127.0.0.1:3000/')
      .then((res) => {
        return res.json();
      })

      .then(users =>
        this.setState({
          users: users
        }))
      // handle the error
      .catch(err => console.info(err));
  }

  componentDidMount() {
    this.fetchData();
  }

  // this changes all the inputs
  handleInput(e) {
    const { value } = e.target;
    const { name } = e.target;
    this.setState(
      prevState => ({
        newUser: {
          ...prevState.newUser,
          [name]: value
        }
      }),
      () => console.info(this.state.newUser)
    );
  }

  handleFormSubmit(e) {
    e.preventDefault();
    const userData = this.state.newUser;
    this.setState({
      users: [...this.state.users, userData]
    });

    fetch('http://127.0.0.1:3000/register', {
      method: 'POST',
      body: JSON.stringify(userData),
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json'
      }
    }).then((response) => {
      response.json().then((data) => {
        console.info('Successful' + data);
      });
    });
  }

  render() {
    const { users } = this.state;
    // const users = 0;
    return (
      <div style = {style}>
        {/* <SingUp /> */}

        <div style = {styleForm}>
          <h1>Sign Up!</h1>
          <form onSubmit = {this.handleFormSubmit}>
            <input
                type = "text" placeholder = "name" name = "name"
                value = {this.state.newUser.name} handleChangeEvent = {this.handleInput} onChange = {this.handleInput}
            />

            <input
              type = "text" placeholder = "email" name = "email"
                value = {this.state.newUser.email} handleChangeEvent = {this.handleInput} onChange = {this.handleInput}
            />

            <input
              type = "text"
              placeholder = "country"
              name = "country"
              value = {this.state.newUser.country}
              handleChangeEvent = {this.handleInput}
              onChange = {this.handleInput}
            />

            <input
                type = "text" placeholder = "img url" name = "img"
                value = {this.state.newUser.img} handleChangeEvent = {this.handleInput} onChange = {this.handleInput}
            />

            <button onSubmit = {this.handleFormSubmit}>OK</button>
          </form>
        </div>

        <div style = {style} />
        {users.length > 0 ? (
          users.map((user) => {
            return (
              <div>
                <User
                    key = {user.email} email = {user.email} fullName = {user.full_name}
                    country = {user.country} img = {user.img} created = {user.created_at}
                />
              </div>
            );
          })
        ) : (
          <p> no users found</p>
        )}
      </div>
    );
  }
}

const User = (props) => {
  return (
    <div style = {style}>
      {/* <p>{props.email}</p> */}
      <h4>{props.fullName}</h4>
      <p>{props.country}</p>
      <p>{props.created}</p>
      <img src = {props.img} alt = "" />
    </div>
  );
};

export default App;

Наверное, стоит поставить на кнопку type = "submit"? Я не уверен...

segu 15.05.2018 13:51

Создайте пример минимальный. Мы не можем, например, реплицируйте свою базу данных, и вам не придется писать в нее только для тестирования вашего интерфейса. Создайте тестовый маршрут на вашем сервере, который по запросу возвращает фиктивные данные.

Jared Smith 15.05.2018 14:05

бэкэнд работает хорошо. когда я обновляю страницу, я вижу нового пользователя.

Emerson Lopes 15.05.2018 14:27

Когда удаляю fetchData() хоть работает! может я звоню на прием не в том месте?

Emerson Lopes 15.05.2018 14:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
1 048
1

Ответы 1

Данные newUser не соответствуют тому, что вы предоставили пользовательскому компоненту. Если ваш ответ API имеет формат

{
    email: '',
    full_name: '',
    country: '',
    img: ''
    created_at: '',
}

Вы должны установить состояние с ответом, а не из состояния newUser

handleFormSubmit(e) {
    e.preventDefault();

    fetch('http://127.0.0.1:3000/register', {
      method: 'POST',
      body: JSON.stringify(userData),
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json'
      }
    }).then((response) => {
      response.json().then((data) => {
        console.info('Successful' + data);
        this.setState({
           users: [...this.state.users, data]
        });
      });
    });
  }

Все работает с базой данных, единственная проблема заключается в том, что реакция не повторяется после того, как я размещу user data на моем api. У меня есть `const user = {email: req.body.email, full_name: req.body.name, country : req.body.country, img: req.body.img} `так что это не проблема.

Emerson Lopes 15.05.2018 14:24

@EmersonLopes, вы использовали ответ не от API, а от состояния

Shubham Khatri 15.05.2018 14:26

Ваш код не работает. Когда я удаляю fetchData(), он меняет представление, почему?

Emerson Lopes 15.05.2018 14:33

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