Я пытаюсь передать состояние как опору дочернему компоненту, и когда состояние передается, свойства внутри конструктора и componentDidMount дочернего компонента пусты. Но внутри метода рендеринга реквизит не пуст
Мой родительский компонент: Project
import React, { Component } from 'react';
import { NavLink } from 'react-router-dom';
import NewTask from '../../../TaskList/NewTask/NewTask';
import Tasks from '../../../TaskList/Tasks/Tasks';
import './Project.css';
class Project extends Component {
constructor(props) {
super(props);
console.info("props received = " + JSON.stringify(props));
this.state = {
project: {}
};
}
componentDidMount() {
const { match: { params } } = this.props;
fetch(`/dashboard/project/${params.id}`)
.then(response => {
return response.json()
}).then(project => {
this.setState({
project: project
})
console.info(project.tasks)
})
}
render() {
return (
<div>
<section className='Project container'>
<NewTask projectId = {this.state.project._id} />
<br />
<h4>Coming Soon ...</h4>
<Tasks projectId = {this.state.project._id} />
</section>
</div>
);
}
}
export default Project;
Например, в этом компоненте реквизиты отображаются правильно, но в конструкторе и в componentDidMount () пусто.
Мой дочерний компонент: Задачи
import React, { Component } from 'react';
import { NavLink } from 'react-router-dom';
import './Tasks.css';
class Tasks extends Component {
constructor(props) {
super(props);
// There are empty
console.info(JSON.stringify(props.projectId));
this.state = {
projectId: props._id,
tasks: []
};
}
componentDidMount() {
// These are empty too ...
console.info(JSON.stringify(this.props));
}
render() {
return (
<div>
// These aren't empty
{this.props.projectId}
</div>
);
}
}
export default Tasks;





Самый простой способ исправить это - добавить условие в компонент Project:
{this.state.project &&
this.state.project._id &&
<Tasks projectId = {this.state.project._id} />
}
Другой способ - сделать это в компоненте Задача:
constructor(props) {
super(props);
this.state = {
projectId: props._id,
tasks: []
};
}
componentDidUpdate(prevProps, prevState, snapshot) {
// compare this.props and prevProps
if (this.props !== prevProps) {
this.setState({
projectId: this.props._id
});
}
}
render() {
return (
<div>
{this.state.projectId}
</div>
);
}
Первый сработал !! Спасибо! : D для меня это имеет смысл, но я новичок в ReactJS и все еще пытаюсь понять некоторые вещи. Почему я должен добавить это условие? Спасибо за вашу помощь
Не стоит беспокоиться!! Что ж, компонент <Task /> будет отображаться только в том случае, если он соответствует условию. Таким образом, вы в основном говорите React показывать <Task />, если this.state.project и this.state.project._id имеют какое-то значение.
Имеет смысл! Спасибо!
Как минимум, вы можете рассмотреть возможность условного рендеринга Task или подобных компонентов только тогда, когда проект был загружен из выборки. Прямо сейчас в течение определенного периода времени вы передаете значение свойства undefined projectId до тех пор, пока выборка не будет разрешена и setState не будет выполнен. Кроме того, это как минимум поможет, если выборка не удалась, поскольку нет catch () или отката.