作为一种学习手段,我正在尝试构建自动完成功能。我正在关注以下示例:
https://codesandbox.io/s/8lyp733pj0。
我看到此解决方案有两个问题:
1。)与鼠标悬停和击键冲突。如果我使用键盘导航列表,则活动项目将突出显示,并且如果我同时使用鼠标,则另一个项目将突出显示。这样会产生2个突出显示的字段。
2。)如果我通过按Enter选择一个项目,它将用所选文本填充输入字段,但是如果我再次按Enter,它将将该文本更改为我相信的索引0项目。
有人可以帮助我了解如何解决这些问题。我曾尝试将鼠标悬停并专注于CSS,但仍无法达到预期的结果。
我的方法(不确定这是否正确):
感谢您的帮助-我花了一些时间来了解React的状态概念。
答案 0 :(得分:1)
onKeyDown
函数可以正确更新activeSuggestion
的值。我不建议您在看不到activeSuggestion时在选择中添加滚动。activeSuggestion
函数更新onMouseEnter
的值。.suggestions li:hover
。 只有带有.suggestion-active
的元素必须具有活动样式。不是徘徊的。这个想法是onMouseEnter
必须更新activeSuggestion
的值。
// Autocomplete.jsx
//in line 84, after function onKeyDown, add:
onMouseEnter = e => {
try {
e.persist();
const currentIndex = parseInt(e.target.dataset.index, 10);
this.setState({ activeSuggestion: currentIndex });
} catch (reason) {
console.error(reason);
}
}
// then, create const onMouseEnter after the render() method:
render() {
const {
onChange,
onClick,
onKeyDown,
onMouseEnter,
state: {
activeSuggestion,
filteredSuggestions,
showSuggestions,
userInput
}
} = this;
// In the li nodes (line 123), add props onMouseEnter and data-index:
<li
className={className}
key={suggestion}
onClick={onClick}
onMouseEnter={onMouseEnter}
data-index={index}
>
{suggestion}
</li>
.suggestions li:hover
。希望有帮助。