我正在使用这个wavesurfer.js
包与React来显示音频的波形。我想在他们的docs中使用这个getCurrentTime()
方法来显示当前的运行时间,并在github上回答。
我得到了以秒为单位的运行时间,并更新了我的React状态以显示它。然而,它更新得非常频繁,每秒超过10次,这会触发我的组件多次重新渲染。我想知道是否有一种方法可以让它只在每秒钟通过时触发状态更改?
export function Component(){
const [currentTime, setCurrentTime] = useState(0)
const wavesurferRef = useRef<any>(null)
useEffect(()=>{
if (wavesurferRef.current){
wavesurferRef.current.on('audioprocess', function () {
//ISSUE: THIS MAKE COMPONENT RE-RENDERING TOO MANY TIME
setCurrentTime(wavesurferRef.current.getCurrentTime())
})
}
},[])
return(
<div ref={wavesurferRef}>
</div>
)
}
3条答案
按热度按时间vpfxa7rd1#
我可能会建议你使用
useRef
和一个DOM节点以及类似requestAnimationFrame的东西来更新文本。这里有一个最小的,可验证的例子。运行下面的程序,注意只有当你点击按钮并更新状态时才会发生渲染。时间戳是使用动画而不是状态转换来更新的-e4yzc0pl2#
一般的答案是你不需要在每个事件上调用
setCurrentTime
。更实际的是,你可以使用一些自定义逻辑来定义要跳过哪些事件。或者你可以使用通用的帮助函数来这样做。如果你希望你的函数被调用的频率不超过每N毫秒,那么就调用
throttle
。你可以使用lodash或其他实用程序库来实现这一点https://lodash.com/docs/4.17.15#throttle
示例https://laracasts.com/series/build-modern-laravel-apps-using-inertia-js/episodes/22
cx6n0qe33#
因为在我的应用程序中,我只需要以秒为单位的值,所以我使用这个简单的方法来
Math.floor
值和setState()
,因为setState
只在值不同时才改变状态,因此,组件将每秒钟重新渲染一次。