我已经构建了一个简单的组件,其中包含单个文本输入,下面是一个列表(使用语义 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>
)
}
}
尝试这样的事情:
export default class Example extends Component {
constructor(props) {
super(props)
this.handleKeyDown = this.handleKeyDown.bind(this)
this.state = {
cursor: 0,
result: []
}
}
handleKeyDown(e) {
const { cursor, result } = this.state
// arrow up/down button should select next/previous list element
if (e.keyCode === 38 && cursor > 0) {
this.setState( prevState => ({
cursor: prevState.cursor - 1
}))
} else if (e.keyCode === 40 && cursor < result.length - 1) {
this.setState( prevState => ({
cursor: prevState.cursor + 1
}))
}
}
render() {
const { cursor } = this.state
return (
<Container>
<Input onKeyDown={ this.handleKeyDown }/>
<List>
{
result.map((item, i) => (
<List.Item
key={ item._id }
className={cursor === i ? 'active' : null}
>
<span>{ item.title }</span>
</List.Item>
))
}
</List>
</Container>
)
}
}
光标会跟踪您在列表中的位置,因此当用户按下向上或向下箭头键时,您会相应地减少/增加光标。光标应与数组索引一致。
你可能想要onKeyDown
观看箭头键而不是onChange
,这样您的标准输入编辑行为就不会出现延迟或混乱。
在渲染循环中,您只需对照光标检查索引即可查看哪个索引处于活动状态。
如果您根据字段的输入来过滤结果集,则只要在过滤结果集时将光标重置为零即可,这样您就可以始终保持行为一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)