
MUIのSelectコンポーネントとは
MUI (Material-UI) のSelectコンポーネントとは、Reactで使えるプルダウンメニューです。
Material Designに基づいたUIを提供し、アクセシビリティやカスタマイズ性にも優れています。
使い方は、@mui/material/Select から Select をインポートし、@mui/material/MenuItem から MenuItem をインポートして、HTMLの select と option タグのように使用するだけです。
TypeScriptを使用している場合は、@mui/material/Select からSelectChangeEventの型もインポートして使用します。
import { useState, useEffect } from 'react'
import Box from '@mui/material/Box'
import InputLabel from '@mui/material/InputLabel'
import MenuItem from '@mui/material/MenuItem'
import FormControl from '@mui/material/FormControl'
import Select, { SelectChangeEvent } from '@mui/material/Select'
type Products = {
id: number
title: string
value: string
}
function App() {
const [product, setProduct] = useState('')
const [data, setData] = useState<Products[]>([])
useEffect(() => {
fetch('https://dummyjson.com/products')
.then((response) => response.json())
.then((json) => {
const transformedData = json.products
.map((product: Products) => ({
id: product.id,
title: product.title,
value: String(product.id),
}))
setData(transformedData)
})
.catch((error) => console.error('Error', error))
}, [])
const handleChange = (event: SelectChangeEvent) => {
setProduct(event.target.value as string)
}
return (
<Box sx={{ maxWidth: 300 }}>
<FormControl fullWidth>
<InputLabel id="product-label">商品</InputLabel>
<Select
labelId="product-label"
id="product"
value={product}
label="Product"
onChange={handleChange}
>
{data.map((item) => (
<MenuItem key={item.id} value={item.value}>
{item.title}
</MenuItem>
))}
</Select>
<hr />
<Box>選択した商品のvalue値: {product}</Box>
</FormControl>
</Box>
)
}
export default App
MUIのAutocompleteコンポーネントとは
Autocompleteコンポーネントは、入力候補をサジェストするインターフェースを提供するコンポーネントです。
ユーザーがテキストを入力すると、それに応じた候補をリストアップし、そこから選択できるようにします。
HTMLで言うところの datalist に相当します。
<label for="country-select">Country: </label>
<input list="country" id="country-select" name="country-select" />
<datalist id="country">
<option value="America">America</option>
<option value="Australia">Australia</option>
<option value="Canada">Canada</option>
<option value="China">China</option>
<option value="India">India</option>
<option value="Japan">Japan</option>
<option value="Russia">Russia</option>
</datalist>
AutoCompleteコンポーネントを使用するには、データが配列だけであれば、AutocompleteとTextFieldをインポートして以下のようにします。
import { useState, useEffect } from 'react'
import Box from '@mui/material/Box'
import FormControl from '@mui/material/FormControl'
import Autocomplete from '@mui/material/Autocomplete'
import TextField from '@mui/material/TextField'
type Product = {
id: number
title: string
value: string
}
function App() {
const [product, setProduct] = useState('')
const [data, setData] = useState<Product[]>([])
useEffect(() => {
fetch('https://dummyjson.com/products')
.then((response) => response.json())
.then((json) => {
const transformedData: Product[] = json.products
.map((product: Product) => ({
id: product.id,
title: product.title,
value: String(product.id)
}))
setData(transformedData)
})
.catch((error) => console.error('Error:', error))
}, [])
const handleChange = (_: React.SyntheticEvent, data: Product | null) => {
setProduct(data ? data.value : '')
}
return (
<Box sx={{ maxWidth: 300 }}>
<FormControl fullWidth>
<Autocomplete
id="product-autocomplete"
options={data}
getOptionLabel={(option) => option.title}
renderInput={(params) => (
<TextField {...params} label="商品" />
)}
noOptionsText="該当の商品はありません"
onChange={handleChange}
/>
</FormControl>
<hr />
<Box>選択した商品のvalue値: {product}</Box>
</Box>
)
}
export default App
まとめ
MUIのSelectコンポーネントは、HTMLのselect要素に相当するプルダウンメニューをReactで簡単に実装できるUI部品です。アクセシビリティやカスタマイズ性にも優れています。
一方、Autocompleteコンポーネントは、ユーザーの入力に応じて候補を表示する機能を持ち、HTMLのdatalist要素に似た役割を果たします。
どちらのコンポーネントも、Material Designに準拠したインターフェースを提供し、Reactアプリのユーザー体験を向上させるために有用です。
MUIに限らずデータ量が多い場合はセレクトボックスのUIではなく、datalist要素のようなUIを採用することをオススメします。
ReactのUIコンポーネントライブラリには、ほぼすべてにセレクトボックスおよびdatalist要素のようなUIが存在します。
例えば、shadcn/uiであればSelectとComboboxが存在します。