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

Вопрос или проблема

Я работаю над проектом на React, где у меня есть два компонента: UserRules (Компонент A) и UserEmail (Компонент B). Мне нужно передать значение переменной состояния selectedVoucherOption из Компонента A в Компонент B, чтобы отобразить конкретные данные в Компоненте B в зависимости от выбранного варианта.

Вот что я делаю:

В UserRules (Компонент A) я добавил Строку A, потому что я хочу передать значение selectedVoucherOption в Компонент B (UserEmail), чтобы условно отобразить данные в зависимости от выбора пользователя.

Компонент A:

function UserRules({ intl, home, dispatch }) {
  const [selectedVoucherOption, setSelectedVoucherOption] = useState(null);

  return (
    <Row>
      <Col xs={12}>
        <Label required>{intl.formatMessage({ ...messages.voucherOptions.header })}</Label>
        <Dropdown
          options={voucherOptions}
          placeholder={intl.formatMessage({ ...messages.voucherOptions.placeholder })}
          onChange={(_evt, obj) => {
            setSelectedVoucherOption(obj);
            UserEmail; // Строка A: Пытаюсь передать значение здесь
          }}
        />
      </Col>
    </Row>
  );
}

Компонент B:

function UserEmail({ intl, onValueChange }) {
  // Логика на основе selectedVoucherOption
  ...
}

Email.propTypes = {
  intl: intlShape.isRequired,
  onValueChange: PropTypes.func.isRequired,
};

Проблема, с которой я сталкиваюсь, заключается в том, как передать состояние selectedVoucherOption из Компонента A в Компонент B (в Строке A) таким образом, чтобы Компонент B мог условно отображать данные на основе этого значения.

Как лучше всего это сделать в React?

Отрисовка компонента происходит в JSX, а не в функции. (Хотя функцию определенно можно использовать для создания JSX, эта функция должна создавать JSX, а не просто ссылаться на функцию компонента, как вы пытаетесь сделать.)

Например:

<Dropdown
  options={voucherOptions}
  placeholder={intl.formatMessage({ ...messages.voucherOptions.placeholder })}
  onChange={(_evt, obj) => {
    setSelectedOption(obj);
  }}
/>
<UserEmail />

Обратите внимание на <UserEmail /> как на отдельный элемент в разметке. Вы можете условно включить его, обернув его в условное выражение. Например:

<Dropdown
  options={voucherOptions}
  placeholder={intl.formatMessage({ ...messages.voucherOptions.placeholder })}
  onChange={(_evt, obj) => {
    setSelectedOption(obj);
  }}
/>
{ someCondition ? <UserEmail /> : null }

Обратите внимание, что выражение JavaScript обернуто в {}, чтобы указать, что это выражение, а не JSX разметка. Какое бы условие вы ни использовали как someCondition, оно определит, будет ли выражение оцениваться как <UserEmail /> или null.

Если вы хотите передать пропс, вы сделаете это точно так же, как пропсы, которые вы уже передаете другим компонентам:

<Dropdown
  options={voucherOptions}
  placeholder={intl.formatMessage({ ...messages.voucherOptions.placeholder })}
  onChange={(_evt, obj) => {
    setSelectedOption(obj);
  }}
/>
{ someCondition ? <UserEmail someProp={selectedVoucherOption} /> : null }

А в компоненте вы будете читать этот пропс:

function UserEmail({ intl, onValueChange, someProp }) {
  // Логика на основе someProp
}

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

Я рекомендую вам прочитать документацию React. Так компоненты не используются.

То, что вы хотите, вероятно, выглядит как-то так:

function UserRules({ intl, home, dispatch }) {
  const [selectedVoucherOption, setSelectedVoucherOption] = useState(null);

  return (
    <>
      <Row>
        <Col xs={12}>
          <Label required>{intl.formatMessage({ ...messages.voucherOptions.header })}</Label>
          <Dropdown
            options={voucherOptions}
            placeholder={intl.formatMessage({ ...messages.voucherOptions.placeholder })}
            onChange={(_evt, obj) => {
              setSelectedOption(obj);
            }}
          />
        </Col>
      </Row>
      <UserEmail selectedVoucherOption={selectedVoucherOption} />
    </>
  )

  function UserEmail({ selectedVoucherOption }) {
    return (<span>{selectedVoucherOption}</span>)
  }

Ответ или решение

Для решения проблемы передачи значения состояния selectedVoucherOption из компонента UserRules (Компонент A) в компонент UserEmail (Компонент B) в React, следует правильно использовать JSX для рендеринга компонентов и передачи данных через props. Вот пошаговое руководство по этому процессу:

Шаг 1: Настройка состояния в компоненте UserRules

В компоненте UserRules создайте состояние selectedVoucherOption и функцию для его обновления с помощью хука useState. Это значение будет обновляться при изменении выбора в выпадающем меню.

import React, { useState } from 'react';
import { Dropdown } from 'your-dropdown-library'; // Импортируйте ваш компонент dropdown
import { Row, Col, Label } from 'your-layout-library'; // Импортируйте компоненты разметки

function UserRules({ intl, home, dispatch }) {
    const [selectedVoucherOption, setSelectedVoucherOption] = useState(null);

    const handleDropdownChange = (_evt, obj) => {
        setSelectedVoucherOption(obj);
    };

    return (
        <>
            <Row>
                <Col xs={12}>
                    <Label required>
                        {intl.formatMessage({ ...messages.voucherOptions.header })}
                    </Label>
                    <Dropdown
                        options={voucherOptions}
                        placeholder={intl.formatMessage({ ...messages.voucherOptions.placeholder })}
                        onChange={handleDropdownChange}
                    />
                </Col>
            </Row>
            {/* Передаем значение состояния в UserEmail через props */}
            <UserEmail selectedVoucherOption={selectedVoucherOption} />
        </>
    );
}

Шаг 2: Обработка полученного значения в компоненте UserEmail

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

import PropTypes from 'prop-types';

function UserEmail({ selectedVoucherOption }) {
    return (
        <div>
            {selectedVoucherOption ? (
                <span>Вы выбрали: {selectedVoucherOption.label}</span> // Предполагаем, что у объекта есть поле label
            ) : (
                <span>Пожалуйста, выберите вариант.</span>
            )}
        </div>
    );
}

UserEmail.propTypes = {
    selectedVoucherOption: PropTypes.object, // Определите тип prop в зависимости от структуры вашего объекта
};

Резюме

  • В компоненте UserRules мы создаем состояние и хэндлер для обработки изменений в выпадающем меню.
  • Когда происходит изменение выбора, состояние обновляется с помощью setSelectedVoucherOption.
  • Мы затем передаем это состояние в UserEmail через props.
  • В компоненте UserEmail производится условная отрисовка в зависимости от значения selectedVoucherOption.

Таким образом, вы сможете динамически рендерить данные в компоненте UserEmail, основываясь на выборе пользователя в компоненте UserRules. Этот подход позволяет сохранять ясность и читаемость вашего кода, следуя принципам React для управления состоянием и событиями.

Оцените материал
Добавить комментарий

Капча загружается...