Я написал пользовательский обработчик React useAudio
для воспроизведения звуков на заднем плане моего приложения.
Почему useEffect
бросает Uncaught (in promise) DOMException
?
Я сузил проблему до второй useEffect
внутри моего пользовательского хука. Этот эффект запускается, когда изменяется логическое значение, указывающее, является ли звук playing
.
Все, что говорит Реакт, это Uncaught Error: The error you provided does not contain a stack trace.
Я также пытался изменить audio
на обычную константу вместо объявления через хук useState
, но это не помогло.
import React, { useState, useEffect } from 'react'
import styled from 'styled-components'
const useAudio = (url: string) => {
if (typeof Audio !== 'undefined') {
const [audio] = useState(new Audio(url))
const [playing, setPlaying] = useState(false)
const toggle = () => setPlaying(!playing)
useEffect(() => {
audio.loop = true
audio.autoplay = true
})
useEffect(() => {
playing ? audio.play() : audio.pause()
return () => {
audio.pause()
}
}, [playing])
return [playing, toggle]
}
}
const AudioPlayer: React.FC<{ url: string }> = ({ url }) => {
if (typeof Audio !== 'undefined') {
const [playing, toggle] = useAudio(url)
return (
<AudioContainer>
{typeof playing !== 'undefined' && (
<Button onClick={() => toggle()}>
{playing ? 'Stop music' : 'Play music'}
</Button>
)}
</AudioContainer>
)
}
return null
}
export default AudioPlayer
Работает в приложении live .
это не , работающее в этой изолированной Codesandbox .
Я ожидаю, что звук запустится, когда компонент смонтирован, и не будет выдано никаких исключений DOME.