Компоненты рендеринга ReactJS на основе выбора пользователя

Так что мне почти неделя, чтобы отреагировать, и я не писал кода javascript годами. Так что, пожалуйста, простите мое невежество, если оно есть.

Вопрос Я создал три разных класса компонентов

 const CreatedDate = React.createClass({
  displayName: 'CreatedDate',
  propTypes: {
    name: 'CreateDate',
    from: React.PropTypes.string,
    to: React.PropTypes.string,
    format: React.PropTypes.string,
    onChange: React.PropTypes.func
  },

// остальной код и функции

Точно так же у меня есть класс, похожий на этот, с именем ClientSignedDate и VerificationDate, все из которых содержат в основном одинаковые входные реквизиты, но получают данные из разных столбцов одной и той же таблицы.

В отдельном родительском классе под названием Filter Я создал массив этих компонентов внутри этого класса

const dateOptions = [CreatedDate, ClientSignedDate, VerificationDate];

Раньше он работал, когда был только один компонент

          <CreatedDate
            from = {this.props.filter.createdDateFrom}
            to = {this.props.filter.createdDateTo}
            onChange = {this.handleCreatedDateChange}
          />

И я в основном хочу визуализировать компонент на основе выбора пользователя, но я не могу понять, как это сделать. Что-то похожее на приведенный ниже фрагмент, но позволяющее рендеринг.

 <select>{dateOptions.map(x => <option>{x}</option>)}</select>

Вы по существу спрашиваете, как визуализировать динамические компоненты вместо использования только статического JSX? Вот как я понимаю ваш вопрос.

Chris G 23.05.2018 22:48

Я хочу визуализировать разные компоненты, которые используют одни и те же свойства, в зависимости от того, что выбрал пользователь.

shashwatZing 24.05.2018 14: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) для оценки ваших знаний,...
2
2
2 933
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Компоненты, определяемые пользователем, должны начинаться с заглавных букв, чтобы их можно было отображать.

Просто попробуйте:

<select>{dateOptions.map(Option => <option><Option /></option>)}</select>

Также не забудьте установить свойство key для элемента option.

Кто-то проголосовал за все ответы без каких-либо отзывов. Спасибо за ваш вклад. У меня не было возможности взглянуть на это.

shashwatZing 24.05.2018 14:19

@shashwatZing Не беспокойтесь.

hsz 24.05.2018 14:23
Ответ принят как подходящий

And I basically want to render the component based on user selection

Самый простой способ

{ this.state.selection === 1 && <CreatedDate ... /> }
{ this.state.selection === 2 && <ClientSignedDate ... /> }

И так далее.

Обновлено: на основе дополнительной информации другой вариант:

const dateOptions = [CreatedDate, ClientSignedDate, VerificationDate];
const Comp = dateOptions[this.state.selection];  // pick element

тогда используйте

<Comp 
    from = {this.props.filter.createdDateFrom}
    to = {this.props.filter.createdDateTo}
    onChange = {this.handleCreatedDateChange}
/>

Кто-то проголосовал за все ответы без каких-либо отзывов. Спасибо за ваш вклад. У меня не было возможности взглянуть на это.

shashwatZing 24.05.2018 14:19

Спасибо чувак. Мне удалось просмотреть ваш код. Это действительно здорово.

shashwatZing 24.05.2018 15:27

На самом деле я проголосовал против двух других, потому что они не поняли, о чем вы спрашивали, и поэтому дали бесполезные ответы. Моя, очевидно, была отвергнута кем-то, кто тоже этого не понимал. Поскольку вы рассказали hsz о том, что его решение работает отлично, мне остается только гадать, зачем вы помещаете Компонент с функциями, свойствами и прочим внутри элемента <option>. Я интерпретировал ваш примерный код как пример динамического рендеринга в целом и предположил, что это вообще не касается содержимого <option>. Я все-таки ошибаюсь?

Chris G 24.05.2018 15:47

Компоненты React должны быть в верхнем регистре. Оттуда вы можете использовать переменный компонент.

Недавно я сослался на этот вопрос, который мне помог. Это не совсем то, о чем вы спрашиваете, но это связано с той же проблемой. Этот вопрос тоже.

<select>{dateOptions.map((Option, index) => <option key = {`unique_${index}`}><Option /></option>)}</select>

Убедитесь, что ваш key уникален, когда вы используете Array.map. Если вы добавляете / удаляете компоненты Option динамически, вы можете столкнуться с проблемами, используя простой индекс массива в определенных ситуациях. Подробнее об этом здесь.

Кто-то проголосовал за все ответы без каких-либо отзывов. Спасибо за ваш вклад. У меня не было возможности взглянуть на это.

shashwatZing 24.05.2018 14:19

Ха-ха, не беспокойтесь. Если вы в конечном итоге воспользуетесь этим, дайте мне знать, если у вас возникнут какие-либо проблемы.

domdambrogia 24.05.2018 22:40

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