Вы можете сделать что-то вроде этого .. Это обеспечивает гибкость, поэтому вы можете использовать этот компонент <select>
где угодно, используя любой объект с любым свойством .. (используя ответ @CarlosQuerioz, вам всегда придется использовать объект склавиша name
)
Значения параметров:
- data : массив, который вы хотите использовать в качестве параметров для выбора
- значение : ключ из вашего свойства данных, который вы хотите отобразить
- заполнитель : значение заполнителя (не выбирается)
- defaultOption : выбранная по умолчанию опция (подробнее об этом ниже)
- onSelectChange : событие, которое вызывается при изменении выбора
Как мы обрабатываем defaultOption
:
- Если вы передадите массив объектов в
defaultOption
, мы выберем первый объект в этом массиве и используем указанный ключ value
, чтобы определить значение, которое будет отображаться - Если вы передадите объект, мы покажем указанный
value
ключ
Чтобы продемонстрировать defaultOption
, раскомментируйте каждое из этих значений в примере ниже, вы поймете, что я имею в виду.
const users = [ // If this was your `data` object
{ name: "Karkar", key: 1 },
{ name: "Koko", key: 2 },
{ name: "Krikri", key: 3 },
{ name: "Kéké", key: 4 }
];
<MySelect
data={users}
value="name" // Must be a valid key that your objects have
onSelectChange={handle}
defaultOption={users[0].name}
//defaultOption={users[1]} // Would display 'Koko' by default
//defaultOption={users} // Would display 'Karkar' by default
/>
ПРИМЕР:
const { useState, useEffect } = React;
const { render } = ReactDOM;
function MySelect({ data, value, defaultOption = "", onSelectChange, placeholder = "Select an option" }) {
const [selected, setSelected] = useState(defaultOption);
const handleOnSelectChange = selection => {
onSelectChange && onSelectChange(selection);
}
const handleChange = event => {
let sel = data.find(d => d[value] === event.target.value);
setSelected(sel);
handleOnSelectChange(sel);
};
useEffect(() => {
if (typeof selected === "object") {
let val = selected.length > 0 ? selected[0] : selected;
setSelected(val);
handleOnSelectChange(val);
}
}, []);
return (
);
}
const users = [
{ name: "Karkar", key: 1 },
{ name: "Koko", key: 2 },
{ name: "Krikri", key: 3 },
{ name: "Kéké", key: 4 }
];
function App() {
const [user, setUser] = useState();
const handle = selectedUser => {
setUser(selectedUser);
};
return (
{user && {JSON.stringify(user, null, 2)}
} );} render (, document.body);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.9.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.9.0/umd/react-dom.production.min.js"></script>