【问题标题】:react js how to prevent arrow keys from switching controlsreact js如何防止方向键切换控件
【发布时间】:2019-02-03 12:02:22
【问题描述】:

我正在开发基于浏览器的反应游戏,玩家可以选择一个单位放置在战场上,然后他可以使用箭头键在地图上移动该单位。

问题是单位列表是一个反应单选组,按下箭头键也会将焦点从一个单选按钮切换到下一个单选按钮,这会导致通过相同的操作选择不同的单元应该(并且确实)移动了初始单元,所以整个事情变得非常混乱。

我使用绑定到componentDidMount 方法的事件监听器来绑定箭头键来移动单元。

componentDidMount(){
  ...
  document.addEventListener("keydown", this.handleKeyDown.bind(this));
  document.addEventListener("keyup", this.handleKeyUp.bind(this));

虽然可能有多种方法可以解决此问题,但我更愿意简单地使用箭头键禁用单选按钮的切换。有谁知道如何关闭它?

我找到了this article,但大部分时间都超出了我的想象,而且我仍然希望有更简单的方法来做到这一点。

【问题讨论】:

    标签: javascript reactjs user-interface controls key-bindings


    【解决方案1】:

    React suggest to use preventDefault statement 而不是使用 return false:

    handleKeyDown = (e) => {
     //... rest of your code
     e.preventDefault()
    }
    

    另外,您不需要在 componentDidMount 挂钩内绑定 addEventListener。该事件将从组件的event binding 调用。

    例子:

    <YourComponent onKeyDown={this.handleKeyDown} onKeyUp={this.handleKeyUp} />
    

    【讨论】:

    • 文档在哪里提到?你能指点我吗?
    • 链接到帖子。
    • 我明白了...... 另一个区别是你不能返回 false 来阻止 React 中的默认行为。您必须显式调用 preventDefault。
    • 谢谢@BhojendraRauniyar - 这行得通!关于您的建议onKeyDown vs addEventListener:在我的情况下,onKey 事件操纵变量(单位位置),这些变量在正在呈现的页面中是本地的,并且当前在调用页面实例的更高级别上不可用.因此,根据您的建议,onKey 函数也无法在更高级别附加到 onKey 属性。我试图将 onKey 添加到页面的最外层组件(&lt;div&gt;),但这没有任何效果。有什么建议吗?
    • 使用this.props.onKey在子组件中调用外层组件onKey事件...
    猜你喜欢
    • 2023-03-27
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多