Вопрос или проблема
Я работаю над проектом на 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 для управления состоянием и событиями.