javascript - audio.play 不是使用 ref 的箭头函数组件的函数错误

标签 javascript reactjs

我正在从事 freeCodeCamp 鼓机项目。当用户点击鼓垫时,我想要播放声音。由于 audio 元素不是真正的 DOM 元素而是它的一个副本,要引用它我需要使用 ref(或者至少我认为这就是原因)。

我按照 React 文档说明在函数组件中使用 ref,并且我有一个方法 handleClick 当您单击我想调用的“鼓垫”时触发该方法 audio.play()。但是,当我单击其中一个鼓垫时,应用程序崩溃并显示错误“audio.play 不是一个函数”。裁判有问题吗?任何建议表示赞赏。

子组件 DrumPad.js:

const DrumPad = ({ id, letter, src }) => {

  let audio = React.createRef(); // <--

  const handleClick = () => { // <--
    audio.play();
  }

  return (
    <div
      className="drum-pad"
      id={id}
      onClick={handleClick}
    >
      <p>{letter}</p>
      <audio
        ref={audio} // <--
        id={letter}
        src={src}
      >
      </audio>
    </div>
  );
}

父 App.js:

const sounds = [
  { id: 'snare', letter: 'Q', src: 'https://www.myinstants.com/media/sounds/snare.mp3' },
  // etc.
];

const App = () => {

  return (
    <div className="drum-machine">
      <div className="drum-pads">
        {sounds.map(sound => (
          <DrumPad
            id={sound.id}
            letter={sound.letter}
            src={sound.src}
          />
        ))}
      </div>
    </div>
  );
}

最佳答案

DOM 节点实际上存储在 current 键下。

这应该可以解决您的问题:

const handleClick = () => { 
    audio.current.play();
}

React docs about createRef

关于javascript - audio.play 不是使用 ref 的箭头函数组件的函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58057737/

相关文章:

javascript - 声明具有相对于其他字段的默认值的主干模型

javascript - 删除输出中的 %20

javascript - MongoDB 减少单值键

javascript - 使用javascript根据值改变颜色

reactjs - React Hooks - 带有钩子(Hook)的功能组件中 ScrollView 的引用?

javascript - 如何将外部 JSON 文件读入我的 html/javascript 测验

javascript - 在 Protractor 中设置页面对象

reactjs - 在选择器中访问 react 路由器状态

reactjs - React 自定义 Hook 使用 useRef 在第一次调用组件加载时返回 null?

reactjs - 在 typescript 中将 useState 作为 props 传递