【问题标题】:Export function/method from react use effect / hook从 react 使用效果/钩子导出函数/方法
【发布时间】:2020-01-07 00:21:04
【问题描述】:

我的项目之一是 wavesurfer 的这个实例。 这会动态显示各种音频文件。 我在我想要播放和暂停按钮来触发 Wave surfer 的页面上呈现这个。

我不太明白如何传递这些函数?

它们在代码中被标记。

提前致谢!

export default function FiddleDisplay({ audioFileUrl }) {
  const waveformRef = React.useRef();
  React.useEffect(() => {
    if (waveformRef.current) {
      const activeWaveColor = '#f5f5f5';
      const playedWaveColor = '#707070';
      const wavesurfer = WaveSurfer.create({
        container: waveformRef.current,
        barWidth: 5,
        cursorWidth: 2,
        waveColor: activeWaveColor,
        progressColor: playedWaveColor,
        hideScrollbar: true,
        autoCenter: false,
        responsive: true,
        width: 100,
        barHeight: 9,
        height: 350,
        interact: true,
        maxCanvasWidth: 2000,
        fillParent: true
      });
      wavesurfer.load(`${audioFileUrl}`);
      wavesurfer.play(); //USE THIS IN OTHER COMPONENT
      wavesurfer.pause(); //USE THIS IN OTHER COMPONENT
    }
  }, []);
  return (
    <>
      <Waveform ref={waveformRef} />
    </>
  );
}

【问题讨论】:

  • 使用useState 存储对实例的引用并将其(或其方法的绑定副本)传递到链中。

标签: javascript reactjs wavesurfer.js


【解决方案1】:

您需要使用 useState 存储对实例的引用,并将相关的绑定方法附加到按钮:

export default function FiddleDisplay({
  audioFileUrl,
}) {
  const waveformRef = React.useRef();
  const [waveSurfer, setWaveSurfer] = React.useState();
  React.useEffect(() => {
    if (waveformRef.current) {
      const activeWaveColor = '#f5f5f5';
      const playedWaveColor = '#707070';
      const wavesurfer = WaveSurfer.create({
        container: waveformRef.current,
        barWidth: 5,
        cursorWidth: 2,
        waveColor: activeWaveColor,
        progressColor: playedWaveColor,
        hideScrollbar: true,
        autoCenter: false,
        responsive: true,
        width: 100,
        barHeight: 9,
        height: 350,
        interact: true,
        maxCanvasWidth: 2000,
        fillParent: true
      });
      wavesurfer.load(`${audioFileUrl}`);
      setWaveSurfer(wavesurfer);
    }
  }, []);

  const play = waveSurfer && waveSurfer.play.bind(waveSurfer);
  const pause = waveSurfer && waveSurfer.pause.bind(waveSurfer);
  return (
    <>
      <Waveform ref={waveformRef} />
      <Button onClick={play}>Play</Button>
      <Button onClick={pause}>Pause</Button>
    </>
  );
}

如果你想在其他地方渲染按钮,你需要从父函数传入一个 setter,然后把绑定的方法传回来。

【讨论】:

  • 非常感谢您!这对我来说有点先进。我真的不知道如何进行。如何将此添加到我的按钮的 onClick 中。我收到一条消息,显示此函数的 useEffect 缺少依赖项 setPlayPause。我的浏览器也说 setPlayPause 不是一个函数。我猜这有点巧合?
  • @SaschaRissling 我更新了一个更基本的解决方案。如果你想在其他地方渲染按钮,你必须创建一个 setter 并通过 props 将它传递给 FiddleDisplay,但如果你对 FiddleDisplay 渲染它自己的按钮没问题,这应该可以工作。
  • 贾里德非常感谢。我在您的出色帮助下成功了。请有美好的一天
  • @SaschaRissling 你也是!
  • jared smith 你认为可以看看我关于这个的另一个问题吗?我解决不了。提前致谢。没有多少人调查 wavesurfer 反应问题stackoverflow.com/questions/59734627/…
猜你喜欢
  • 2020-01-14
  • 2020-08-15
  • 2020-06-24
  • 2021-06-12
  • 2023-02-11
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多