reactjs - API 调用后在 React 中更新状态时遇到问题
问题描述
我正在尝试创建一个具有自动完成功能的文本框,该功能从 API 中提取建议,但在从 API 接收到数组后无法更新状态。我正在从这里修改代码:https ://blog.bitsrc.io/building-a-react-autocomplete-component-from-scratch-b78105324f4c
我想我必须使用 ComponentDidMount() 但我不确定如何将它应用于 onChange 函数。
class App extends React.Component {
render() {
return (
<div className="App">
<Autocomplete/>
</div>
);
}
}
class Autocomplete extends React.Component{
state = {
activeOption: 0,
filteredOptions: [],
showOptions: false,
userInput: ''
};
onChange = (e) => {
const userInput = e.currentTarget.value;
fetch("/places", {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(userInput)
}).
then(response => response.json())
.then(data => data.filter(element =>
element.PlaceName.toLowerCase().indexOf(userInput.toLowerCase()) > -1))
.then(filteredOptions => this.setState(
{
activeOption: 0,
filteredOptions: filteredOptions,
showOptions: true,
userInput: e.currentTarget.value
}));
};
.
.
.
.
render() {
const {
onChange,
onClick,
onKeyDown,
state: { activeOption, filteredOptions, showOptions, userInput }
} = this;
let optionList;
if (showOptions && userInput) {
console.log(filteredOptions)
if (filteredOptions.length) {
optionList = (
<ul className="options">
{filteredOptions.map((optionName, index) => {
let className;
if (index === activeOption) {
className = 'option-active';
}
return (
<li className={className} key={optionName} onClick={onClick}>
{optionName}
</li>
);
})}
</ul>
);
} else {
optionList = (
<div className="no-options">
<em>No Option!</em>
</div>
);
}
}
return (
<React.Fragment>
<div className="search">
<input
type="text"
className="search-box"
onChange={onChange}
onKeyDown={onKeyDown}
value={userInput}
/>
<input type="submit" value="" className="search-btn" />
</div>
{optionList}
</React.Fragment>
);
}
}
ReactDOM.render(<App />, document.querySelector("#app"));
一旦我尝试运行它,我会得到两个错误:一个是合成事件被重用于性能问题,另一个是组件更改受控输入
解决方案
您可以在 onChange 方法中放置一个 setTimeout。如果用户不输入,你就发出请求,否则你不能发出请求
推荐阅读
- scala - 为什么我的服务器没有在 Play 2.6.x 中请求客户端证书?
- .net - File.ReadAllLines() 无法从 Excel 打开的文件中读取
- php - API 返回 json 数组对象,其中包含点、空格和 % 的键。如何从数组中重命名或删除键?
- javascript - 根据点击获得“顶部”和“右侧”位置
- intellij-idea - 在 PhpStorm 中重命名文件而不重构?
- r - 使 ggplot 的条形文本延伸到轴文本上
- node.js - 使用 sequelize 比较查询中的当前年份和月份
- python - 如何检测从未使用过的声明变量?
- json - 自定义设备操作不会在带有嵌入式助手的树莓派上运行
- laravel - 部署程序作曲家异常 - 如何调试?