javascript - 在 React 的按键上应用按钮 'Active' 样式

标签 javascript css reactjs redux react-redux

我在 React/Redux 中有一个鼓应用程序,它目前功能齐全,但我希望能够在按下相应按键时应用事件按钮样式,就像我实际单击按钮时一样。就目前而言,单击按钮会进行转换,但键入相应的键只会播放音频文件,并没有真正链接到按钮。有没有办法在按键时将相应的按钮标记为事件状态?

这是我的 CodeSandbox:https://codesandbox.io/s/k29r3928z7

最佳答案

这是一个完美的用例 ref (如文档所述,请勿滥用它)。

对于每个按钮,您都需要一个指向 DOM 元素的“ref”(erence)。当您按下一个键并在您的 json 中找到它的代码时,您将访问对按钮的相应引用并触发“焦点”方法,以向 UI 指示按钮以某种方式被按下。

您的按钮定义应如下所示:

{drumObj.map(x => (
      <button
        className="drum-pad"
        ref={"drumButton" + x.trigger}
        key={x.id}
        id={x.id}
        onClick={() => drumHit(x.url, x.id)}
      > ...

我们为每个按钮动态设置一个ref名称(尝试找到一种方法在你的组件中定义一个唯一的ref名称前缀并且只在一个地方定义它),基于它所代表的字符。一旦我们存储了引用,我们就可以根据需要在 handleKeyPress 方法中访问它们,如下所示:

handleKeyPress = event => {
   const drumKey = drumObj.find(obj => obj.keyCode === event.keyCode);

   if (drumKey) {
     this.refs["drumButton" + drumKey.trigger].focus();
     this.props.drumHit(drumKey.url, drumKey.id);
   }
};

我实际上会替换对 this.props.drumHit(...) 的调用:

this.refs["drumButton" + drumKey.trigger].click();

这样做的原因是,如果您将来更改 drumHit 方法名称或签名,您只需在按钮属性定义的 onClick 属性中更新它。作为一种好的做法,请始终尝试以编程方式模拟此类事件,而不是在代码的不同部分复制相同的行为。

因此您的handleKeyPress 方法应该如下所示:

handleKeyPress = event => {
   const drumKey = drumObj.find(obj => obj.keyCode === event.keyCode);

   if (drumKey) {
     this.refs["drumButton" + drumKey.trigger].click();
     this.refs["drumButton" + drumKey.trigger].focus();
   }
};

希望对您有所帮助!

问候, 最大。

关于javascript - 在 React 的按键上应用按钮 'Active' 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51413364/

相关文章:

reactjs - 使用 REQUIRED_CHILDREN 配置时中继乐观响应

javascript - 阻止记住密码

html - 带有 z-index 的图像中心

css - Bootstrap 居中

javascript - 当屏幕较小时,如何将单选按钮组控件更改为垂直?

android - React Native 获取调用在 iOS 中工作,但在 Android 中不工作

javascript - 在 ReactJS 中检查数组是否有数据或为空时遇到问题

javascript - 为 Angular 动态数据生成嵌套结构

javascript - 相当于 hasAttribute() 的 AngularJS?

javascript - Draft JS Modifier.ReplaceText 撤消/重做错误