React Select установил неправильное значение

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

const SelectField = (props) => {
  const { id } = props;
  return (
    <Select
      id = {id}
      value = {this.state[id]}
      onChange = {(value) => { this.onChangeValue({ target: { id, value } }); }}
      options = {options[id]}
      placeholder = "Please select..."
    />
  );
};

А я так использую:

<SelectField id = "gender" />

Метод onChangeValue обрабатывает setState всех входов:

onChangeValue(e) {
  const { id, value } = e.target;
  this.setState({ [id]: value });
}

Поскольку react-select по какой-то странной причине не возвращает event, я просто эмулировал его, передавая нужные мне данные.

Кажется, что эта версия кода работает так, как ожидалось, если я выберу что-то, я смогу правильно увидеть правильное значение во входных данных. К сожалению, в состоянии, когда это значение неверно, это должен быть string, но это полный вариант: { label: 'Gender', value: 'Male'}.

Итак, здесь я уже не понимаю, как react-select может отображать Male, если результатом значения является этот объект.

Если я заменю onChange следующим образом:

onChange = {(value) => { this.onChangeValue({ target: { id, value: value.value } }); }}

Для меня это будет иметь больше смысла, поскольку я напрямую передаю правильное значение значению, которое нужно установить в состоянии.

Вдруг это вообще не работает. Если я выберу опцию, на входе все равно будет отображаться заполнитель, но, да, состояние правильное.

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

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

Что я здесь делаю не так? Идеи? Ваше здоровье

Кажется, вы объявляете SelectField как компонент без состояния, а затем вызываете .setState там, это не сработает.

Nicolas Brugneaux 15.10.2018 13:36

Можете ли вы привести пример, спасибо!

Ayeye Brazo 15.10.2018 13:54

Когда вы объявляете компонент реакции как функцию (здесь: const SelectField = (props) => ...), вы объявляете его как без гражданства, это означает, что у вас нет this.state, на самом деле, поскольку это функция стрелки, у вас даже нет this. Я хотел бы отослать вас к документации по реакции, чтобы узнать об этом. Другой способ объявить компонент - это класс class SelectField extends React.Component { ..., и там у вас есть доступ к this.setState.

Nicolas Brugneaux 15.10.2018 13:58
Поведение ключевого слова "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
3
1 310
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

К сожалению, response-select хочет, чтобы весь объект был выбранным значением. По сути, у вас есть 2 варианта:

  1. Сохраните весь объект в том состоянии, в котором вы сейчас находитесь. Вы можете просто вернуть значение любому другому заинтересованному лицу.
  2. Сохраняйте только значение в состоянии. Когда вы передаете значение в response-select, вам нужно будет найти свои варианты

    значение = {параметры [id] .find (opt => opt.value === this.state [id] .value)}

Кроме того, нет причин хранить его в состоянии [id]. Вы можете просто сохранить его как state.value или selectedValue, поскольку это единственное, что будет в состоянии для этого компонента.

Не могли бы вы дополнить свой ответ примером, чтобы я мог лучше понять? Спасибо за вашу помощь

Ayeye Brazo 15.10.2018 13:53

Честно говоря, я бы просто продолжил хранить всю опцию, как вы сейчас делаете. Есть ли причина, по которой вы не хотите хранить все это целиком?

Keith Rousseau 15.10.2018 14:19

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

Ayeye Brazo 15.10.2018 14:23

В вашей оболочке в любой момент находится в состоянии только одна вещь. Вашему вызывающему абоненту также необходимо будет передать обработчик onChange. Вы можете просто вызвать это значение из этого объекта и сохранить весь объект в состоянии внутри. например this.props.onChange (this.state [id] .value)

Keith Rousseau 15.10.2018 14:29
Ответ принят как подходящий

Вот более подробный ответ из моего предыдущего комментария:

class SelectField extends React.Component {

    state = {
        id: this.props.id
    };

    onChangeValue = id => value {
        this.setState({ [id]: value });
    }

    render() {
        const { id } = this.state;
        return (
            <Select
                id = {id}
                value = {this.state[id]}
                onChange = {this.onChangeValue(id)}
                options = {options[id]} // unsure where options came from.
                placeholder = "Please select..."
            />
        );
    }
}

хорошо, для меня это имеет смысл ... Но тогда я не знаю, как получить значения в основном компоненте ... поскольку значения состояния хранятся в отдельном компоненте ... Я почти уверен, что я ' я что-то упускаю ...

Ayeye Brazo 16.10.2018 10:56

Удалось позволить ему работать с обратными вызовами, и он работает как шарм. Спасибо!

Ayeye Brazo 16.10.2018 12:19

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