在用户输入后加载 Material UI 自动完成建议
Load Material UI AutoComplete suggestions after user input
我有一个自动完成组件,需要加载海量数据列表(最多 6000 个元素)并根据用户的输入显示相应的建议。
由于数据选项有很多元素,每当用户开始在一台速度较慢的计算机上打字时,它的速度就会变慢,并且需要一些时间来加载所有内容。我必须阻止它,所以我想到了在用户输入第三个字符后显示用户建议的想法。每当用户点击输入框时,它甚至会给我这个错误:
Warning: React instrumentation encountered an error: RangeError: Maximum call stack size exceeded console.
我需要在输入第三个字符后显示建议。我尝试使用 getOptionDisabled suggestion 和 limitTags,但它们没有用。
代码如下:
const NameSelect = (props) => {
return (
<Dialog>
<React.Fragment>
<DialogTitle id="search-name-dialog-title">
Search name
</DialogTitle>
<DialogContent>
<Autocomplete
id="combo-box-client-select"
options={props.NameList}
value={props.preSelectedName}
getOptionLabel={(option) =>
option.Name_name +
", " +
option.country +
", " +
option.city
}
onChange={(object, value) => {
props.preSelectedNameSet(value);
}}
renderInput={(params) => (
<TextField
{...params}
label="Search name"
variant="outlined"
fullWidth
/>
)}
/>
.
.
.
</Dialog>
);
};
有人可以帮我解决这个问题,或者推荐一个更好的方法吗?谢谢!
尝试这样的事情:
<Autocomplete
inputValue={inputValue}
onInputChange={(e) => setinputValue(event.target.value)}
id="combo-box-demo"
options={values}
getOptionLabel={(option) => option}
style={{ width: 300 }}
renderInput={(params) => (
<TextField {...params} label="Combo box" variant="outlined" />
)}
open={inputValue.length > 2}
/>
使用 InputValue
道具触发自动完成下拉。
示例:auto complete dropdown
我的想法是为自动完成当前值添加一个状态以监视其autoComplete
属性。该状态将如下所示:
const [currentValue, useCurrentValue] = useState(props.preSelectedName);
这样您的组件将如下所示:
<Autocomplete
autoComplete={currentValue.length >= 3 ? true : false}
onChange={useCurrentValue}
...your other properties
/>
另一个想法:您可能想在 onChange
方法中使用 setTimeout
来减慢重新渲染的速度。但是在设置它们之前不要忘记clearTimeout
。
您需要的功能称为“去抖动”,只要耗时的任务频繁发生,就会使用它。在您的情况下,每次您键入密钥时,都会计算建议,这肯定会导致滞后。
Lodash 的 debounce
函数将为您实现。
据我所知,我不确定您是否可以使用 MUI 自动完成来实现这一点,但是您可以使用自定义解决方案来执行以下操作:-
import React, { useState, useCallback } from "react";
import { _ } from "lodash";
function AutoComplete() {
const [input, setInput] = useState("");
const [suggestions, setSuggestions] = useState([]);
const updateInput = (input) => {
setInput(input);
/*_.debounce will fire the setSuggestions
and fetchSuggestions only after a gap of 3000ms */
_.debounce((input) => setSuggestions(fetchSuggestions(input), 3000));
};
return (
<div>
<input
value={input}
class="input"
onChange={(event) => updateInput(event.target.value)}
/>
<div class="suggestions">
<ul>
{suggestions?.length > 0 &&
suggestions?.map((val, idx) => (
<li class="suggestion" key={idx}>
{val}
</li>
))}
</ul>
</div>
</div>
);
}
export default AutoComplete;
您可以使用适当的样式和 materialize.css 设置组件的样式,以便获得 MUI 自动完成组件的功能副本。
我有一个自动完成组件,需要加载海量数据列表(最多 6000 个元素)并根据用户的输入显示相应的建议。
由于数据选项有很多元素,每当用户开始在一台速度较慢的计算机上打字时,它的速度就会变慢,并且需要一些时间来加载所有内容。我必须阻止它,所以我想到了在用户输入第三个字符后显示用户建议的想法。每当用户点击输入框时,它甚至会给我这个错误:
Warning: React instrumentation encountered an error: RangeError: Maximum call stack size exceeded console.
我需要在输入第三个字符后显示建议。我尝试使用 getOptionDisabled suggestion 和 limitTags,但它们没有用。
代码如下:
const NameSelect = (props) => {
return (
<Dialog>
<React.Fragment>
<DialogTitle id="search-name-dialog-title">
Search name
</DialogTitle>
<DialogContent>
<Autocomplete
id="combo-box-client-select"
options={props.NameList}
value={props.preSelectedName}
getOptionLabel={(option) =>
option.Name_name +
", " +
option.country +
", " +
option.city
}
onChange={(object, value) => {
props.preSelectedNameSet(value);
}}
renderInput={(params) => (
<TextField
{...params}
label="Search name"
variant="outlined"
fullWidth
/>
)}
/>
.
.
.
</Dialog>
);
};
有人可以帮我解决这个问题,或者推荐一个更好的方法吗?谢谢!
尝试这样的事情:
<Autocomplete
inputValue={inputValue}
onInputChange={(e) => setinputValue(event.target.value)}
id="combo-box-demo"
options={values}
getOptionLabel={(option) => option}
style={{ width: 300 }}
renderInput={(params) => (
<TextField {...params} label="Combo box" variant="outlined" />
)}
open={inputValue.length > 2}
/>
使用 InputValue
道具触发自动完成下拉。
示例:auto complete dropdown
我的想法是为自动完成当前值添加一个状态以监视其autoComplete
属性。该状态将如下所示:
const [currentValue, useCurrentValue] = useState(props.preSelectedName);
这样您的组件将如下所示:
<Autocomplete
autoComplete={currentValue.length >= 3 ? true : false}
onChange={useCurrentValue}
...your other properties
/>
另一个想法:您可能想在 onChange
方法中使用 setTimeout
来减慢重新渲染的速度。但是在设置它们之前不要忘记clearTimeout
。
您需要的功能称为“去抖动”,只要耗时的任务频繁发生,就会使用它。在您的情况下,每次您键入密钥时,都会计算建议,这肯定会导致滞后。
Lodash 的 debounce
函数将为您实现。
据我所知,我不确定您是否可以使用 MUI 自动完成来实现这一点,但是您可以使用自定义解决方案来执行以下操作:-
import React, { useState, useCallback } from "react";
import { _ } from "lodash";
function AutoComplete() {
const [input, setInput] = useState("");
const [suggestions, setSuggestions] = useState([]);
const updateInput = (input) => {
setInput(input);
/*_.debounce will fire the setSuggestions
and fetchSuggestions only after a gap of 3000ms */
_.debounce((input) => setSuggestions(fetchSuggestions(input), 3000));
};
return (
<div>
<input
value={input}
class="input"
onChange={(event) => updateInput(event.target.value)}
/>
<div class="suggestions">
<ul>
{suggestions?.length > 0 &&
suggestions?.map((val, idx) => (
<li class="suggestion" key={idx}>
{val}
</li>
))}
</ul>
</div>
</div>
);
}
export default AutoComplete;
您可以使用适当的样式和 materialize.css 设置组件的样式,以便获得 MUI 自动完成组件的功能副本。