Рендеринг текущего / выбранного элемента из Array.map в модальный

Итак, прямо сейчас я получаю текущий идентификатор элемента или любое другое свойство (которое поступает из 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

Правильно ли я говорю, что ваша цель - перебрать this.state.items и вернуть каждый элемент в DOM?

J Dorrian 30.10.2018 22:59

React дает правильное предупреждение: вы не можете отобразить функцию (а функция # bind возвращает функцию, поэтому this.currentElement.bind возвращает функцию). Модальный элемент - это просто элемент (DOM): он либо отображается, либо не отображается для каждого рендера, и из кода видно, что отображение / скрытие работает. Следующий шаг, который я предлагаю, - это поместить this.state.items#data.id где-нибудь в состояние компонента (что происходит в методе open), а затем использовать его вместе с компонентом Modal в возвращаемом значении render.

rishat 30.10.2018 22:59

@JDorrian: да, но только текущий элемент

user10415043 30.10.2018 23:03

@ rm - Извините, но я не могу полностью понять this.state.items#data.id

user10415043 30.10.2018 23:05

Я добавил весь код для модального окна, если это поможет

user10415043 30.10.2018 23:06

видео не записывает консоль, поэтому вот скриншот консоли. imgur.com/a/C8bY6F3

user10415043 30.10.2018 23:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
1 021
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

user10415043 30.10.2018 23:12

Как вы определяете, какой из них вы хотите отобразить?

J Dorrian 30.10.2018 23:14

Пожалуйста, посмотрите мой метод open(), я также добавил демонстрацию видео

user10415043 30.10.2018 23:15

Вы просматриваете карту this.state.items для каждого элемента и возвращаете их все в DOM? Тогда, если вы нажмете одну из кнопок, отобразится связанный модальный? В этом случае у вас может быть структурная проблема.

J Dorrian 30.10.2018 23:17

Хорошо, структурная проблема, предложите другой способ сделать это

user10415043 30.10.2018 23:22

@YashKaranke Лучший вариант - вызвать метод из рендеринга, который создает элементы DOM, упаковывает их в аккуратный массив и на основе onClick () каждого элемента может установить состояние, которое будет заполнять модальное окно.

J Dorrian 30.10.2018 23:30

Ваше решение отлично работает: D, оно было почти прямо у меня на глазах. Пришлось выкурить 3 сигареты, чтобы понять это

user10415043 30.10.2018 23:33

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