我构建了一个简单组件,它只有一个文本输入,下面是一个列表(使用语义UI)。
现在,我想使用箭头键在列表中导航。
- 首先我必须选择第一个元素。但是我如何访问特定的列表元素呢?
- 其次,我会得到当前选中元素的信息,然后选择下一个元素。我如何得到哪个元素被选中的信息?
选择意味着将类active
添加到项目中,或者有更好的方法吗?
export default class Example extends Component {
constructor(props) {
super(props)
this.handleChange = this.handleChange.bind(this)
this.state = { result: [] }
}
handleChange(event) {
// arrow up/down button should select next/previous list element
}
render() {
return (
<Container>
<Input onChange={ this.handleChange }/>
<List>
{
result.map(i => {
return (
<List.Item key={ i._id } >
<span>{ i.title }</span>
</List.Item>
)
})
}
</List>
</Container>
)
}
}
5条答案
按热度按时间5sxhfpxr1#
试试这样的方法:
光标会跟踪你在列表中的位置,所以当用户按下向上或向下箭头键时,你会相应地减少/增加光标。光标应该与数组索引一致。
您可能希望使用
onKeyDown
而不是onChange
来查看箭头键,这样就不会延迟或扰乱标准输入编辑行为。在渲染循环中,您只需对照光标检查索引,看看哪个是活动的。
如果根据字段中的输入过滤结果集,则只要在过滤结果集时将光标重置为零,就可以始终保持行为一致。
l7wslrjt2#
被接受的答案对我来说非常有用,谢谢!我改编了这个解决方案,并制作了一个react hooks flavoured version,也许它会对某人有用:
将
useKeyPress
功能归属于此post。at0kjp5o3#
与@joshweir提供的解决方案几乎相同,但在Typescript中。此外,我使用了“ref”而不是“window”对象,并仅向输入文本框添加了事件侦听器。
ktecyv1j4#
这是我的尝试,缺点是它需要渲染的子对象正确传递
ref
:用法:
jmp7cifd5#
它是一个包含子元素的列表,可以通过按左右键和上下键来导航。
食谱。
1.创建一个对象数组,该数组将用作对数据使用map函数的列表。
1.创建一个useEffect并添加一个Eventlistener来侦听窗口中的按下键操作。
1.创建handleKeyDown函数,以便通过跟踪按下的键来配置导航行为,为此使用其键码。
密钥启动:例如,密钥代码=== 38
按键关闭:例如,按键代码=== 40
密钥权限:例如,密钥代码=== 39
按键左移:例如,按键代码=== 37
1.添加状态
令[活动主菜单,设置活动主菜单]=使用状态(-1);
令[活动子菜单,设置活动子菜单]=使用状态(-1);
1.通过对象数组的贴图进行渲染
在以下链接中找到上述解决方案:
https://codesandbox.io/s/nested-list-accessible-with-keys-9pm3i1?file=/src/App.js:2811-3796