Кнопка onSubmit в неопределенном состоянии

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

import React, { Component } from "react";
import PropTypes from "prop-types";
import { connect } from "react-redux";
import { graphGet } from "../../actions/graphActions";

class Graph extends Component {
  constructor(props) {
    super(props);
    this.state = {
      concepts: []
    };
    this.onSubmit = this.onSubmit.bind(this);
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.errors) {
      this.setState({ errors: nextProps.errors });
    }
  }
  onSubmit(e) {
    e.preventDefault();

    this.props.graphGet(this.props.org);
  }
  render() {
    this.setState((this.state.concepts = this.props.graph.graph.concepts));
    console.info(this.state.concepts);
    const list = (
      <dl>
        {this.state.concepts.map(concept => {
          return (
            <div key = {concept.id_cpt}>
              <dt>{concept.fr_cpt}</dt>

              <hr />
            </div>
          );
        })}
      </dl>
    );
    return (
      <div>
        <form onSubmit = {this.onSubmit}>
          <input type = "submit" />
        </form>
        {this.state.concepts ? list : "wait"}
      </div>
    );
  }
}
Graph.prototypes = {
  graphGet: PropTypes.func.isRequired,
  auth: PropTypes.object.isRequired,
  errors: PropTypes.object.isRequired
};
const mapStateToProps = state => ({
  auth: state.auth,
  graph: state.graph,
  errors: state.errors
});
export default connect(
  mapStateToProps,
  { graphGet }
)(Graph);

Добро пожаловать в переполнение стека! Я написал ответ для вас ниже. Дайте мне знать, если это поможет :)

Chris Ngo 29.04.2019 00:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
419
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добро пожаловать в stackoverflow. Взглянув на ваш код, у меня есть несколько предложений для вас.

1) Не вызывайте логику обновления состояния внутри метода render. Это вызывает проблемы с производительностью и часто приводит к непреднамеренному повторному рендерингу. Также this.setState((this.state.concepts = this.props.graph.graph.concepts)) не является правильным способом обновления состояния вашего компонента.

Что вы можете сделать, так это переместить эту логику в метод жизненного цикла componentDidMount(), который будет запускаться сразу после первого рендеринга компонента.

componentDidMount(){
   this.setState({
      concepts: this.props.graph.graph.concepts
   });
}

2) Если вы хотите, чтобы ваш список заполнялся после отправки формы, вы можете сохранить эту логику в функции и использовать ее после того, как вы подтвердите, что форма была отправлена/нажата кнопка. Мы также будем использовать другое значение состояния, чтобы проверить, была ли форма отправлена ​​до того, как мы отобразим список.

Итак, добавив это, ваш код будет выглядеть примерно так:

import React, { Component } from "react";
import PropTypes from "prop-types";
import { connect } from "react-redux";
import { graphGet } from "../../actions/graphActions";

class Graph extends Component {
  constructor(props) {
    super(props);
    this.state = {
      concepts: [],
      formSubmitted: false
    };
    this.onSubmit = this.onSubmit.bind(this);
  }

  componentDidMount(){
    this.setState({
       concepts: this.props.graph.graph.concepts
    })
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.errors) {
      this.setState({ errors: nextProps.errors });
    }
  }
  onSubmit(e) {
    e.preventDefault();
    this.props.graphGet(this.props.org);
    this.setState({
       formSubmitted: true
    })
  }

  createList(){
      return(
         <dl>
            {this.state.concepts.map(concept => {
              return (
                <div key = {concept.id_cpt}>
                  <dt>{concept.fr_cpt}</dt>
                <hr />
               </div>
             );
             })}
         </dl>
      )
  }

  render() {
    return (
      <div>
        <form onSubmit = {this.onSubmit}>
          <input type = "submit" />
        </form>
        {this.state.concepts && this.state.formSubmitted ? this.createList() : 
        "wait"}
      </div>
    );
  }
}
Graph.prototypes = {
  graphGet: PropTypes.func.isRequired,
  auth: PropTypes.object.isRequired,
  errors: PropTypes.object.isRequired
};
const mapStateToProps = state => ({
  auth: state.auth,
  graph: state.graph,
  errors: state.errors
});
export default connect(
  mapStateToProps,
  { graphGet }
)(Graph);

ваш код работает для меня с изменением ``` componentWillReceiveProps (nextProps) { if (nextProps.errors) { this.setState ({ errors: nextProps.errors }); } this.setState({ concepts: this.props.graph.graph.concepts }); } ```

Zouari Moez 29.04.2019 01:42

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