在 React 中的按键上应用按钮“活动”样式

IT技术 javascript css reactjs redux react-redux
2021-05-13 00:39:54

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

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

1个回答

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

对于每个按钮,您都需要一个 DOM 元素的“引用”(erence)。当您按下一个键并在您的 json 中找到它的代码时,您将访问对该按钮的相应引用并触发“focus”方法,以指示该按钮以某种方式被按下的 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();
   }
};

我希望它有帮助!

问候,马克斯。