【问题标题】:Scroll with keyboard's up/down arrows keys in React?在 React 中使用键盘的向上/向下箭头键滚动?
【发布时间】:2023-08-03 15:24:02
【问题描述】:

我有一个自定义列表框,div,其中包含其他 div 子项的垂直列表。我想添加一个向上/向下箭头键导航来更改当前选择的孩子。

因此,当我单击第一项并按down arrow key 时,它应该允许我选择第二项(以下项)。如果我点击up arrow key,它应该选择回第一项(上一项)。

const renderInboxSummary = targetDetailsData.map((todo, index) => {
  const hasNewMessageInd = todo.hasNewMessageInd;
  return (
   <div onClick={() => this.handleClick(targetDetailsData, todo.aprReference, index)}>
      <div>
        {todo.aprRecordUserName}
      </div>
      <div>
        {todo.aprBranchCode}
      </div>
      <div>
        {todo.aprScreeName}
      </div>
  </div>
  );
});

每个div 都有一个点击事件处理程序this.handleClick(targetDetailsData, todo.aprReference, index)

【问题讨论】:

    标签: javascript reactjs keyboard-events


    【解决方案1】:

    这可以通过在 ReactJS 中使用 ref 来完成,然后为 keydown 事件添加一个事件侦听器,然后将焦点移动到下一个或上一个兄弟节点。

    注意事项

    • 我将tabindex 属性添加到每个 div 以使它们能够被关注
    • 我在包装元素上使用ref 来监听keydown
    • 我检查 keycode 是否向上/向下移动到下一个/上一个兄弟姐妹
    • 我相信在全尺寸键盘上用于向上/向下的 keycode 是不同的,但我没有要测试的。

    解决方案

    要测试演示,请单击任何 div,然后使用向上/向下箭头

    const { Component } = React;
    
    class App extends Component {
      constructor(props) {
        super(props);
        this.myRef = React.createRef();
      }
      componentDidMount() {
        this.moveFocus();
      }
      moveFocus() {
        const node = this.myRef.current;
        node.addEventListener('keydown', function(e) {
          const active = document.activeElement;
          if(e.keyCode === 40 && active.nextSibling) {
            active.nextSibling.focus();
          }
          if(e.keyCode === 38 && active.previousSibling) {
            active.previousSibling.focus();
          }
        });
      }
      render() {
        return (
          <div ref={this.myRef}>
            <div tabindex="0">First</div>
            <div tabindex="1">Second</div>
            <div tabindex="2">Third</div>
          </div>
        )
      }
    }
    
    ReactDOM.render(<App />, document.getElementById('root'));
    div:focus {
      color: red;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
    <div id="root"></div>

    文档

    https://reactjs.org/docs/refs-and-the-dom.html

    https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex

    【讨论】:

    • @skarakas 如果对您有帮助,请务必接受答案。
    • 工作,谢谢!现在我只需要将焦点从输入字段转移到我的 div。