Когда я отображаю страницу, а список пуст, это создает проблему с картой. Я хочу знать, как заставить функцию карты ждать, пока не будет нажата кнопка, которая вызывает действие сокращения. Я думаю, что это проблема управления состоянием, когда страница визуализируется, состояние списка понятий представляет собой пустой список, затем он заполняется нажатием кнопки
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);





Добро пожаловать в 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 }); } ```
Добро пожаловать в переполнение стека! Я написал ответ для вас ниже. Дайте мне знать, если это поможет :)