#reactjs #react-bootstrap
#reactjs #реакция-начальная загрузка
Вопрос:
Итак, у меня эта странная проблема (и я все еще новичок в этом), но у меня есть выпадающий список, из которого я хочу иметь возможность выбирать и передавать обратно в форму для отправки. это отлично работает, когда я делаю выпадающие строки вручную, но когда я извлекаю их из серверной части, а затем сопоставляю и пытаюсь обработать onSelect, но событие onSelect продолжает возвращать null — так запутано — вы видите что-нибудь очевидное в этом коде?
import React, { useEffect, useState } from 'react';
import { useHttpClient } from '../hooks/http-hook';
import { validate } from '../util/validators';
import 'bootstrap/dist/css/bootstrap.min.css';
import DropdownButton from 'react-bootstrap/DropdownButton';
import Dropdown from 'react-bootstrap/Dropdown';
import './Input.css';
const Select = props => {
console.log('props.id=' props.id);
console.log('props.label=' props.label);
const [selValue, setSelValue] = useState('');
const { isLoading, error, sendRequest, clearError } = useHttpClient();
const [loadedFoodgroups, setLoadedFoodgroups] = useState([]);
useEffect(() => {
const fetchFoodgroups = async () => {
try {
const responseData = await sendRequest('http://localhost:5000/api/foodgroups')
setLoadedFoodgroups(responseData);
console.log('ResponseData' JSON.stringify(responseData));
} catch (err) { }
};
fetchFoodgroups();
}, [sendRequest]);
const handleSelect = (event) => {
event.preventDefault();
console.log('Select.js: handleSelect- event e=' event.target.value);
setSelValue(event.target.value);
}
return (
<React.Fragment>
<DropdownButton
className="form-control__select"
alignRight
title="Foodgroups"
id="dropdown-menu-align-right"
onSelect={handleSelect}
value={selValue}
>
<label htmlFor={props.id}>{props.label}</label>
{loadedFoodgroups.map(selectOptions => (
<Dropdown.Item
key={selectOptions.id}
className="form-control__select"
eventkey={selectOptions.id}>{selectOptions.name}
</Dropdown.Item>
))}
</DropdownButton>
</React.Fragment>
);
};
export default Select;
Комментарии:
1. Подробная информация. было бы полезно. «но событие при onSelect продолжает возвращать нуль» — вы имеете в виду, что
event.target.value
равно нулю. Что еще более важно, можете ли вы опубликовать результат изconsole.log('ResponseData' JSON.stringify(responseData))
?2. да, event.target.value равно нулю — console.log(…) включен сюда: ResponseData[{«foods»:[«5f0baddcb194e0a15ecadb4d»],»_id»:»5f0b8f43481b9a573f53ac4c»,»name»:»fruits»,»__v»:5},{«foods»:[],»_id»:»5f0bad545a16e69eccaf9e1a»,»name»:»grains»,»__v»:0},{«foods»:[«5f0c9939000b7e768103d1a3″,»5f0c9981000b7e768103d1a5″],»_id»:»5f0c980a000b7e768103d1a1″,»name»:»dairy»,»__v»:2} ] Любая помощь приветствуется!
Ответ №1:
Хотя на основную проблему дан ответ в некоторых других вопросах (вроде), у вас есть несколько вещей, которые вам нужно изменить, поэтому вот более конкретный ответ для вас:
Во-первых, сигнатура onSelect
есть (eventKey, event) => ...
, но в моем тестировании второй параметр бесполезен (цель равна null). Поэтому, даже если вы переключитесь на использование второго параметра в своем обработчике, это, вероятно, не сработает. Вместо этого большинство людей, похоже, используют eventKey
параметр следующим образом:
const handleSelect = eventKey => {
event.preventDefault();
setSelValue(eventKey);
}
Что, вероятно, соответствовало бы вашим потребностям.
Прежде чем это сработает для вас, необходимо исправить три опечатки:
<Dropdown.Item
key={selectOptions._id}. <--you have ".id" i your code but the data is "._id"
className="form-control__select"
eventKey={selectOptions.name} <--you have "eventkey", with lowercase "k",
// should be upper case.
// You probably want the ".name" property here rather than
// "id", this is what will be passed into "onSelect"
>
Итак, если вы измените свой обработчик на использование первого параметра как eventKey
и исправите опечатки выше, вы сможете установить состояние на значение, выбранное из выпадающего списка. кнопка.
Комментарии:
1. Спасибо, Генри — ценю помощь! это сработало как шарм!
2. Я рад, что помогло Ashish! Вы не возражаете принять мой ответ, поскольку он вам помог? Спасибо!