如何在 Material UI 中對自動完成選項進行分組?


在本文中,我們將探討如何使用 Material UI(一個流行的用於為 React 應用程式建立使用者介面的庫)對自動完成選項進行分組。Material UI 的一個關鍵元件是 Autocomplete 元件,它透過在使用者鍵入時提供建議來促進更快的輸入。雖然預設情況下使用自動完成提供了無縫的使用者體驗,但在某些情況下,對自動完成選項進行分組可以改善建議的呈現和組織。

在瞭解如何對選項進行分組之前,讓我們快速回顧一下 Material UI 的 Autocomplete 元件的基本結構。Autocomplete 元件使用各種選項來建議單詞,使用者在輸入欄位中鍵入時。每個選項通常由一個包含兩個屬性的物件組成:label(將在建議列表中顯示的文字)和 value(選項的實際值)。onChange 事件允許使用者在選擇選項時訪問該選項的值。

在 Material UI 中對選項進行分組

我們可以使用 groupBy 屬性在 Material UI 的 Autocomplete 元件中對選項進行分組。此屬性接受一個回撥函式,該函式確定應如何對選項進行分組。回撥函式在接收選項作為引數後應返回該選項所屬的組標籤。

使用的屬性

  • options - 此屬性為 Autocomplete 元件提供了一個要顯示的選項陣列。每個選項都具有一個 label 屬性,指定該選項的文字表示形式。

  • groupBy - 與此屬性關聯的函式定義了選項的分組標準。透過處理選擇,該函式會為該特定選擇生成組標籤。因此,選項根據此函式返回的值進行分類。

  • RenderGroup - 此屬性增強了組標題的自定義功能。透過接收一個包含 key、group 和 child 屬性的物件,該函式返回一個表示組標題的 React 元素。

語法

<Autocomplete
   id="grouped-demo"
   options={options.sort((a, b) => -b.firstLetter.localeCompare(a.firstLetter))}
   groupBy={(option) => option.firstLetter}
   getOptionLabel={(option) => option.title}
   sx={{ width: 300 }}
   renderInput={(params) => <TextField {...params} label="With categories" />}
/>

示例

在此示例中,我們提供了一個 Autocomplete 元件,允許使用者從預定義列表中瀏覽和選擇程式語言。選項根據每種語言的第一個字母進行分組,從而增強了選擇的可訪問性和視覺一致性。options 陣列是透過遍歷 data 陣列並提取每種語言的第一個字母和標籤來形成的。Autocomplete 元件中的 groupBy 屬性透過其第一個字母對選項進行分組。

renderInput 屬性自定義輸入欄位的外觀,提供一個帶有“程式設計”標籤的 TextField。當用戶鍵入時,Autocomplete 會過濾選項並顯示匹配的選項,並按其第一個字母整齊排列。直觀的輸入欄位使使用者能夠輕鬆選擇一種語言,從而在面對一系列可能性時增強了整體使用者體驗。

import React, { useState } from 'react';
import Autocomplete from '@mui/material/Autocomplete';
import TextField from '@mui/material/TextField';

export default function App() {

   const options = data.map((option) => {
      const firstLetter = option.label[0].toUpperCase();
      return {
         firstLetter: /[0-9]/.test(firstLetter) ? '0-9' : firstLetter,
         ...option,
      };
   });

   return (
      <div
         style={{
            display: "flex",
            marginTop: 40,
            flexDirection: 'column',
            alignItems: "center",
            justifyContent: "center",
         }}>
         <Autocomplete
            id="grouped-demo"
            options={options.sort((a, b) => -b.firstLetter.localeCompare(a.firstLetter))}
            groupBy={(option) => option.firstLetter}
            getOptionLabel={(option) => option.label}
            sx={{ width: 300 }}
            renderInput={(params) => <TextField {...params} label="Programming" />}
         />
      </div>
   );
}

const data = [
   { label: "Java language" },
   { label: "Python language" },
   { label: "C++ language" },
   { label: "C language" },
   { label: "Go language" },
   { label: "JavaScript language" },
   { label: "SQL" },
   { label: "MySQL" },
   { label: "HTML" },
   { label: "CSS" },
   { label: "Nextjs " },
   { label: "ReactJS " },
   { label: "VueJS " },
   { label: "Angular " },
   { label: "Angular JS " },
   { label: "PHP language" },
   { label: "R language" },
   { label: "Objective C language" },
   { label: "Cobol language" },
   { label: "Perl language" },
   { label: "Pascal language" },
   { label: "LISP language" },
   { label: "Fortran language" },
   { label: "Swift language" },
   { label: "Ruby language" },
   { label: "Algol language" },
   { label: "Scala language" },
   { label: "Rust language" },
   { label: "TypeScript language" },
   { label: "Dart language" },
   { label: "Matlab language" },
   { label: "Ada language" },
   { label: ".NET language" },
   { label: "Bash language" },
];

輸出

自定義分組的自動完成

透過 Material UI 的多功能特性,可以進一步個性化分組的 Autocomplete。透過使用 renderTags 屬性,可以修改組標籤的視覺表示,甚至可以為資料項的多選新增額外的晶片元件。

語法

<Autocomplete
   id="grouped-demo"
   options={options.sort((a, b) => -b.firstLetter.localeCompare(a.firstLetter))}
   groupBy={(option) => option.firstLetter}
   getOptionLabel={(option) => option.title}
   sx={{ width: 300 }}
   renderInput={(params) => <TextField {...params} label="With categories" />}
   renderTags={(params) => (
      …
   )}
/>

為了更好地控制組的渲染方式,可以使用自定義的 renderGroup 屬性。此屬性實現為一個函式,它接受一個包含兩個欄位的物件:

  • group - 表示組名稱的字串。

  • children - 屬於該組的列表項集合。

示例

import React from 'react';
import Autocomplete from '@mui/material/Autocomplete';
import TextField from '@mui/material/TextField';
import { Chip } from '@mui/material';

export default function App() {
   const data = [
      { label: "Java language" },
      { label: "Python language" },
      { label: "C++ language" },
      { label: "C language" },
      { label: "Go language" },
      { label: "JavaScript language" },
      { label: "SQL" },
      { label: "MySQL" },
      { label: "HTML" },
      { label: "CSS" },
      { label: "Nextjs " },
      { label: "ReactJS " },
      { label: "VueJS " },
      { label: "Angular " },
      { label: "Angular JS " },
      { label: "PHP language" },
      { label: "R language" },
      { label: "Objective C language" },
      { label: "Cobol language" },
      { label: "Perl language" },
      { label: "Pascal language" },
      { label: "LISP language" },
      { label: "Fortran language" },
      { label: "Swift language" },
      { label: "Ruby language" },
      { label: "Algol language" },
      { label: "Scala language" },
      { label: "Rust language" },
      { label: "TypeScript language" },
      { label: "Dart language" },
      { label: "Matlab language" },
      { label: "Ada language" },
      { label: ".NET language" },
      { label: "Bash language" },
   ];

   const options = data.map((option) => {
      const firstLetter = option.label[0].toUpperCase();
      return {
         firstLetter: /[0-9]/.test(firstLetter) ? '0-9' : firstLetter,
         ...option,
      };
   });

   return (
      <div
         style={{
            display: "flex",
            marginTop: 40,
            flexDirection: 'column',
            alignItems: "center",
            justifyContent: "center",
         }}>
         <Autocomplete
            multiple // Allow multiple selections
            id="grouped-demo"
            options={options.sort((a, b) => -b.firstLetter.localeCompare(a.firstLetter))}
            groupBy={(option) => option.firstLetter}
            getOptionLabel={(option) => option.label}
            sx={{ width: 300 }}
            renderInput={(params) => <TextField {...params} label="Programming" />}
            renderTags={(value, getTagProps) =>
               value.map((options, index) => (
                  <Chip
                     label={options.label}
                     {...getTagProps({ index })}
                  />
               ))
            }      
         />
      </div>
   );
}

輸出

使用新增的“multiple”屬性,使用者現在可以選擇多個選項(表示為晶片),從 Autocomplete 下拉選單中選擇。renderTags 屬性用於自定義所選選項的外觀,使用 Material-UI Chip 元件將它們呈現為視覺上吸引人的晶片。

此功能豐富的 Autocomplete 下拉選單使使用者能夠從大量程式語言中進行多項選擇,這些語言以輸入欄位上方的精美晶片的形式顯示。當需要從大量的選擇列表中選擇多個專案時,這尤其有用,從而顯著提升了使用者體驗。

結論

總而言之,在 Material UI 中將自動完成選項組織成邏輯類別可以顯著增強使用者體驗。這使得查詢和選擇所需的選項變得更容易,尤其是在面對大量選項時。透過使用 groupBy 屬性,您可以根據相關標準有效地對選項進行分組,這將為 React 應用程式帶來更具組織性和使用者友好的介面。此外,由於 Material UI 的靈活性和自定義選項,您可以修改分組的 Autocomplete 以適應應用程式的特定需求和設計。

更新於:2023年10月30日

1K+ 閱讀量

開啟您的 職業生涯

透過完成課程獲得認證

立即開始
廣告