Итак, прямо сейчас я получаю текущий идентификатор элемента или любое другое свойство (которое поступает из JSON), но я не могу отобразить его внутри модального раздела.
Весь модальный файл находится внутри Array.map(), я получаю положительный результат от console.info(), но я не могу отобразить его внутри модального раздела, вот как я его использую.
open(index) {
this.setState({
show: true
});
console.info(index);
}
render(){
{
this.state.items.map((data, index) => {
return (
<>
...
<Button onClick = {this.open.bind(this, data.id)}>
Contact Us
</Button>
<Modal
show = {this.state.show}
onClose = {this.close}
closeOnBlur = {true}
>
<Modal.Content>
<Section style = {{ backgroundColor: "white" }}>
Current ID :
</Section>
</Modal.Content>
</Modal>
}
Когда я нажимаю кнопку, он регистрирует правильный идентификатор. Но когда я пытаюсь отрендерить это в разделе, я не могу это сделать.
currentElement(index) {
return index;
}
Я решил эту логику для рендеринга, но использование этого метода дает следующую ошибку:
Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.
Вот как я использую указанную функцию
<Modal.Content>
<Section style = {{ backgroundColor: "white" }}>
Current ID :{" "}
{this.currentElement.bind(this, data.id)}
</Section>
Вот демонстрация видео того, что происходит, мне нужен тот же идентификатор, который находится в console.info в DOM
React дает правильное предупреждение: вы не можете отобразить функцию (а функция # bind возвращает функцию, поэтому this.currentElement.bind возвращает функцию). Модальный элемент - это просто элемент (DOM): он либо отображается, либо не отображается для каждого рендера, и из кода видно, что отображение / скрытие работает. Следующий шаг, который я предлагаю, - это поместить this.state.items#data.id где-нибудь в состояние компонента (что происходит в методе open), а затем использовать его вместе с компонентом Modal в возвращаемом значении render.
@JDorrian: да, но только текущий элемент
@ rm - Извините, но я не могу полностью понять this.state.items#data.id
Я добавил весь код для модального окна, если это поможет
видео не записывает консоль, поэтому вот скриншот консоли. imgur.com/a/C8bY6F3



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если у вас есть структура данных, содержащая данные, которые вы хотите перебрать и вернуть в DOM, есть несколько способов добиться этого.
Я рекомендую перебирать структуру данных, преобразовывая значения в элементы DOM и добавляя их в массив. После завершения цикла вы можете вернуть весь массив в DOM.
Например:
render(){
return(){
<div>{this.displayItems()}</div>
}
}
displayItems(){
var dom_array = []
this.state.items.map(function(data, index){
dom_array.push(<div onClick = {console.info('inside forEach(): ', data, index)}>{index}</div>)
}, this)
return dom_array
}
Если вы пытаетесь сохранить элементы таким образом, чтобы к ним можно было получить доступ по идентификатору, сохраните их в состоянии. В зависимости от сохраняемых значений хорошим решением может быть объект javascript.
Редактировать: На основе вашего кода для доступа к вашим значениям внутри модального окна:
open(data) {
this.setState({
show: true,
dataId: data
});
console.info(data); //or whatever else you want to access
}
this.state.items.map((data, index) => {
return (
<>
...
<Button onClick = {() => this.open(data.id)}>
Contact Us
</Button>
<Modal
show = {this.state.show}
onClose = {this.close}
closeOnBlur = {true}
>
<Modal.Content>
<Section style = {{ backgroundColor: "white" }}>
Current ID : {this.state.dataId}
</Section>
</Modal.Content>
</Modal>
}, this)
Errm .. У меня уже есть массив объектов, который хранится в файле JSON, а затем я перебираю его для рендеринга (см. Способ отображения), я хочу отобразить текущий идентификатор из цикла, Фактический результат показывает все идентификаторы
Как вы определяете, какой из них вы хотите отобразить?
Пожалуйста, посмотрите мой метод open(), я также добавил демонстрацию видео
Вы просматриваете карту this.state.items для каждого элемента и возвращаете их все в DOM? Тогда, если вы нажмете одну из кнопок, отобразится связанный модальный? В этом случае у вас может быть структурная проблема.
Хорошо, структурная проблема, предложите другой способ сделать это
@YashKaranke Лучший вариант - вызвать метод из рендеринга, который создает элементы DOM, упаковывает их в аккуратный массив и на основе onClick () каждого элемента может установить состояние, которое будет заполнять модальное окно.
Ваше решение отлично работает: D, оно было почти прямо у меня на глазах. Пришлось выкурить 3 сигареты, чтобы понять это
Правильно ли я говорю, что ваша цель - перебрать this.state.items и вернуть каждый элемент в DOM?