Bài 13-Tự động hoàn thành
Tính năng tự động hoàn thành là chức năng nhập văn bản thông thường được cải tiến bằng bảng tùy chọn gợi ý.
ScaffoldHub . Tự động xây dựng ứng dụng web Material UI đầy đủ của bạn.quảng cáo của MUI
Tiện ích này hữu ích khi thiết lập giá trị của hộp văn bản một dòng trong một trong hai trường hợp sau:
- Giá trị cho hộp văn bản phải được chọn từ một tập hợp các giá trị được phép được xác định trước, ví dụ trường vị trí phải chứa tên vị trí hợp lệ: hộp kết hợp .
- Hộp văn bản có thể chứa bất kỳ giá trị tùy ý nào, nhưng sẽ có lợi hơn nếu gợi ý các giá trị có thể cho người dùng, ví dụ trường tìm kiếm có thể gợi ý các tìm kiếm tương tự hoặc trước đó để tiết kiệm thời gian cho người dùng: free solo .
Đây được coi là phiên bản cải tiến của các gói "react-select" và "downshift".
Hộp kết hợp
Giá trị phải được chọn từ một tập hợp các giá trị được phép được xác định trước.
Bộ phim
Bộ phim
Mở rộng mã
<Autocomplete
disablePortal
options={top100Films}
sx={{ width: 300 }}
renderInput={(params) => <TextField {...params} label="Movie" />}
/>
Nhấn Enterđể bắt đầu chỉnh sửa
Cấu trúc tùy chọn
Theo mặc định, thành phần này chấp nhận các cấu trúc tùy chọn sau:
interface AutocompleteOption {
label: string;
}
// or
type AutocompleteOption = string;
Sao chép
ví dụ:
const options = [
{ label: 'The Godfather', id: 1 },
{ label: 'Pulp Fiction', id: 2 },
];
// or
const options = ['The Godfather', 'Pulp Fiction'];
Sao chép
Tuy nhiên, bạn có thể sử dụng các cấu trúc khác nhau bằng cách cung cấp getOptionLabelđạo cụ.
Nếu tùy chọn của bạn là đối tượng, bạn phải cung cấp isOptionEqualToValueprop để đảm bảo lựa chọn và tô sáng chính xác. Theo mặc định, nó sử dụng tính bình đẳng nghiêm ngặt để so sánh các tùy chọn với giá trị hiện tại.
Sân chơi
Mỗi ví dụ sau đây minh họa một tính năng của thành phần Tự động hoàn thành.
vô hiệu hóaĐóngTrênChọn
xóaOnEscape
vô hiệu hóaCó thể xóa
bao gồmInputInList
phẳng
được kiểm soát
tự động hoàn thành
vô hiệu hóaListWrap
mởOnFocus
tự động làm nổi bật
tự động chọn
tàn tật
vô hiệu hóaPortal
blurOnSelect
xóaBị mờ
chọnOnFocus
Chỉ đọc
Hiển thị mã
Chọn quốc gia
Chọn một trong 248 quốc gia.
Chọn một quốc gia
Chọn một quốc gia
Hiển thị mã
Các trạng thái được kiểm soát
Thành phần này có hai trạng thái có thể được kiểm soát:
- trạng thái "giá trị" với tổ hợp props
value/onChange. Trạng thái này biểu thị giá trị do người dùng chọn, ví dụ khi nhấn Enter. - trạng thái "giá trị đầu vào" với tổ hợp props
inputValue/onInputChange. Trạng thái này biểu thị giá trị được hiển thị trong hộp văn bản.
Hai trạng thái này là riêng biệt và cần được kiểm soát độc lập.
- Một thành phần được kiểm soát khi nó được quản lý bởi thành phần cha bằng cách sử dụng props.
- Một thành phần không được kiểm soát khi nó được quản lý bởi trạng thái cục bộ của chính nó.
Tìm hiểu thêm về các thành phần được kiểm soát và không được kiểm soát trong tài liệu React .
giá trị: 'Tùy chọn 1'
inputValue: 'Tùy chọn 1'
Có thể kiểm soát được
Có thể kiểm soát được
Hiển thị mã
Nếu bạn kiểm soát value, hãy đảm bảo nó ổn định về mặt tham chiếu giữa các lần kết xuất. Nói cách khác, tham chiếu đến giá trị không nên thay đổi nếu giá trị đó không thay đổi.
// ⚠️ BAD
return <Autocomplete multiple value={allValues.filter((v) => v.selected)} />;
// 👍 GOOD
const selectedValues = React.useMemo(
() => allValues.filter((v) => v.selected),
[allValues],
);
return <Autocomplete multiple value={selectedValues} />;
Sao chép
Trong ví dụ đầu tiên, allValues.filterđược gọi và trả về một mảng mới mỗi lần render. Bản sửa lỗi bao gồm việc ghi nhớ giá trị, do đó nó chỉ thay đổi khi cần thiết.
Đơn tự do
Đặt freeSolothành true để hộp văn bản có thể chứa bất kỳ giá trị tùy ý nào.
Tìm kiếm đầu vào
Prop được thiết kế để bao gồm trường hợp sử dụng chính của đầu vào tìm kiếm với các gợi ý, ví dụ như tìm kiếm Google hoặc react-autowhatever.
miễn phíSolo
miễn phíSolo
Tìm kiếm đầu vào
Tìm kiếm đầu vào
Hiển thị mã
Hãy cẩn thận khi sử dụng chế độ solo miễn phí với các tùy chọn không phải chuỗi, vì nó có thể gây ra sự không khớp kiểu.
Giá trị được tạo ra bằng cách nhập vào hộp văn bản luôn là một chuỗi, bất kể loại tùy chọn nào.
Có thể tạo ra
Nếu bạn định sử dụng chế độ này cho hộp kết hợp như trải nghiệm (phiên bản nâng cao của phần tử chọn), chúng tôi khuyên bạn nên thiết lập:
selectOnFocusđể giúp người dùng xóa giá trị đã chọn.clearOnBlurđể giúp người dùng nhập giá trị mới.handleHomeEndKeysđể di chuyển tiêu điểm bên trong cửa sổ bật lên bằng phím Homevà End.- Một lựa chọn cuối cùng, ví dụ:
Add "YOUR SEARCH".
Bản demo solo miễn phí có kèm văn bản
Bản demo solo miễn phí có kèm văn bản
Hiển thị mã
Bạn cũng có thể hiển thị hộp thoại khi người dùng muốn thêm giá trị mới.
Đối thoại solo miễn phí
Đối thoại solo miễn phí
Hiển thị mã
Nhóm lại
Bạn có thể nhóm các tùy chọn với groupByprop. Nếu bạn làm như vậy, hãy đảm bảo rằng các tùy chọn cũng được sắp xếp theo cùng kích thước mà chúng được nhóm theo, nếu không, bạn sẽ thấy các tiêu đề trùng lặp.
Với các danh mục
Với các danh mục
Mở rộng mã
<Autocomplete
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" />}
/>
Nhấn Enterđể bắt đầu chỉnh sửa
Để kiểm soát cách các nhóm được hiển thị, hãy cung cấp một renderGroupprop tùy chỉnh. Đây là một hàm chấp nhận một đối tượng có hai trường:
group—một chuỗi đại diện cho tên nhómchildren—một tập hợp các mục danh sách thuộc về nhóm
Bản demo sau đây cho thấy cách sử dụng thuộc tính này để xác định đánh dấu tùy chỉnh và ghi đè lên kiểu của các nhóm mặc định:
Với các danh mục
Với các danh mục
Mở rộng mã
<Autocomplete
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" />}
renderGroup={(params) => (
<li key={params.key}>
<GroupHeader>{params.group}</GroupHeader>
<GroupItems>{params.children}</GroupItems>
</li>
)}
/>
Nhấn Enterđể bắt đầu chỉnh sửa
Tùy chọn bị vô hiệu hóa
Tùy chọn bị vô hiệu hóa
Tùy chọn bị vô hiệu hóa
Mở rộng mã
<Autocomplete
options={timeSlots}
getOptionDisabled={(option) =>
option === timeSlots[0] || option === timeSlots[2]
}
sx={{ width: 300 }}
renderInput={(params) => <TextField {...params} label="Disabled options" />}
/>
Nhấn Enterđể bắt đầu chỉnh sửa
useAutocomplete
Đ ối với các trường hợp sử dụng tùy chỉnh nâng cao, một useAutocomplete()hook không có đầu được hiển thị. Nó chấp nhận hầu như cùng các tùy chọn như thành phần Tự động hoàn thành trừ tất cả các thuộc tính liên quan đến việc hiển thị JSX. Thành phần Tự động hoàn thành được xây dựng trên hook này.
import { useAutocomplete } from '@mui/base/useAutocomplete';
Sao chép
Hook useAutocompletecũng được xuất lại từ @mui/material để thuận tiện và tương thích ngược.
import useAutocomplete from '@mui/material/useAutocomplete';
Sao chép
sử dụngTự động hoàn thành
Hiển thị mã
Móc tùy chỉnh
Móc tùy chỉnh
Bố già
Hiển thị mã
Hãy chuyển đến phần tùy chỉnh để xem ví dụ về Autocompletethành phần thay vì móc.
Yêu cầu không đồng bộ
Thành phần này hỗ trợ hai trường hợp sử dụng không đồng bộ khác nhau:
- Tải khi mở : chờ thành phần được tương tác để tải các tùy chọn.
- Tìm kiếm khi bạn nhập : một yêu cầu mới sẽ được thực hiện cho mỗi lần nhấn phím.
Tải về mở
Nó hiển thị trạng thái tiến trình miễn là yêu cầu mạng vẫn đang chờ xử lý.
Không đồng bộ
Không đồng bộ
Hiển thị mã
Tìm kiếm khi bạn nhập
Nếu logic của bạn là tìm nạp các tùy chọn mới trên mỗi lần nhấn phím và sử dụng giá trị hiện tại của hộp văn bản để lọc trên máy chủ, bạn có thể cân nhắc việc hạn chế các yêu cầu.
Ngoài ra, bạn sẽ cần phải vô hiệu hóa chức năng lọc tích hợp của Autocompletethành phần bằng cách ghi đè filterOptionsthuộc tính:
<Autocomplete filterOptions={(x) => x} />
Sao chép
Địa điểm Google Maps
Giao diện người dùng tùy chỉnh cho Google Maps Places Autocomplete. Đối với bản demo này, chúng ta cần tải Google Maps JavaScript và Google Places API.
Bản demo sau đây dựa trên autosuggest-highlight , một tiện ích nhỏ (1 kB) để làm nổi bật văn bản trong các thành phần autosuggest và autocomplete.
Thêm vị trí
Thêm vị trí
Hiển thị mã
Trước khi bạn có thể bắt đầu sử dụng Google Maps JavaScript API và Places API, bạn cần có khóa API của riêng mình .
Nhiều giá trị
Còn được gọi là thẻ, người dùng được phép nhập nhiều hơn một giá trị.
Nhiều giá trị
Sự khởi đầu
lọcChọnTùy chọn
Sự khởi đầu
lọcChọnTùy chọn
miễn phíSolo
Sự khởi đầu
Chỉ đọc
Forrest Gump
Sự khởi đầu
Chỉ đọc
Hiển thị mã