在使用 React 的 Autocomplete 组件时,一个常见的需求是展示包含多个字段的数据,并在用户选择后获取完整的对象信息,例如,一个包含 ID、名称和描述的对象数组。直接将这些对象转换为字符串显示在下拉框中,再通过字符串解析来获取 ID 往往不够优雅。本文将介绍如何利用 Autocomplete 组件的 getOptionLabel 属性,更清晰、高效地处理此类问题。
使用 getOptionLabel 自定义显示
Autocomplete 组件提供了一个 getOptionLabel 属性,允许我们自定义下拉选项的显示方式。这个属性接收一个函数,该函数接收一个选项对象作为参数,并返回一个字符串,该字符串将作为该选项的显示文本。
以下是一个示例,展示了如何使用 getOptionLabel 来显示名称和描述:
import React, { useState } from 'react';import Autocomplete from '@mui/material/Autocomplete';import TextField from '@mui/material/TextField';const initialState = [ { "id": 1, "name": "raw1", "description": "description 1" }, { "id": 2, "name": "raw2", "description": "description 2" }, { "id": 3, "name": "raw3", "description": "description 3" }];function Form() { const [allRaws, setAllRaws] = useState(initialState); const [rawID, setRawsID] = useState(null); const handleSelectRaws = (event, value) => { if (value != null) { setRawsID(value.id); } }; return ( <AutocompleteForm array={allRaws} label="Pick set of raws" {handleSelectRaws} /> );}export default Form;function AutocompleteForm(props) { const { label, array, onChange } = props; return ( <Autocomplete disablePortal options={array} sx={{ width: 300 }} renderInput={(params) => <TextField {...params} label={label} />} {onChange} getOptionLabel={(option) => `${option.name}: ${option.description}`} /> );}
在这个例子中,AutocompleteForm 组件接收一个 array 属性,该属性包含对象数组。getOptionLabel 函数被设置为 (option) =>${option.name}: ${option.description}``,这意味着每个选项将显示其名称和描述的组合。
在 onChange 事件中访问完整数据
Autocomplete 组件的 onChange 事件处理函数接收两个参数:event 和 value。value 参数包含用户选择的完整对象,而不仅仅是显示在下拉框中的字符串。
在上面的例子中,handleSelectRaws 函数接收 value 参数,并直接访问 value.id 来获取所选对象的 ID。这避免了从字符串中提取 ID 的需要,使代码更简洁、更易读。
总结
通过使用 Autocomplete 组件的 getOptionLabel 属性,我们可以自定义下拉选项的显示方式,使其更易于理解和选择。同时,在 onChange 事件中直接访问完整对象数据,避免了字符串解析的麻烦,提高了代码的可维护性。这种方法尤其适用于处理包含多个字段的复杂数据,可以使 React 应用的用户界面更加友好和高效。
注意事项:
- 确保传递给 options 属性的数据类型与 getOptionLabel 函数期望的类型一致。
 - 如果需要更复杂的自定义显示,可以在 getOptionLabel 函数中使用更复杂的逻辑。
 - 根据实际需求,选择合适的字段组合来显示在下拉框中,以便用户能够快速找到所需的选项。