Я схожу с ума от этого. Я использую реагировать-выбрать для своего приложения, и, поскольку у меня огромная форма, я создал небольшой компонент для обертывания таких выделений:
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 } }); }}
Для меня это будет иметь больше смысла, поскольку я напрямую передаю правильное значение значению, которое нужно установить в состоянии.
Вдруг это вообще не работает. Если я выберу опцию, на входе все равно будет отображаться заполнитель, но, да, состояние правильное.
Я попытался добавить несколько обходных решений, но ни один из них не работает должным образом.
Мне нужно отобразить выбранное значение для выбора, а также иметь состояние, для пола в моем примере, чтобы быть строкой со значением, а не всем объектом ...
Что я здесь делаю не так? Идеи? Ваше здоровье
Можете ли вы привести пример, спасибо!
Когда вы объявляете компонент реакции как функцию (здесь: const SelectField = (props) => ...), вы объявляете его как без гражданства, это означает, что у вас нет this.state, на самом деле, поскольку это функция стрелки, у вас даже нет this. Я хотел бы отослать вас к документации по реакции, чтобы узнать об этом. Другой способ объявить компонент - это класс class SelectField extends React.Component { ..., и там у вас есть доступ к this.setState.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


К сожалению, response-select хочет, чтобы весь объект был выбранным значением. По сути, у вас есть 2 варианта:
Сохраняйте только значение в состоянии. Когда вы передаете значение в response-select, вам нужно будет найти свои варианты
значение = {параметры [id] .find (opt => opt.value === this.state [id] .value)}
Кроме того, нет причин хранить его в состоянии [id]. Вы можете просто сохранить его как state.value или selectedValue, поскольку это единственное, что будет в состоянии для этого компонента.
Не могли бы вы дополнить свой ответ примером, чтобы я мог лучше понять? Спасибо за вашу помощь
Честно говоря, я бы просто продолжил хранить всю опцию, как вы сейчас делаете. Есть ли причина, по которой вы не хотите хранить все это целиком?
Когда я сохраняю его, я не могу передать все состояние, но я должен проверить все выбранные и получить значение ...
В вашей оболочке в любой момент находится в состоянии только одна вещь. Вашему вызывающему абоненту также необходимо будет передать обработчик onChange. Вы можете просто вызвать это значение из этого объекта и сохранить весь объект в состоянии внутри. например this.props.onChange (this.state [id] .value)
Вот более подробный ответ из моего предыдущего комментария:
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..."
/>
);
}
}
хорошо, для меня это имеет смысл ... Но тогда я не знаю, как получить значения в основном компоненте ... поскольку значения состояния хранятся в отдельном компоненте ... Я почти уверен, что я ' я что-то упускаю ...
Удалось позволить ему работать с обратными вызовами, и он работает как шарм. Спасибо!
Кажется, вы объявляете SelectField как компонент без состояния, а затем вызываете .setState там, это не сработает.