Справочная информация:
Я разрабатываю конструктор маршрутов, который состоит из строк или экземпляров компонентов с именем EventContainers, которые представляют деятельность в определенный день пользователя.
Класс, показанный ниже, имеет массив в state.events, который принимает EventContainers из setState в функции pushNewEventContainerToState.
Следует отметить, что каждый EventContainer содержит кнопку, предназначенную для того, чтобы дать пользователю возможность onClick дополнительной строкой / EventContainer путем вызова pushNewEventContainerToState.
Эта же кнопка также указана в качестве собственного экземпляра компонента с именем NewEventButton и отображается перед любым EventContainers.
Любой EventContainer, для которого setStated установлено значение state.events, должен помещаться в индекс сразу после EventContainer, который вызывает setState, а не в начале или в конце.
Метод
Я использую .slice () в setState с намерением сделать именно это => помещая новейший EventContainer в индекс сразу после EventContainer, которыйназывается settate.
Проблема
Однако есть три проблемы, которые я вижу:
a) Только самая первая кнопка, NewEventButton, фактически вызовет setState. Кнопки на новом EventContainer ничего не будут делать.
b) Кажется, что EventContainers, которые проходят через setState, передаются в state.events, а не .sliced (), но мне это не нужноих в конце массива.
в) Когда я проверяю Chrome devtools, я вижу, что любой EventContainer, для которого установлено состояние state.events, не определен.
Что я имеюпробовал
Я пытался поместить два разных вида реквизита непосредственно в EventContainer, который находится внутри pushNewEventContainerToState:
1. The first prop I tried didn't do anything -> onClick={() => this.pushNewEventContainerToState(index)
2. The second prop I tried was the same as the first except, instead of onClick, I named it pushNewEventContainerToState. This got the button on new EventContainers working but the EventContainers seemed to again be .pushed() instead of .sliced the way I need them to be. Chrome devtools will then show this is defined but I don't see a bound like I do for the first NewEventButton.
Большое спасибо за просмотр.
class DayContainer extends React.Component {
constructor(props){
super(props);
this.state = {
events: [],
};
this.pushNewEventContainerToState = this.pushNewEventContainerToState.bind(this);
}
pushNewEventContainerToState(index) {
let newEvent = < EventContainer / > ;
this.setState(prevState => {
const updatedEvents = [...prevState.events.slice(0, index), newEvent, ...prevState.events.slice(index + 1)];
return {
events: updatedEvents
};
})
}
render(){
return (
<>
<div>
<ul>
{
this.state.events === null
? <EventContainer pushNewEventContainerToState={this.pushNewEventContainerToState} />
: <NewEventButton pushNewEventContainerToState={this.pushNewEventContainerToState} />
}
{this.state.events.map((item, index) => (
<li
key={item}
onClick={() => this.pushNewEventContainerToState(index)}
>{item}</li>
))}
</ul>
</div>
</>
)
}
}